中文斷詞
文章推薦指數: 80 %
目前繁體中文斷詞系統有中研院CKIP 以及jieba,在一些舊的文章中都提到jieba 無法適當地處理繁體中文,而有替換繁體中文字典的改進作法,不過 ...
2020/08/03
中文斷詞
在中文自然語言處理NLP中,要對一堆文字詞語組成的文章進行分析,分析前要先拆解文章,也就是斷詞,我們要分析的對象是詞語,而不是一個一個中文字,這跟英文完全不同,因為英文的斷詞就直接用標點符號、空白去區隔即可。
目前繁體中文斷詞系統有中研院CKIP以及jieba,在一些舊的文章中都提到jieba無法適當地處理繁體中文,而有替換繁體中文字典的改進作法,不過目前jieba已經到了0.42版,以下先了解官方的套件的功能,再看看需不需要修改繁體中文字典。
jieba演算法
基於前綴詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG)
採用了動態規劃查找最大概率路徑,找出基於詞頻的最大切分組合
對於未登錄詞,採用了基於漢字成詞能力的HMM模型,使用了Viterbi算法
安裝
可直接用pip安裝,或是將jiebasourcecode的jieba目錄放在目前的工作目錄,或是site-packages目錄中
如果要使用paddle的分詞語詞性標注功能,必須安裝paddlepaddle-tiny
pip3installpaddlepaddle-tiny==1.6.1
先直接下載sourcecode試試看
wgethttps://github.com/fxsjy/jieba/archive/v0.42.1.tar.gz-Ojieba-0.41.1.tgz
tarzxvfjieba-0.41.1.tgz
virtualenvironemnt
virtualenv--system-site-packages/root/venv-jieba
source/root/venv-jieba/bin/activate
##如果不使用paddlepaddle,這兩個套件也可以不安裝
pip3installnumpy==1.16.4
pip3installpaddlepaddle-tiny==1.6.1
#把sorucecode中的jieba目錄移動到工作目錄中
mv~/temp/download/jieba-0.41.1/jieba~/temp
斷詞
有四種斷詞模式
精確模式,試圖將句子最精確地切開,適合文本分析
完整模式,把句子中所有的可以成詞的詞語都掃描出來,速度非常快,但是不能解決歧義;
搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。
paddle模式,利用PaddlePaddle深度學習框架,訓練序列標注(雙向GRU)網絡模型實現分詞。
同時支持詞性標注。
paddle模式使用需安裝paddlepaddle-tiny
函式
jieba.cut方法接受四個輸入參數:需要分詞的字符串;cutall參數用來控制是否採用全模式;HMM參數用來控制是否使用HMM模型;usepaddle參數用來控制是否使用paddle模式下的分詞模式,paddle模式採用延遲加載方式,通過enable_paddle接口安裝paddlepaddle-tiny,並且import相關代碼
jieba.cutforsearch方法接受兩個參數:需要分詞的字符串;是否使用HMM模型。
該方法適合用於搜索引擎構建倒排索引的分詞,粒度比較細
待分詞的字符串可以是unicode或UTF-8字符串、GBK字符串。
注意:不建議直接輸入GBK字符串,可能無法預料地錯誤解碼成UTF-8
jieba.cut以及jieba.cutforsearch返回的結構都是一個可迭代的generator,可以使用for循環來獲得分詞後得到的每一個詞語(unicode),或者用
jieba.lcut以及jieba.lcutforsearch直接返回list
jieba.Tokenizer(dictionary=DEFAULT_DICT)新建自定義分詞器,可用於同時使用不同詞典。
jieba.dt為默認分詞器,所有全局分詞相關函數都是該分詞器的映射。
#encoding=utf-8
importjieba
print()
print("完整模式:")
seg_list=jieba.cut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
",cut_all=True)
print("FullMode:"+"/".join(seg_list))#全模式
print()
print("精確模式:")
seg_list=jieba.cut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
",cut_all=False)
print("DefaultMode:"+"/".join(seg_list))#精確模式
print()
print("預設是精確模式:")
seg_list=jieba.cut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
")#預設是精確模式
print(",".join(seg_list))
print()
print("搜索引擎模式:")
seg_list=jieba.cut_for_search("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
")#
print(",".join(seg_list))
print()
print("PaddleMode:")
jieba.enable_paddle()#啓動paddle模式。
0.40版之後開始支持,早期版本不支持
strs=["肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
","乒乓球拍賣完了","新竹清華大學"]
forstrinstrs:
seg_list=jieba.cut(str,use_paddle=True)#使用paddle模式
print("PaddleMode:"+'/'.join(list(seg_list)))
執行結果
完整模式:
Buildingprefixdictfromthedefaultdictionary...
Loadingmodelfromcache/tmp/jieba.cache
Loadingmodelcost0.433seconds.
Prefixdicthasbeenbuiltsuccessfully.
FullMode:肺炎/疫情/的/挑/戰/日益/嚴/峻/,/新竹/清/華/大/學/自/農/曆/年/起/陸/續/已/採/取/了/量/測/體/溫/等/全面/的/防疫/措施/。
精確模式:
DefaultMode:肺炎/疫情/的/挑戰/日益/嚴峻/,/新竹/清華大學/自農/曆/年/起/陸續/已/採取/了/量/測體/溫/等/全面/的/防疫/措施/。
預設是精確模式:
肺炎,疫情,的,挑戰,日益,嚴峻,,,新竹,清華大學,自農,曆,年,起,陸續,已,採取,了,量,測體,溫,等,全面,的,防疫,措施,。
搜索引擎模式:
肺炎,疫情,的,挑戰,日益,嚴峻,,,新竹,清華大學,自農,曆,年,起,陸續,已,採取,了,量,測體,溫,等,全面,的,防疫,措施,。
PaddleMode:
W032711:45:31.17975221561init.cc:157]AVXisavailable,Pleasere-compileonlocalmachine
Paddleenabledsuccessfully......
PaddleMode:肺炎/疫情/的/挑戰/日益/嚴/峻,新竹清華大學自農曆年起陸續/已/採取/了/量測體溫/等/全面/的/防疫/措施/。
PaddleMode:乒乓/球拍/賣/完/了
PaddleMode:新竹/清華大學
jieba.lcut()lcut(),意思跟cut()是一樣的,只是返回的型態變成list
#encoding=utf-8
importjieba
print()
print("完整模式:")
seg_list=jieba.lcut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
",cut_all=True)
print("FullMode:",seg_list)#全模式
print()
print("精確模式:")
seg_list=jieba.lcut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
",cut_all=False)
print("DefaultMode:",seg_list)#精確模式
print()
print("預設是精確模式:")
seg_list=jieba.lcut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
")#預設是精確模式
print(seg_list)
print()
print("搜索引擎模式:")
seg_list=jieba.lcut_for_search("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
")#
print(seg_list)
print()
print("PaddleMode:")
jieba.enable_paddle()#啓動paddle模式。
0.40版之後開始支持,早期版本不支持
strs=["肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
","乒乓球拍賣完了","新竹清華大學"]
forstrinstrs:
seg_list=jieba.lcut(str,use_paddle=True)#使用paddle模式
print("PaddleMode:",seg_list)
自訂詞典
雖然jieba有新詞識別能力,但是自行添加新詞可以保證更高的正確率
用法:jieba.loaduserdict(filename)
file_name為文件類對象或自定義詞典的路徑
詞典格式和dict.txt一樣,一個詞佔一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。
file_name若為路徑或二進制方式打開的文件,則文件必須為UTF-8編碼。
詞頻省略時使用自動計算的方式處理,能保證分出該詞的詞頻。
使用addword(word,freq=None,tag=None)和delword(word)可在程序中動態修改詞典。
使用suggest_freq(segment,tune=True)可調節單個詞語的詞頻,使其能(或不能)被分出來。
注意:自動計算的詞頻在使用HMM新詞發現功能時可能無效。
在專案路徑下新增一個檔案叫做:userdict.txt
內容如下:
農曆年
量測
體溫
日益嚴峻
可在程式一開始,就載入自訂詞典
jieba.load_userdict('userdict.txt')
執行結果
精確模式:
DefaultMode:['肺炎','疫情','的','挑戰','日益嚴峻',',','新竹','清華大學','自','農曆年','起陸續','已','採取','了','量測','體溫','等','全面','的','防疫','措施','。
']
可動態調整詞語的頻率
jieba.suggest_freq(('陸續'),True)
print()
print("精確模式2:")
seg_list=jieba.lcut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
",cut_all=False)
print("DefaultMode:",seg_list)#精確模式
執行結果
精確模式2:
DefaultMode:['肺炎','疫情','的','挑戰','日益嚴峻',',','新竹','清華大學','自','農曆年','起','陸續','已','採取','了','量測','體溫','等','全面','的','防疫','措施','。
']
也可以直接替換詞典
ithomeironman/day16NLP_Chinese/可下載一個繁體中文的字典dict.txt.big
#encoding=utf-8
importjieba
jieba.set_dictionary('dict.txt.big')
#withopen('stops.txt','r',encoding='utf8')asf:
#stops=f.read().split('\n')
print()
print("精確模式:")
seg_list=jieba.lcut("肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
",cut_all=False)
print("DefaultMode:",seg_list)
關鍵詞抽取
TF-IDF方法
#jieba.analyse.extract_tags(sentence,topK=20,withWeight=False,allowPOS=())
#sentence為待提取的文本
#topK為返回幾個TF/IDF權重最大的關鍵詞,默認值為20
#withWeight為是否一並返回關鍵詞權重值,默認值為False
#allowPOS僅包括指定詞性的詞,默認值為空,即不篩選
#jieba.analyse.TFIDF(idf_path=None)新建TFIDF實例,idf_path為IDF頻率文件
TextRank方法
jieba.analyse.textrank(sentence,topK=20,withWeight=False,allowPOS=('ns','n','vn','v'))直接使用,接口相同,注意默認過濾詞性。
jieba.analyse.TextRank()新建自定義TextRank實例
#-*-coding:utf-8-*-
importjieba
importjieba.analyse
jieba.set_dictionary('dict.txt.big')
print()
text='肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
'
tags=jieba.analyse.extract_tags(text,topK=10)
print(tags)
#['挑戰','嚴峻','清華大學','農曆年','陸續','採取','測體溫','防疫','新竹','肺炎']
print()
print('textrank:')
forx,winjieba.analyse.textrank(text,withWeight=True):
print('%s%s'%(x,w))
#textrank:
#日益1.0
#全面1.0
#肺炎0.6631715416020616
#防疫0.6631715416020616
#疫情0.6605033585768562
#措施0.6605033585768562
#新竹0.3607120276929184
#了量0.3607120276929184
詞性標注
ref:彙整中文與英文的詞性標註代號:結巴斷詞器與FastTag/IdentifythePartofSpeechinChineseandEnglish
結巴預設會將標點符號標示為「x」,而不是「w」。
而且英文會被標示為「eng」
#-*-coding:utf-8-*-
importjieba
importjieba.possegaspseg
text='肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
'
seg_list=pseg.lcut(text)
#print("DefaultMode:",seg_list)
forword,flaginseg_list:
print("",word,":",flag)
執行結果
肺炎:n
疫情:n
的:uj
挑戰:vn
日益:n
嚴峻:a
,:x
新竹:ns
清華大學:nt
自:p
農:ng
曆:zg
年:q
起:v
陸:nr
續:v
已:d
採:v
取:v
了:ul
量:n
測:v
體:ng
溫:v
等:u
全面:n
的:uj
防疫:vn
措施:n
。
:x
wordcloud
參考這篇文章中文自然語言處理基礎以及資源
下載檔案:
cloud_mask7.png
sumsun.ttf
stops.txt
安裝其它套件
pip3installcollections
pip3installwordcloud
pip3installmatplotlib
yum-yinstallpython-imaging
importjieba
jieba.set_dictionary('dict.txt.big')#如果是使用繁體文字,請記得去下載繁體字典來使用
withopen('stops.txt','r',encoding='utf8')asf:
stops=f.read().split('\n')
text="肺炎疫情的挑戰日益嚴峻,新竹清華大學自農曆年起陸續已採取了量測體溫等全面的防疫措施。
"
fromcollectionsimportCounter
fromwordcloudimportWordCloud
frommatplotlibimportpyplotasplt
stops.append('\n')##換行符號,加入停用字中,可以把它拿掉
stops.append('\n\n')
terms=[tfortinjieba.cut(text,cut_all=True)iftnotinstops]
sorted(Counter(terms).items(),key=lambdax:x[1],reverse=True)##這個寫法很常出現在Counter中,他可以排序,list每個item出現的次數。
plt.clf()
wordcloud=WordCloud(font_path="simsun.ttf")##做中文時務必加上字形檔
wordcloud.generate_from_frequencies(frequencies=Counter(terms))
plt.figure(figsize=(15,15))
plt.imshow(wordcloud,interpolation="bilinear")
plt.axis("off")
plt.savefig('cloud1.png')
fromPILimportImage
importnumpyasnp
alice_mask=np.array(Image.open("cloud_mask7.png"))##請更改cloud_mask7.png路徑
wc=WordCloud(background_color="white",max_words=2000,mask=alice_mask,font_path="simsun.ttf")
wc.generate_from_frequencies(Counter(terms))##請更改Counter(terms)
wc.to_file("cloud2.png")##如果要存檔,可以使用
#plt.clf()
#plt.imshow(wc,interpolation='bilinear')
#plt.axis("off")
#plt.figure()
#plt.imshow(alice_mask,cmap=plt.cm.gray,interpolation='bilinear')
#plt.axis("off")
#plt.savefig('cloud2.png')
References
pypijieba
jieba原始github
python-11-利用jieba實現中文斷詞
NLP中文斷詞最方便的開源工具之一——Jieba
Python-知名Jieba中文斷詞工具教學
2017
結巴中文斷詞台灣繁體版本APCLab
結巴中文斷詞台灣繁體版本ldkrsi
張貼者:
maxkit
於
09:05
以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest
標籤:
ASR
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言(Atom)
PopularPosts
MQTT(一)簡介
前言會知道MQTT協定,要先回憶起兩年前,當初想找找Android的PushNotification的解決方案,先是找到了當時GCM的前身C2DM,以為Google已經提供了此服務,測試了一下code也蠻容易上手的,結果發現到他有quota限制,不適合拿來當成產品,因...
python函數的可變參數*args和**kwargs
一般函數的參數個數都是固定的,但如果遇到參數數量不固定的狀況,通常會將某些參數填上預設值,在pythonfunction可以支援兩種可變數量的參數*args和**kwargs。
以下例子中的fun雖然定義了三個參數,但是後面兩個填上預設值,呼叫該函數時,...
DockerCompose初步閱讀與學習記錄
上次在看Dockerfile時,有注意到一個工具,DockerCompose。
透過這個工具,可以先寫一份檔案,預先定義好多個service,然後透過單一命令來啟動多個container執行你定義的service,讓他們組成一個你想要的應用服務。
直覺這是個docke...
在iOS應用程式中使用推播通知(PushNotification)功能-Provider以Java-apns實作
前言開發iOS應用程式時,我們常常需要連上自己的平台或伺服器建立連線,取得資料。
然而,當應用程式尚未開啟,或是已經被退到背景時,此時就無法讓使用者即時看到自己的伺服器送來的新資料了。
推播通知(ApplePushNotificationService,...
如何在Markdown輸入數學公式及符號
使用latex語法在Markdown輸入數學公式及符號數學公式1.如何插入公式有行內公式與獨立公式兩種$行內公式$$$獨立公式$$ex:行內公式\(F=ma\)獨立公式\[F=ma\]2.上下標上...
pushnotification-androidclient以GCM實現(一)
app發布後,想要從server發訊息給client時,該怎麼做呢?一直保持server與client間的連線?若server只是偶而或幾天才發送一次訊息,這樣做不僅耗電還浪費資源,重點是很可能被使用者移除!但是不保持連線,那要如何讓server主...
AndroidNotification的基本用法,顯示通知列圖片、播放音效、振動
AndroidNotification的基本用法,顯示通知列圖片、播放音效、振動我們會發現,越來越多的手機軟體,都會使用「通知Notification」這項功能,主要用來提醒新訊息、公告或是提示訊息等...如圖片所示: 寫法其實很簡單,我們寫一個測...
MQTT(二)MessageTypeandFlows
MessageType在MQTT協定裡,當Client要連上MQTTServer時,需要發送一個type為"CONNECT"的訊息到MQTTServer,才能開始建立起連線;當Client想發佈訊息時,則要發送一個type為"PUBLIS...
iBeacon偵測範例-androidclient
去年七月在一個講座上第一次聽到ibeacon這個名詞,那時候還不是這麼熱門google到的第一個就是 estimote 這間公司的產品,不過因為訂購過海關還會被NCC攔截...所以後面就沒再繼續追蹤。
不過今年跟朋友借到estimote的Beacon,終...
如何使用ApachePOI處理Excel檔案
ApachePOI是PoorObfuscationImplementation的縮寫,其目的是建立與讀取OfficeOpenXML(OOXML)標準和微軟的OLE2復合文檔格式(OLE2)的JavaAPI。
主要的元件有:Excel(SS=H...
網誌存檔
►
2022
(19)
►
六月
(1)
►
五月
(4)
►
四月
(3)
►
三月
(4)
►
二月
(3)
►
一月
(4)
►
2021
(41)
►
十二月
(3)
►
十一月
(5)
►
十月
(3)
►
九月
(3)
►
八月
(3)
►
七月
(4)
►
六月
(3)
►
五月
(4)
►
四月
(4)
►
三月
(4)
►
二月
(2)
►
一月
(3)
▼
2020
(48)
►
十二月
(4)
►
十一月
(5)
►
十月
(4)
►
九月
(4)
▼
八月
(4)
8D問題解決法EightDisciplinesProblemSolving
判斷點是否在多邊形內的方法
詞向量WordEmbedding
中文斷詞
►
七月
(3)
►
六月
(4)
►
五月
(4)
►
四月
(4)
►
三月
(5)
►
二月
(4)
►
一月
(3)
►
2019
(54)
►
十二月
(5)
►
十一月
(4)
►
十月
(4)
►
九月
(4)
►
八月
(4)
►
七月
(5)
►
六月
(5)
►
五月
(5)
►
四月
(6)
►
三月
(5)
►
二月
(3)
►
一月
(4)
►
2018
(44)
►
十二月
(3)
►
十一月
(4)
►
十月
(5)
►
九月
(3)
►
八月
(4)
►
七月
(3)
►
六月
(3)
►
五月
(4)
►
四月
(5)
►
三月
(4)
►
二月
(2)
►
一月
(4)
►
2017
(54)
►
十二月
(5)
►
十一月
(4)
►
十月
(4)
►
九月
(4)
►
八月
(4)
►
七月
(4)
►
六月
(6)
►
五月
(3)
►
四月
(6)
►
三月
(6)
►
二月
(5)
►
一月
(3)
►
2016
(47)
►
十二月
(4)
►
十一月
(4)
►
十月
(4)
►
九月
(4)
►
八月
(5)
►
七月
(2)
►
六月
(4)
►
五月
(4)
►
四月
(3)
►
三月
(6)
►
二月
(3)
►
一月
(4)
►
2015
(60)
►
十二月
(4)
►
十一月
(8)
►
十月
(4)
►
九月
(3)
►
八月
(6)
►
七月
(3)
►
六月
(5)
►
五月
(4)
►
四月
(5)
►
三月
(6)
►
二月
(3)
►
一月
(9)
►
2014
(140)
►
十二月
(7)
►
十一月
(6)
►
十月
(4)
►
九月
(10)
►
八月
(7)
►
七月
(9)
►
六月
(8)
►
五月
(10)
►
四月
(17)
►
三月
(21)
►
二月
(19)
►
一月
(22)
►
2013
(6)
►
十二月
(6)
延伸文章資訊
- 1Python – (11) 利用jieba實現中文斷詞 - 珍妮佛的學習筆記
中文斷詞畢竟跟英文不同,英文只要用空白(space)斷詞即可,中文卻複雜的多,目前中文斷詞大家蠻推的JIEBA…
- 2中文自然語言處理基礎 - iT 邦幫忙
Import. import jieba jieba.set_dictionary('dict.txt.big') # 如果是使用繁體文字,請記得去下載繁體字典來使用 ...
- 3Python - 知名Jieba 中文斷詞工具教學
但是可想而知它的這個工具對簡體中文分詞會比較準確,繁體中文雖然用這工具也還可以,但是有一些像是台灣用語就比較難斷得很好。
- 4中文斷詞
目前繁體中文斷詞系統有中研院CKIP 以及jieba,在一些舊的文章中都提到jieba 無法適當地處理繁體中文,而有替換繁體中文字典的改進作法,不過 ...
- 5Python自然語言處理(二):使用jieba進行中文斷詞
搜尋引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。 安裝 pip install jieba. 使用範例. 設定詞庫 #下載繁體中文詞庫後,使用 ...