基於python中jieba包的中文分詞中詳細使用

爲了教別人jieba庫的使用,順便自己把這個整理一下,記錄下來,省的之後使用又來找資料

jieba:中文分詞比較好,但是英文分詞就用其他的

3種分詞模式:

精確模式,將句子精確地切開,不存在冗餘,適合文本分析;
全模式,把句子中所有的可以成詞的詞語都掃描出來,速度非常快,但是不能解決歧義,有冗餘;
搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於引擎分詞

jieba.lcut(s)  精確模式,返回一個列表類型的分詞結果

>>>jieba.lcut("中國是一個偉大的國家")['中國', '是', '一個', '偉大', '的', '國家']

jieba.lcut(s,cut_all=True)全模式,返回一個列表類型的分詞結果,存在冗餘

>>>jieba.lcut("中國是一個偉大的國家",cut_all=True)['中國', '國是', '一個', '偉大', '的', '國家']

jieba.lcut_for_search(s)搜索引擎模式,返回一個列表類型的分詞結果,存在冗餘

>>>jieba.lcut_for_search(“中華人民共和國是偉大的")['中華', '華人', '人民', '共和', '共和國', '中華人民共和國', '是', '偉大', '的']

jieba.add_word(w)向分詞詞典增加新詞w>>>jieba.add_word("蟒蛇語言")

jieba.del_word('自定義詞')

 

#導入詞性標註的包
import jieba.posseg as pseg
test_sent = (
"李小福是創新辦主任也是雲計算方面的專家; 什麼是八一雙鹿\n"
"例如我輸入一個帶“韓玉賞鑑”的標題,在自定義詞庫中也增加了此詞爲N類\n"
"「臺中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)
result = pseg.cut(test_sent)
for w in result:
    print(w.word, "/", w.flag, ", ", end=' ')

 李小福 / nr , 是 / v , 創新辦 / i , 主任 / b , 也 / d , 是 / v , 雲計算 / x , 方面 / n , 的 / uj , 專家 / n , ; / x , / x , 什麼 / r , 是 / v , 八一雙鹿 / nz , / x , 例如 / v , 我 / r , 輸入 / v , 一個 / m , 帶 / v , “ / x , 韓玉賞鑑 / nz , ” / x , 的 / uj , 標題 / n , , / x , 在 / p , 自定義 / l , 詞庫 / n , 中 / f , 也 / d , 增加 / v , 了 / ul , 此 / r , 詞 / n , 爲 / p , N / eng , 類 / q , / x , 「 / x , 臺中 / s , 」 / x , 正確 / ad , 應該 / v , 不 / d , 會 / v , 被 / p , 切開 / ad , 。 / x , mac / eng , 上 / f , 可 / v , 分出 / v , 「 / x , 石墨烯 / x , 」 / x , ; / x , 此時 / c , 又 / d , 可以 / c , 分出 / v , 來 / zg , 凱特琳 / nz , 了 / ul , 。 / x ,
 

# test frequency tune 
testlist = [ ('今天天氣不錯', ('今天', '天氣')), ('如果放到post中將出錯。', ('中', '將')), ('我們中出了一個叛徒', ('中', '出')), ] 
for sent, seg in testlist: 
    print('/'.join(jieba.cut(sent, HMM=False))) 
    word = ''.join(seg) 
    print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word),jieba.suggest_freq(seg, True))) 
    print('/'.join(jieba.cut(sent, HMM=False))) 
    print("-"*40)

 今天天氣/不錯

今天天氣 Before: 3, After: 0

今天/天氣/不錯

----------------------------------------

如果/放到/post/中將/出錯/。

中將 Before: 763, After: 494

如果/放到/post/中/將/出錯/。

----------------------------------------

我們/中/出/了/一個/叛徒

中出 Before: 3, After: 3

我們/中/出/了/一個/叛徒
---------------------

 

 

文章目錄

 

基於python中jieba包的中文分詞中詳細使用(二)

01.前言

基於python中jieba包的中文分詞中詳細使用(一)已經介紹了jieba分詞的一些基本內容,現在接着去介紹。

02.關鍵詞提取

02.01基於TF-IDF算法的關鍵詞提取

import jieba.analyse
  • 1
  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False,
    allowPOS=())
    其中需要說明的是:
    1.sentence 爲待提取的文本
    2.topK 爲返回幾個 TF/IDF 權重最大的關鍵詞,默認值爲 20
    3.withWeight 爲是否一併返回關鍵詞權重值,默認值爲 False
    4.allowPOS 僅包括指定詞性的詞,默認值爲空,即不篩選
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 實例,idf_path 爲 IDF 頻率文件

代碼示例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-05-05 22:15:13
# @Author  : JackPI ([email protected])
# @Link    : https://blog.csdn.net/meiqi0538
# @Version : $Id$
import jieba
import jieba.analyse
#讀取文件,返回一個字符串,使用utf-8編碼方式讀取,該文檔位於此python同以及目錄下
content  = open('人民的名義.txt','r',encoding='utf-8').read()
tags = jieba.analyse.extract_tags(content,topK=10) 
print(",".join(tags))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

運行結果

Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.280 seconds.
Prefix dict has been built succesfully.
侯亮,李達康,高育良,祁同偉,高小琴,瑞金,陳海,老師,丁義珍,成功
[Finished in 5.9s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫可以切換成自定義語料庫的路徑

  • 用法: jieba.analyse.set_idf_path(file_name) # file_name爲自定義語料庫的路徑
  • 自定義語料庫示例
    勞動防護 13.900677652 勞動防護 13.900677652 生化學 13.900677652 生化學 13.900677652 奧薩貝爾 13.900677652 奧薩貝爾 13.900677652 考察隊員 13.900677652 考察隊員 13.900677652 崗上 11.5027823792 崗上 11.5027823792 倒車檔 12.2912397395 倒車檔 12.2912397395 編譯 9.21854642485 編譯 9.21854642485 蝶泳 11.1926274509 外委 11.8212361103
  • 用法示例
import jieba
import jieba.analyse
#讀取文件,返回一個字符串,使用utf-8編碼方式讀取,該文檔位於此python同以及目錄下
content  = open('idf.txt.big','r',encoding='utf-8').read()
tags = jieba.analyse.extract_tags(content, topK=10)
print(",".join(tags))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.186 seconds.
Prefix dict has been built succesfully.
13.2075304714,13.900677652,12.8020653633,12.5143832909,12.2912397395,12.1089181827,11.9547675029,11.8212361103,11.7034530746,11.598092559
[Finished in 20.9s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

關鍵詞提取所使用停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑

  • 用法: jieba.analyse.set_stop_words(file_name) # file_name爲自定義語料庫的路徑
  • 自定義語料庫示例:
!
"
#
$
%
&
'
(
)
*
+
,
-
--
.
..
...
......
...................
./
.一
記者
數
年
月
日
時
分
秒
/
//
0
1
2
3
4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 用法示例
import jieba
import jieba.analyse
#讀取文件,返回一個字符串,使用utf-8編碼方式讀取,該文檔位於此python同以及目錄下
content  = open(u'人民的名義.txt','r',encoding='utf-8').read()
jieba.analyse.set_stop_words("stopwords.txt")
tags = jieba.analyse.extract_tags(content, topK=10)
print(",".join(tags))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.316 seconds.
Prefix dict has been built succesfully.
侯亮,李達康,高育良,祁同偉,高小琴,瑞金,陳海,老師,丁義珍,成功
[Finished in 5.2s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

關鍵詞一併返回關鍵詞權重值示例

import jieba
import jieba.analyse
#讀取文件,返回一個字符串,使用utf-8編碼方式讀取,該文檔位於此python同以及目錄下
content  = open(u'人民的名義.txt','r',encoding='utf-8').read()
jieba.analyse.set_stop_words("stopwords.txt")
tags = jieba.analyse.extract_tags(content, topK=10,withWeight=True)
for tag in tags:
	print("tag:%s\t\t weight:%f"%(tag[0],tag[1]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.115 seconds.
Prefix dict has been built succesfully.
tag:侯亮		 weight:0.257260
tag:李達康		 weight:0.143901
tag:高育良		 weight:0.108856
tag:祁同偉		 weight:0.098479
tag:高小琴		 weight:0.062259
tag:瑞金		 weight:0.060405
tag:陳海		 weight:0.054036
tag:老師		 weight:0.051980
tag:丁義珍		 weight:0.049729
tag:成功		 weight:0.046647
[Finished in 5.3s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

02.02詞性標註

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer
    參數可指定內部使用的 jieba.Tokenizer 分詞器。 jieba.posseg.dt 爲默認詞性標註分詞器。
  • 標註句子分詞後每個詞的詞性,採用和 ictclas 兼容的標記法。
  • 用法示例
>>> import jieba.posseg as pseg
>>> words = pseg.cut("我愛北京天安門")
>>> for word, flag in words:
...    print('%s %s' % (word, flag))
...
我 r
愛 v
北京 ns
天安門 ns
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

詞性對照表

詞性編碼 詞性名稱 註解
Ag 形語素 形容詞性語素。形容詞代碼爲 a,語素代碼g前面置以A。
a 形成詞 取英語形容詞 adjective的第1個字母。
ad 副形詞 直接作狀語的形容詞。形容詞代碼 a和副詞代碼d並在一起。
an 名形詞 具有名詞功能的形容詞。形容詞代碼 a和名詞代碼n並在一起。
b 區別詞 取漢字“別”的聲母。
c 連詞 取英語連詞 conjunction的第1個字母。
dg 副語素 副詞性語素。副詞代碼爲 d,語素代碼g前面置以D。
d 副詞 取 adverb的第2個字母,因其第1個字母已用於形容詞。
e 嘆詞 取英語嘆詞 exclamation的第1個字母。
f 方位詞 取漢字“方”
g 語素 絕大多數語素都能作爲合成詞的“詞根”,取漢字“根”的聲母。
h 前接成分 取英語 head的第1個字母。
i 成語 取英語成語 idiom的第1個字母。
j 簡稱略語 取漢字“簡”的聲母。
k 後接成分  
l 習用語 習用語尚未成爲成語,有點“臨時性”,取“臨”的聲母。
m 數詞 取英語 numeral的第3個字母,n,u已有他用。
Ng 名語素 名詞性語素。名詞代碼爲 n,語素代碼g前面置以N。
n 名詞 取英語名詞 noun的第1個字母。
nr 人名 名詞代碼 n和“人(ren)”的聲母並在一起。
ns 地名 名詞代碼 n和處所詞代碼s並在一起。
nt 機構團體 “團”的聲母爲 t,名詞代碼n和t並在一起。
nz 其他專名 “專”的聲母的第 1個字母爲z,名詞代碼n和z並在一起。
o 擬聲詞 取英語擬聲詞 onomatopoeia的第1個字母。
p 介詞 取英語介詞 prepositional的第1個字母。
q 量詞 取英語 quantity的第1個字母。
r 代詞 取英語代詞 pronoun的第2個字母,因p已用於介詞。
s 處所詞 取英語 space的第1個字母。
tg 時語素 時間詞性語素。時間詞代碼爲 t,在語素的代碼g前面置以T。
t 時間詞 取英語 time的第1個字母。
u 助詞 取英語助詞 auxiliary
vg 動語素 動詞性語素。動詞代碼爲 v。在語素的代碼g前面置以V。
v 動詞 取英語動詞 verb的第一個字母
vd 副動詞 直接作狀語的動詞。動詞和副詞的代碼並在一起。
vn 名動詞 指具有名詞功能的動詞。動詞和名詞的代碼並在一起。
w 標點符號  
x 非語素字 非語素字只是一個符號,字母 x通常用於代表未知數、符號。
y 語氣詞 取漢字“語”的聲母。
z 狀態詞 取漢字“狀”的聲母的前一個字母
un 未知詞 不可識別詞及用戶自定義詞組。取英文Unkonwn首兩個字母。(非北大標準,CSW分詞中定義)

02.03並行分詞

  • 原理:將目標文本按行分隔後,把各行文本分配到多個 Python 進程並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升
  • 基於 python 自帶的 multiprocessing 模塊,目前暫不支持 Windows
  • 用法
    jieba.enable_parallel(4) # 開啓並行分詞模式,參數爲並行進程數 jieba.disable_parallel() # 關閉並行分詞模式
    官方使用案例
import sys
import time
sys.path.append("../../")
import jieba

jieba.enable_parallel()

url = sys.argv[1]
content = open(url,"rb").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))

t2 = time.time()
tm_cost = t2-t1

log_f = open("1.log","wb")
log_f.write(words.encode('utf-8'))

print('speed %s bytes/second' % (len(content)/tm_cost))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 注意:並行分詞僅支持默認分詞器 jieba.dt 和 jieba.posseg.dt。

02.04Tokenize:返回詞語在原文的起止位置

注意,輸入參數只接受 unicode
默認模式

import jieba
import jieba.analyse
result = jieba.tokenize(u'永和服裝飾品有限公司')
for tk in result:
    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
  • 1
  • 2
  • 3
  • 4
  • 5

結果

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\JACKPI~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.054 seconds.
Prefix dict has been built succesfully.
word 永和		 start: 0 		 end:2
word 服裝		 start: 2 		 end:4
word 飾品		 start: 4 		 end:6
word 有限公司		 start: 6 		 end:10
[Finished in 3.3s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 搜索模式
result = jieba.tokenize(u'永和服裝飾品有限公司', mode='search')
for tk in result:
    print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
  • 1
  • 2
  • 3

結果

word 永和                start: 0                end:2
word 服裝                start: 2                end:4
word 飾品                start: 4                end:6
word 有限                start: 6                end:8
word 公司                start: 8                end:10
word 有限公司            start: 6                end:10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#02.05ChineseAnalyzer for Whoosh 搜索引擎

  • 引用: from jieba.analyse import ChineseAnalyzer
  • 官方案例
# -*- coding: UTF-8 -*-
from __future__ import unicode_literals
import sys,os
sys.path.append("../")
from whoosh.index import create_in,open_dir
from whoosh.fields import *
from whoosh.qparser import QueryParser

from jieba.analyse import ChineseAnalyzer

analyzer = ChineseAnalyzer()

schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True, analyzer=analyzer))
if not os.path.exists("tmp"):
    os.mkdir("tmp")

ix = create_in("tmp", schema) # for create new index
#ix = open_dir("tmp") # for read only
writer = ix.writer()

writer.add_document(
    title="document1",
    path="/a",
    content="This is the first document we’ve added!"
)

writer.add_document(
    title="document2",
    path="/b",
    content="The second one 你 中文測試中文 is even more interesting! 吃水果"
)

writer.add_document(
    title="document3",
    path="/c",
    content="買水果然後來世博園。"
)

writer.add_document(
    title="document4",
    path="/c",
    content="工信處女幹事每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作"
)

writer.add_document(
    title="document4",
    path="/c",
    content="咱倆交換一下吧。"
)

writer.commit()
searcher = ix.searcher()
parser = QueryParser("content", schema=ix.schema)

for keyword in ("水果世博園","你","first","中文","交換機","交換"):
    print("result of ",keyword)
    q = parser.parse(keyword)
    results = searcher.search(q)
    for hit in results:
        print(hit.highlights("content"))
    print("="*10)

for t in analyzer("我的好朋友是李明;我愛北京天安門;IBM和Microsoft; I have a dream. this is intetesting and interested me a lot"):
    print(t.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

03.延遲加載

jieba 採用延遲加載,import jieba 和 jieba.Tokenizer() 不會立即觸發詞典的加載,一旦有必要纔開始加載詞典構建前綴字典。如果你想手工初始 jieba,也可以手動初始化。

import jieba
jieba.initialize()  # 手動初始化(可選)
  • 1
  • 2

官方使用案例

#encoding=utf-8
from __future__ import print_function
import sys
sys.path.append("../")
import jieba

def cuttest(test_sent):
    result = jieba.cut(test_sent)
    print("  ".join(result))

def testcase():
    cuttest("這是一個伸手不見五指的黑夜。我叫孫悟空,我愛北京,我愛Python和C++。")
    cuttest("我不喜歡日本和服。")
    cuttest("雷猴迴歸人間。")
    cuttest("工信處女幹事每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作")
    cuttest("我需要廉租房")
    cuttest("永和服裝飾品有限公司")
    cuttest("我愛北京天安門")
    cuttest("abc")
    cuttest("隱馬爾可夫")
    cuttest("雷猴是個好網站")
    
if __name__ == "__main__":
    testcase()
    jieba.set_dictionary("foobar.txt")
    print("================================")
    testcase()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

04.其他詞典

1.佔用內存較小的詞典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small
2.支持繁體分詞更好的詞典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big
下載你所需要的詞典,然後覆蓋 jieba/dict.txt 即可;或者用 jieba.set_dictionary('data/dict.txt.big')

寫在最後

由於jieba分詞的內容比較多,功能也是比較強大的,筆者只是針對官方的文檔進行了一定的解釋。有對自然語言處理的可以關注個人訂閱號,這裏有關於自然語言處理、機器學習等學習資料。
這裏寫圖片描述

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章