中文斷詞
文章推薦指數: 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)
延伸文章資訊
- 1中文斷詞
目前繁體中文斷詞系統有中研院CKIP 以及jieba,在一些舊的文章中都提到jieba 無法適當地處理繁體中文,而有替換繁體中文字典的改進作法,不過 ...
- 2中文自動斷詞標記系統 - 中央研究院數位典藏
本系統可以自動抽取新詞建立領域用詞或線上即時分詞功能。為一具有新詞辨識能力並附加詞類標記的選擇性功能之中文斷詞系統。此一系統包含一個約拾萬詞的詞彙庫及附加 ...
- 3線上系統展示 - CKIP Lab 中文詞知識庫小組
CKIP CoreNLP. 多個CKIP NLP 線上服務處理的系統整合:包括斷詞、剖析系統、實體辨識、指代消解。 Demo ...
- 4千呼萬喚十多年!中研院終於開源釋出國產自動化中文斷詞工具
中文NLP研究常用到的自動化中文斷詞工具,實際上,中研院CKIP Lab中文詞知識庫小組自己也有一套國產品,但以前沒有開源,僅提供安裝執行檔,並未提供原始 ...
- 5卓騰語言科技AI -> NLP
中文斷詞系統Articut 的Logo 。 ... 卓騰語言科技Articut 中文斷詞API 服務 ... 我們率先推出的Articut 中文斷詞暨詞性標記服務API 可讓您在取得中文篇章的斷...