1.JIEBA簡介
jieba是基于Python的中文分詞工具沸版,支持繁體分詞、自定義詞典和三種分詞模式:
- 精確模式兴蒸,試圖將句子最精確地切開视粮,適合文本分析;
- 全模式橙凳,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義础锐;
- 搜索引擎模式耀怜,在精確模式的基礎(chǔ)上从诲,對(duì)長詞再次切分描扯,提高召回率,適合用于搜索引擎分詞蜂桶。
算法原理:
- 基于Trie樹結(jié)構(gòu)實(shí)現(xiàn)高效的詞圖掃描钦购,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖(DAG)
- 采用了動(dòng)態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合
- 對(duì)于未登錄詞,采用了基于漢字成詞能力的HMM模型卷雕,使用了Viterbi算法
2.Win+Python3.X下的安裝使用
JIEBA支持Python2和Python3使用浸间,在Python3.X下JIEBA的Github地址:https://github.com/fxsjy/jieba/tree/jieba3k。
在python環(huán)境下安裝JIEBA直接pip install jieba
即可:
打開Jupyter進(jìn)行分詞:
import jieba
text = "歐陽建國是創(chuàng)新辦主任也是歡聚時(shí)代公司云計(jì)算方面的專家"
# jieba.cut() 方法接受兩個(gè)輸入?yún)?shù):
# 需要分詞的字符串
# cut_all 參數(shù)用來控制是否采用全模式
# 精確模式,默認(rèn)模式就是精確模式
seg_list = jieba.cut(text, cut_all = False)
print('Default Mode:\n' + '/' .join(seg_list))
# 全模式
seg_list = jieba.cut(text, cut_all = True)
print( "Full Mode:\n" + '/' .join(seg_list))
# jieba.cut_for_search() 方法接受一個(gè)參數(shù):
# 需要分詞的字符串
# 該方法適合用于搜索引擎構(gòu)建倒排索引的分詞,粒度比較細(xì)
# 搜索引擎模式
seg_list = jieba.cut_for_search(text)
print('Research Mode:\n' + '/'.join(seg_list))
運(yùn)行結(jié)果:
Default Mode:
歐陽/建國/是/創(chuàng)新/辦/主任/也/是/歡聚/時(shí)代/公司/云/計(jì)算/方面/的/專家
Full Mode:
歐陽/歐陽建/建國/國是/創(chuàng)新/辦/主任/也/是/歡聚/時(shí)代/代公/公司/云/計(jì)算/方面/的/專家
Research Mode:
歐陽/建國/是/創(chuàng)新/辦/主任/也/是/歡聚/時(shí)代/公司/云/計(jì)算/方面/的/專家
可以看到从祝,“云計(jì)算”作為一個(gè)近年來很熱門的詞匯贮预,在這里卻并沒有被識(shí)別為一個(gè)詞語唤冈。查看詞頻:
print(jieba.get_FREQ("云"))
print(jieba.get_FREQ("計(jì)算"))
print(jieba.get_FREQ("云計(jì)算"))
結(jié)果:
6353
5235
None
可以看到詞庫中并沒有收錄“云計(jì)算”這個(gè)詞匯看杭,因此采用增大詞頻的方法進(jìn)行識(shí)別詞語的調(diào)整:
import jieba
text = "歐陽建國是創(chuàng)新辦主任也是歡聚時(shí)代公司云計(jì)算方面的專家"
jieba.add_word('云計(jì)算',8000) #更改云計(jì)算詞頻為8000
# 精確模式,默認(rèn)模式就是精確模式
seg_list = jieba.cut(text, cut_all = False)
print('Default Mode:\n' + '/' .join(seg_list))
結(jié)果:
Default Mode:歐陽/建國/是/創(chuàng)新/辦/主任/也/是/歡聚/時(shí)代/公司/云計(jì)算/方面/的/專家
運(yùn)行結(jié)果成功劃分“云計(jì)算”為一個(gè)詞匯齿坷,但是這種寫法是在線修改當(dāng)前詞頻谭跨,所以僅僅對(duì)當(dāng)前文件有效芹助。
3.其他功能嘗試
3.1 添加自定義詞典
開發(fā)者可以指定自己自定義的詞典,以便包含jieba詞庫里沒有的詞。雖然jieba有新詞識(shí)別能力酱讶,但是自行添加新詞可以保證更高的正確率泻肯。
詞典格式和dict.txt一樣耕漱,一個(gè)詞占一行;每一行分三部分统锤,一部分為詞語,另一部分為詞頻银锻,最后為詞性(可省略)永品,用空格隔開。文件格式必須為utf-8击纬。
# 精確模式鼎姐,默認(rèn)模式就是精確模式
seg_list = jieba.cut(text, cut_all = False)
print('Default Mode:\n' + '/' .join(seg_list))
jieba.load_userdict("D:\App\jieba_word.txt") # file_name為自定義詞典的路徑
seg_list = jieba.cut(text)
print("Revise: " + "/".join(seg_list))
輸出:
Default Mode:歐陽/建國/是/創(chuàng)新/辦/主任/也/是/歡聚/時(shí)代/公司/云/計(jì)算/方面/的/專家
Revise: 歐陽/建國/是/創(chuàng)新辦/主任/也/是/歡聚時(shí)代/公司/云計(jì)算/方面/的/專家
可以看到,詞典中定義的創(chuàng)新班更振、歡聚時(shí)代炕桨、云計(jì)算都被識(shí)別出來了,并進(jìn)行了正確的切分肯腕。
3.2 獲取詞性
每個(gè)詞都有其詞性献宫,比如名詞、動(dòng)詞实撒、代詞等姊途,JIEBA分詞的結(jié)果也可以帶上每個(gè)詞的詞性,要用到j(luò)ieba.posseg:
import jieba.posseg as pseg
words = pseg.cut(text)
for w in words:
print("%s %s" %(w.word, w.flag))
輸出:
歐陽 ns
建國 ns
是 v
創(chuàng)新辦 ns
主任 b
也 d
是 v
歡聚時(shí)代 ns
公司 n
云計(jì)算 ns
方面 n
的 uj
專家 n
按詞性提取
import jieba.posseg as pseg
word = pseg.cut(text)
for w in word:
if w.flag in ["ns", "v"]:
print (w.word, w.flag)
輸出:
歐陽 ns
建國 ns
是 v
創(chuàng)新辦 ns
是 v
歡聚時(shí)代 ns
云計(jì)算 ns
3.3 提取關(guān)鍵詞
- 基于 TF-IDF 算法的關(guān)鍵詞提取
import jieba.analyse as anl
# jieba.analyse.extract_tags(sentence, topK = 20, withWeight = False, allowPOS = ())
# sentence:待提取的文本奈惑。
# topK:返回幾個(gè) TF-IDF 權(quán)重最大的關(guān)鍵詞吭净,默認(rèn)值為20。
# withWeight:是否一并返回關(guān)鍵詞權(quán)重值肴甸,默認(rèn)值為False寂殉。
# allowPOS:僅包括指定詞性的詞,默認(rèn)值為空原在,即不進(jìn)行篩選友扰。
seg = anl.extract_tags(text, topK = 20, withWeight = True)
for tag, weight in seg:
print ("%s %s" %(tag, weight))
輸出:
創(chuàng)新辦 1.3283075003222222
歡聚時(shí)代 1.3283075003222222
云計(jì)算 1.3283075003222222
歐陽 1.0125762121322222
建國 0.8471149069588889
專家 0.6224321397255556
主任 0.6213043777088889
方面 0.47367896445666663
公司 0.3892744381755555
- 基于 TextRank 算法的關(guān)鍵詞提取
# 基本思想:將待抽取關(guān)鍵詞的文本進(jìn)行分詞;以固定窗口大小(默認(rèn)為5庶柿,通過span屬性調(diào)整)村怪,詞之間的共現(xiàn)關(guān)系,構(gòu)建圖浮庐;計(jì)算圖中節(jié)點(diǎn)的PageRank甚负,注意是無向帶權(quán)圖
import jieba.analyse
for x, w in jieba.analyse.textrank(text, topK = 9, withWeight = True):
print("%s %s" % (x, w))
輸出:
歡聚時(shí)代 1.0
方面 0.9504983854592687
公司 0.9476610050891431
云計(jì)算 0.9446389301268333
創(chuàng)新辦 0.910894831408399
專家 0.7102002565942115
歐陽 0.6599053786424419
建國 0.6577163172521479
3.4 Tokenize: 返回詞語在原文的起止位置
有默認(rèn)模式和搜索模式兩種模式,輸入?yún)?shù)需為unicode類型审残。
# 默認(rèn)模式
result = jieba.tokenize(text)
for tk in result:
print("%s \t start at: %d \t end at: %d" %(tk[0], tk[1], tk[2]))
輸出:
歐陽 start at: 0 end at: 2
建國 start at: 2 end at: 4
是 start at: 4 end at: 5
創(chuàng)新辦 start at: 5 end at: 8
主任 start at: 8 end at: 10
也 start at: 10 end at: 11
是 start at: 11 end at: 12
歡聚時(shí)代 start at: 12 end at: 16
公司 start at: 16 end at: 18
云計(jì)算 start at: 18 end at: 21
方面 start at: 21 end at: 23
的 start at: 23 end at: 24
專家 start at: 24 end at: 26
# 搜索模式:把句子中所有的可以成詞的詞語都掃描出來并確定位置
result = jieba.tokenize(text,mode = "search")
for tk in result:
print("%s \t start at: %d \t end at: %d" %(tk[0], tk[1], tk[2]))
3.5 詞頻統(tǒng)計(jì)梭域、降序排序
import jieba
text = "歐陽建國是創(chuàng)新辦主任也是歡聚時(shí)代公司云計(jì)算方面的專家"
words = jieba.cut(text, cut_all = False)
word_freq = {} # 詞頻序列
for word in words:
if word in word_freq: # 統(tǒng)計(jì)字/詞出現(xiàn)的次數(shù)
word_freq[word] += 1
else:
word_freq[word] = 1
freq_word = [] # 排序后的字/詞列表
for word, freq in word_freq.items():
freq_word.append((word, freq))
freq_word.sort(key = lambda x: x[1], reverse = True)
max_number = 3 # 輸入想要的前3位高頻詞
for word, freq in freq_word[: max_number]:
print (word, freq)
輸出:
是 2
歐陽 1
建國 1
3.6 人工去停用詞
停用詞是在處理自然語言數(shù)據(jù)(或文本)之前或之后會(huì)自動(dòng)過濾掉的某些字或詞。標(biāo)點(diǎn)符號(hào)搅轿、虛詞病涨、連詞不在統(tǒng)計(jì)范圍內(nèi)。
import jieba.analyse
import re
stopwords=[]
for word in open(r"D:\App\stop_word.txt",'r'): # 這里加載停用詞的路徑
stopwords.append(word.strip())
# print (stopwords)
article=open(r"D:\App\1.txt",'r').read()
words=jieba.cut(article)
stayed_line=""
for word in words:
print (word)
if word.encode("utf-8") not in stopwords:
stayed_line+=word+" "
print (stayed_line)
附:JIEBA分詞詞性常見類型對(duì)照表
詞類 | 一級(jí)符號(hào) | 二級(jí)符號(hào) |
---|---|---|
形容詞 | a 形容詞 | ad 副形詞璧坟、an 名形詞既穆、ag 形容詞性語素赎懦、al 形容詞性慣用語 |
區(qū)別詞 | b 區(qū)別詞 | bl 區(qū)別詞性慣用語 |
連詞 | c 連詞 | cc 并列連詞 |
副詞 | d 副詞 | · |
嘆詞 | e 嘆詞 | · |
方位詞 | f 方位詞 | · |
前綴 | h 前綴 | · |
后綴 | k 后綴 | · |
數(shù)詞 | m 數(shù)詞 | mq 數(shù)量詞 |
名詞 | n 名詞 | nr 人名、nr1 漢語姓氏幻工、nr2 漢語名字励两、nrj 日語人名、nrf 音譯人名囊颅、ns 地名伐蒋、nsf 音譯地名、nt 機(jī)構(gòu)團(tuán)體名迁酸、nz 其它專名先鱼、nl 名詞性慣用語、ng 名詞性語素 |
擬聲詞 | o 擬聲詞 | · |
介詞 | p 介詞 | pba 介詞“把”奸鬓、pbei 介詞“被” |
量詞 | q 量詞 | qv 動(dòng)量詞焙畔、qt 時(shí)量詞 |
代詞 | r 代詞 | rr 人稱代詞、rz 指示代詞串远、rzt 時(shí)間指示代詞宏多、rzs 處所指示代詞、rzv 謂詞性指示代詞澡罚、ry 疑問代詞伸但、ryt 時(shí)間疑問代詞、rys 處所疑問代詞留搔、ryv 謂詞性疑問代詞更胖、rg 代詞性語素 |
處所詞 | s 處所詞 | · |
時(shí)間詞 | t 時(shí)間詞 | tg 時(shí)間詞性語素 |
助詞 | u 助詞 | uzhe 著、ule 了 嘍隔显、uguo 過却妨、ude1 的 底、ude2 地括眠、ude3 得彪标、usuo 所、udeng 等 等等 云云掷豺、uyy 一樣 一般 似的 般捞烟、udh 的話、uls 來講 來說 而言 說來当船、uzhi 之题画、ulian 連 (“連小學(xué)生都會(huì)”) |
動(dòng)詞 | v 動(dòng)詞 | vd 副動(dòng)詞、vn 名動(dòng)詞生年、vshi 動(dòng)詞“是”婴程、vyou 動(dòng)詞“有”廓奕、vf 趨向動(dòng)詞抱婉、vx 形式動(dòng)詞档叔、vi 不及物動(dòng)詞(內(nèi)動(dòng)詞)、vl 動(dòng)詞性慣用語蒸绩、vg 動(dòng)詞性語素 |