[NLP][Python] 中文斷詞最方便的開源工具之一: Jieba

文章推薦指數: 80 %
投票人數:10人

Jieba 是一款使用Python (或者說在Python 上最知名的?) 的一款開源中文斷詞工具,當然它也有支援許多不同的NLP 任務,比方說POS、關鍵字抽取. [NLP][Python]中文斷詞最方便的開源工具之一:Jieba Clay2019-09-232021-03-29NLP,Python 『斷詞』(或者你習慣講『分詞』)的重要性在中文NLP當中幾乎可說是無人不知、無人不曉。

若是今天我們要進行中文的句法分析,試想:若是我們連句子當中有哪些『詞』都不知道,只知道有什麼樣的『字』存在於句子中,那我們該如何去分析這個句子? 於是在進行中文處理時,『斷詞』的工作可謂是必不可少。

當然,搞不好往後的中文分析都是使用深度學習,到了那一天或許也不再需要斷詞啦,不過現階段還是要的。

Jieba,就是一個開源的、可在Github上找到的斷詞專案。

主要功能當然就是斷詞,其處理速度可是非常非常地快,遠比我使用的其他斷詞工具更迅速。

不只如此,我個人認為它的準確率也相當之高,在某些類型的文件甚至還贏過台灣中研院開發的CKIP。

其內部的工作原理如開發者的README所示: 使用前綴詞典進行詞圖掃描,生成所有成詞情況的有向無環圖(DAG,directed acyclic graph)使用動態規劃查找最大概率路徑使用HMM模型(HiddenMarkovModels)找出『未登錄詞』 如果你使用Python來實現Jieba的功能,你可以直接使用pip安裝。

pip3installjieba 以下我便開始紀錄關於如何使用Jieba的心得,若想觀看開發者的Github:https://github.com/fxsjy/jieba 若不是使用Python的讀者,可以參考Github上的『其他語言實現』。

分詞模式 ###註:以下我所提及的『斷詞』即為『分詞』### jiaba.cut()為我們最常使用的功能,我們分別可以輸入『待斷詞文本』、『cut_all全模式是否啟用』、『HMM模型是否啟用』三個參數。

其中只有待斷詞文本是一定要輸入,cut_all預設是關閉的、HMM模型預設是啟用的。

我們以下使用Github上的範例來進行,不過我這裡使用的是繁體。

#-*-coding:utf-8-*- importjieba text='我來到北京清華大學' print('預設:','|'.join(jieba.cut(text,cut_all=False,HMM=True))) print('全關閉:','|'.join(jieba.cut(text,cut_all=False,HMM=False))) print('全關閉:','|'.join(jieba.cut(text,cut_all=True,HMM=True))) #-*-coding:utf-8-*- importjieba text='我來到北京清華大學' print('預設:','|'.join(jieba.cut(text,cut_all=False,HMM=True))) print('全關閉:','|'.join(jieba.cut(text,cut_all=False,HMM=False))) print('全關閉:','|'.join(jieba.cut(text,cut_all=True,HMM=True))) COPY Output: 預設:我|來到|北京|清華|大學 全關閉:我|來到|北京|清華|大學 全關閉:我來|來到|北京|清華|華大|大學 搜尋引擎:我|來到|北京|清華|大學 jieba.cut()返回的結果是一個可迭代的generator,可以像我上述的範例一般使用join()來加入分隔符號。

你也可以使用jieba.lcut()來直接返回一個list。

使用者詞典 有些時候,我們使用Jieba這種斷詞工具難免會碰到斷詞器對我們的文本表現差強人意的情況。

有些時候是因為有太多專業詞彙在我們的文本裡頭,這時候,也許我們加入一些我們自己的使用者詞典比較好。

以下我們來看個簡單的範例: 總統蔡英文論文風波延燒後,最新民調今日出爐!據親藍民調公布結果,蔡英文支持度45%,遙遙領先韓國瑜的33%,兩人差距擴大到12個百分點。

顯示論文門風波,並未重創小英聲望。

這是我今天(2019/09/23)從GoogleNews上擷取的一份簡單的報導,我們把這段文本丟進Jieba進行斷詞。

['總統','蔡英文','論文','風波','延燒','後',',','最','新','民調','今日','出爐','!','據','親藍','民調','公布','結果',',','蔡英文','支持度','45%',',','遙遙領先','韓國','瑜','的','33%',',','兩人','差距','擴大到','12','個','百分點','。

','顯示','論文','門','風波',',','並未','重創','小英','聲望','。

'] 大部分的斷詞結果都還不錯,唯一最大的問題就是斷詞結果將『韓國瑜』斷成了『韓國』、『瑜』。

這怎麼可以!我可是鋼鐵韓粉欸! 氣急攻心的我一怒之下馬上新建了一個使用者自訂的詞表userDict.txt,並在裡面加入了詞彙和詞頻(省略的情況程式會自動計算應有的詞頻)。

韓國瑜3000 然後再次回到我的程式碼,加入以下這行: jieba.load_userdict('userDict.txt') jieba.load_userdict('userDict.txt') COPY 再次進行斷詞: print(jieba.lcut(text)) print(jieba.lcut(text)) COPY Output: ['總統','蔡英文','論文','風波','延燒','後',',','最','新','民調','今日','出爐','!','據','親藍','民調','公布','結果',',','蔡英文','支持度','45%',',','遙遙領先','韓國瑜','的','33%',',','兩人','差距','擴大到','12','個','百分點','。

','顯示','論文','門','風波',',','並未','重創','小英','聲望','。

'] 沒錯!我大宇宙大統領的韓總的名字終於被Jieba斷對啦!(發病中) 詞性標記(POS) 要使用詞性標記(POS),我們需要另外importjieba底下的pseg 使用方法如下: #-*-coding:utf-8-*- importjieba importjieba.possegaspseg text='我來到北京清華大學' words=pseg.cut(text) forword,flaginwords: print(word,flag) #-*-coding:utf-8-*- importjieba importjieba.possegaspseg text='我來到北京清華大學' words=pseg.cut(text) forword,flaginwords: print(word,flag) COPY Output: 我r 來到x 北京ns 清華x 大學x 至於每個詞性代表著什麼,我在網路上找到了一個網站,也許可以參考一下:https://www.cnblogs.com/chenbjin/p/4341930.html 關鍵字抽取 根據README的說明,關鍵字抽取的方式是使用TF-IDF的計算方法。

這種方法我有實做過,也許哪天可以分享一下。

使用方法如下,跟POS一樣,我們需要importjieba.analyse這個額外的套件。

#-*-coding:utf-8-*- importjieba importjieba.analyse text='總統蔡英文論文風波延燒後,最新民調今日出爐!據親藍民調公布結果,蔡英文支持度45%,遙遙領先韓國瑜的33%,兩人差距擴大到12個百分點。

顯示論文門風波,並未重創小英聲望。

' tags=jieba.analyse.extract_tags(text,topK=5) print(tags) #-*-coding:utf-8-*- importjieba importjieba.analyse text='總統蔡英文論文風波延燒後,最新民調今日出爐!據親藍民調公布結果,蔡英文支持度45%,遙遙領先韓國瑜的33%,兩人差距擴大到12個百分點。

顯示論文門風波,並未重創小英聲望。

' tags=jieba.analyse.extract_tags(text,topK=5) print(tags) COPY Output: ['蔡英文','論文','風波','民調','小英'] topK為返回TF-IDF權重最大的關鍵詞,Default為20。

在這裡我只設定了5。

討論 Jieba的功能還有很多,包括所謂的『並行分詞』等等提升斷詞速度的選項。

這些就留給感興趣的人去試一試了。

另外,如果你覺得直接下載下來的Jieba對於繁體中文的支援不好,Github其實也有提供繁體的中文詞典:https://raw.githubusercontent.com/fxsjy/jieba/master/extra_dict/dict.txt.big 再次說明,我認為各家的斷詞器其實針對不同的語料其實都各有優點,這很可能跟底層的訓練資料有關,大家還是多多嘗試不同的斷詞器,這才能找到最適合自己的工具哦! 分享此文:分享到Twitter(在新視窗中開啟)按一下以分享至Facebook(在新視窗中開啟)分享到LinkedIn(在新視窗中開啟)分享到Reddit(在新視窗中開啟) 相關 Tags:NLPPython LeaveaReply 取消回覆 Language 中文(台灣) English Search Searchfor... CategoriesCategories 選取分類 AndroidStudio  (6) Apple  (39)    AppleScript  (6)    iPad  (3)    MacOS  (36) C/C++  (123)    C  (10)    C++  (114) C#  (1) Computer  (4) CSS  (3) Dart  (3) Database  (9)    MySQL  (6)    SQLite  (2) Excel  (1) Flutter  (44)    IntellijIDEA  (2) Game  (21)    NS  (6)    PS4  (13)    PS5  (2) Git  (10)    Github  (9) GoogleSheets  (3) HTML  (10) Java  (2) JavaScript  (9) Kotlin  (3) LeetCdoe  (97) Linux  (137) MachineLearning  (88)    Keras  (7)    PyTorch  (55)    Scikit-Learn  (7)    Tensorflow  (3) Movie  (1) News  (4) NLP  (29) Novel  (9) Others  (6) PHP  (14) Python  (369)    Flask  (4)    Others  (4)    Packages  (55)    PyCharm  (11)    Pygame  (5)    PyQt5  (35)    PySide6  (4)    PythonTutorial  (17) Ruby  (1) Tools  (16) Unity  (26) VisualStudio  (2) VisualStudioCode  (2) Windows  (12) Word  (5) WordPress  (59) 圍棋  (3) 未分類  (6) 漫畫  (2) 資料結構  (4) 隨筆  (2) Archives Archives 選取月份 2022年6月 (2) 2022年5月 (7) 2022年4月 (18) 2022年3月 (29) 2022年2月 (17) 2022年1月 (28) 2021年12月 (21) 2021年11月 (14) 2021年10月 (20) 2021年9月 (11) 2021年8月 (20) 2021年7月 (24) 2021年6月 (24) 2021年5月 (32) 2021年4月 (26) 2021年3月 (31) 2021年2月 (14) 2021年1月 (18) 2020年12月 (17) 2020年11月 (25) 2020年10月 (24) 2020年9月 (21) 2020年8月 (17) 2020年7月 (21) 2020年6月 (19) 2020年5月 (28) 2020年4月 (31) 2020年3月 (24) 2020年2月 (25) 2020年1月 (32) 2019年12月 (39) 2019年11月 (53) 2019年10月 (34) 2019年9月 (15) 2019年8月 (18) 2019年7月 (15) 系列文章 隨筆散記 機器學習筆記 Python筆記 TAGSAndroidStudio(6) Apple(29) AppleScript(6) C#(1) C++(114) Comic(2) CSS(3) C語言(10) Dart(3) Database(9) Docker(2) Excel(1) Flask(4) Flutter(43) Game(18) Git(6) Github(9) GoogleSheets(3) HTML(10) IntellijIDEA(2) iPad(3) Java(2) JavaScript(10) Keras(7) Kotlin(3) LeetCode(97) Linux(136) MachineLearning(84) MacOS(36) Microsoft(6) Movie(1) MySQL(6) News(4) NLP(30) Novel(9) NS(6) Others(8) PHP(14) PS4(13) PS5(2) PyCharm(11) PyQt5(34) PySide6(3) Python(358) PythonPackages(53) PythonTutorial(14) PyTorch(55) Qt(1) Ruby(1) RuneFactory4(2) Scikit-Learn(7) SQLite(2) Tensorflow(3) Tools(16) Unity(25) VIM(7) VisualStudio(2) VisualStudioCode(2) Windows(9) Word(5) WordPress(58) 圍棋(3) 資料結構(4) 軌跡(4) 隨筆(1) 電腦(4) RecentPosts [已解決]simpletransformers在訓練開始時卡住,不會繼續進行訓練 [Python]字串全形半形轉換方式 [Python]如何取代PandasDataFrame中特定column內的值 SimpleTransformers(1)-基本介紹 [已解決]CommandNotFoundError:Yourshellhasnotbeenproperlyconfiguredtouse'condaactivate'.Toinitializeyourshell,run... Calender 2019年9月 一 二 三 四 五 六 日  1 2345678 9101112131415 16171819202122 23242526272829 30   «8月   10月» SubscriptionName*Email* SocialMedia Follow@clayatlas2022 ClicktoCopy



請為這篇文章評分?