自然語言處理 | 中文分詞器JIEBA分詞練習(xí)

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即可:

image.png

打開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í)別能力酱讶,但是自行添加新詞可以保證更高的正確率泻肯。

jieba_word.txt

詞典格式和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)詞性語素

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市患亿,隨后出現(xiàn)的幾起案子传蹈,更是在濱河造成了極大的恐慌,老刑警劉巖步藕,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惦界,死亡現(xiàn)場離奇詭異,居然都是意外死亡咙冗,警方通過查閱死者的電腦和手機(jī)沾歪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雾消,“玉大人灾搏,你說我怎么就攤上這事×⑷螅” “怎么了狂窑?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桑腮。 經(jīng)常有香客問我泉哈,道長,這世上最難降的妖魔是什么破讨? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任旨巷,我火速辦了婚禮,結(jié)果婚禮上添忘,老公的妹妹穿的比我還像新娘采呐。我一直安慰自己,他們只是感情好搁骑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布斧吐。 她就那樣靜靜地躺著,像睡著了一般仲器。 火紅的嫁衣襯著肌膚如雪煤率。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天乏冀,我揣著相機(jī)與錄音蝶糯,去河邊找鬼。 笑死辆沦,一個(gè)胖子當(dāng)著我的面吹牛昼捍,可吹牛的內(nèi)容都是我干的识虚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妒茬,長吁一口氣:“原來是場噩夢啊……” “哼担锤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乍钻,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肛循,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后银择,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體多糠,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年浩考,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熬丧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怀挠,死狀恐怖析蝴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绿淋,我是刑警寧澤闷畸,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站吞滞,受9級(jí)特大地震影響佑菩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裁赠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一殿漠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佩捞,春花似錦绞幌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帘营,卻和暖如春票渠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芬迄。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工问顷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓杜窄,卻偏偏與公主長得像肠骆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羞芍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • jieba分詞,學(xué)習(xí)郊艘,為了全面了解該模塊荷科,,預(yù)設(shè)學(xué)習(xí)路線:官方文檔——優(yōu)秀博客文章——實(shí)踐學(xué)習(xí) 官方文檔部分 (文...
    竹林徒兒閱讀 4,116評(píng)論 1 12
  • 轉(zhuǎn)自 進(jìn)擊的Coder 公眾號(hào) 原理 中文分詞纱注,即 Chinese Word Segmentation畏浆,即將一個(gè)漢...
    Epiphron閱讀 11,561評(píng)論 2 56
  • 在接下來的分詞練習(xí)中將使用到四川大學(xué)公共管理學(xué)院的一篇新聞進(jìn)行練習(xí),文本如下: 為貫徹落實(shí)黨的十九大精神狞贱,不斷提升...
    nicokani閱讀 1,233評(píng)論 0 4
  • 注:參考文檔 一刻获、在線詞云圖工具# (1)、使用### 在正式使用jieba分詞之前瞎嬉,首先嘗試用在線分詞工具來將自...
    DearIreneLi閱讀 6,042評(píng)論 1 8
  • 深夜有人看完前一篇表示不服蝎毡,說沒有她,憑什么我這么精彩的高中生活中竟然第一個(gè)沒寫她氧枣, 既然要寫高中沐兵,那就不能不提這...
    東森5231閱讀 247評(píng)論 1 4