[NLP][Python] 透過ckiptagger 來使用繁體中文斷詞的最佳工具 ...

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

中研院的繁體中文斷詞系統CKIP 終於開源在Github 上了,名稱就叫做ckiptagger 。

我迫不及待地馬上進行了試用,也順便在這裡分享了下我試用的心得。

[NLP][Python]透過ckiptagger來使用繁體中文斷詞的最佳工具CKIP Clay2019-09-242021-03-305CommentsNLP,Python 在繁體中文的自然語言處理(NLP)當中,CKIP無疑是斷詞最精準、最負盛名的工具。

這項工具是由台灣中研院資訊所、語言所於民國75年成立的中文語言言小組所開發,也在多個中文斷詞的比賽當中得過獎項。

之前由於CKIP一直沒有開源,導致需要前往官方的Demo網站試用(https://ckip.iis.sinica.edu.tw/demo/),或者是寄信取得授權,可以使用下載版的CKIP一個月,看是要直接使用bat檔,或是使用Python另外調用。

所幸,在前不久(2019/09/04),CKIP終於開放了原始碼,程式也已經放上了Github:https://github.com/ckiplab/ckiptagger 今天,我就來簡單介紹一下該如何使用這套開源的工具吧。

前置作業 要使用CKIP(CkipTagger),這套工具,首先你需要有至少為3.6版的Python,以及tensorflow、gdown等等套件。

(注意:tensorflow>=1.13.1,必須要<2。

CPU版本跟GPU版本都適用。

) 我們可能需要安裝這些套件: pip3installckiptagger pip3installtensorflow pip3installgdown 其中,gdown是一個我們平常比較少用的套件,其功能為從googledrive上載下模型。

都裝好之後,我們開啟一個Python檔,在裡面寫下: #-*-coding:utf-8-*- fromckiptaggerimportdata_utils data_utils.download_data_gdown("./") #-*-coding:utf-8-*- fromckiptaggerimportdata_utils data_utils.download_data_gdown("./") COPY 這會自動開始下載模型data.zip到我們當前目錄底下。

下載好之後,我們就可以把這些指令刪掉了。

以下開始介紹該怎麼使用斷詞、詞性標記(POS)、命名實體識別(NER)。

斷詞、POS、NER 請原諒我這三種不同的NLP任務一起講,因為程式實在很短,加上CKIP的NER需要POS產生的結果。

這點倒是跟處理英文語料的NLTK很像。

#-*-coding:utf-8-*- fromckiptaggerimportWS,POS,NER text='傅達仁今將執行安樂死,卻突然爆出自己20年前遭緯來體育台封殺,他不懂自己哪裡得罪到電視台。

' ws=WS("./data") pos=POS("./data") ner=NER("./data") ws_results=ws([text]) pos_results=pos(ws_results) ner_results=ner(ws_results,pos_results) print(ws_results) print(pos_results) fornameinner_results[0]: print(name) #-*-coding:utf-8-*- fromckiptaggerimportWS,POS,NER text='傅達仁今將執行安樂死,卻突然爆出自己20年前遭緯來體育台封殺,他不懂自己哪裡得罪到電視台。

' ws=WS("./data") pos=POS("./data") ner=NER("./data") ws_results=ws([text]) pos_results=pos(ws_results) ner_results=ner(ws_results,pos_results) print(ws_results) print(pos_results) fornameinner_results[0]: print(name) COPY Output: [['傅達仁','今','將','執行','安樂死',',','卻','突然','爆出','自己','20','年','前','遭','緯來','體育台','封殺',',','他','不','懂','自己','哪裡','得罪到','電視台','。

']] [['Nb','VJ','Na','Nd','D','VC','VA','D','VH','VH','COMMACATEGORY','D','D','VH','VH','VC','P','Nh','Neu','Neu','Nf','Ng','P','Na','VA','Na','VC','Nc','VC','VC','COMMACATEGORY','Nh','D','VK','P','Nh','Nep','Ncd','VJ','Na','P','Na','P','Nc','PERIODCATEGORY']] (0,3,'PERSON','傅達仁') (18,22,'DATE','20年前') 首先我們需要在程式中匯入WS、POS、NER,這分別是斷詞、詞性標記、命名實體識別的三個工具。

我進行的句子為Github所給的範例。

我本來想要用自己找的新聞,可惜發現其NER的效果並不好,故還是用回了Github給的範例。

緊接著,我們將三份工具的模型路徑指向我們剛才下載的data.zip: ws=WS("./data") pos=POS("./data") ner=NER("./data") ws=WS("./data") pos=POS("./data") ner=NER("./data") COPY 然後我們就可以使用這三種工具分析我們的文本了。

ws_results=ws([text]) pos_results=pos(ws_results) ner_results=ner(ws_results,pos_results) ws_results=ws([text]) pos_results=pos(ws_results) ner_results=ner(ws_results,pos_results) COPY 切記!ner()需要接受兩個參數,一個是我們的文本斷詞結果,另一個是POS的結果。

我們可以看到以下輸出的結果: [['傅達仁','今','將','執行','安樂死',',','卻','突然','爆出','自己','20','年','前','遭','緯來','體育台','封殺',',','他','不','懂','自己','哪裡','得罪到','電視台','。

']] [['Nb','VJ','Na','Nd','D','VC','VA','D','VH','VH','COMMACATEGORY','D','D','VH','VH','VC','P','Nh','Neu','Neu','Nf','Ng','P','Na','VA','Na','VC','Nc','VC','VC','COMMACATEGORY','Nh','D','VK','P','Nh','Nep','Ncd','VJ','Na','P','Na','P','Nc','PERIODCATEGORY']] (0,3,'PERSON','傅達仁') (18,22,'DATE','20年前') 第一列為斷詞的結果。

第二列為POS的詞性。

詞性表也許可以參考中研院自己的整理:http://ckipsvr.iis.sinica.edu.tw/cat.htm 第三列為NER的結果,我們可以看到分別抓出了『傅達仁』這個『人物』,以及『20年前』這個『時間』。

大家也可以盡量去使用CKIP,享受最精準的斷詞結果! 感想 我很高興看到CKIP開源了,目前正在計畫有空的時候好好閱讀它的原始碼。

但說真的,我目前只有使用tensorflow的CPU版本,不得不說這玩意兒還挺慢的,或許我該找一天測試看看GPU版本是不是比較好用、比較快。

(通常都是。

) 另外,另要挑毛病的話就是NER挑出的名詞其實我是有點錯愕的。

常常會只有人物的姓氏被挑出來,而名字沒有。

我猜想也許我該研究一下能不能加詞典,增進它斷詞的結果。

畢竟NER看起來效果不夠好多半是因為斷詞沒有把人物名字完全斷對。

另外,聽說Linux系統上可以試用ckipnlp這個工具,裡面甚至有包含句法結構的parser功能,也許我也該找一天來好好測試。

期待CKIP變得更好! References https://ckip.iis.sinica.edu.tw/https://github.com/ckiplab/ckiptaggerhttps://ckip.iis.sinica.edu.tw/service/ckiptagger/ ReadMore [NLP][Python]中文斷詞最方便的開源工具之一:Jieba 分享此文:分享到Twitter(在新視窗中開啟)按一下以分享至Facebook(在新視窗中開啟)分享到LinkedIn(在新視窗中開啟)分享到Reddit(在新視窗中開啟) 相關 Tags:NLPPython 5thoughtson“[NLP][Python]透過ckiptagger來使用繁體中文斷詞的最佳工具CKIP” 反指標大師 2021-05-27at11:04 (0,3,‘PERSON’,‘傅達仁’) (18,22,‘DATE’,’20年前’) 你好請問要如何把前面數字刪除只要‘PERSON’,‘傅達仁’‘DATE’,’20年前’ Reply Clay 2021-05-27at11:19 以下是段範例程式碼: item=(0,3,‘PERSON’,‘傅達仁’) new_item=item[2:] print(new_item) 這是只取tuple從序列2開始到結束的值,所以你應該能看到(0,3)這樣的位置資訊消失了。

Reply Jason 2021-08-12at12:47 作者您好,我是MacbookM1使用者,在按照作者指示操作後,卻一直跑出restartingkernel…的字樣,想請問該如何解。

此外,如果使用.txt檔案裝進我需要分析的文本,請問該怎麼寫下這份代碼。

有勞解答,非常感謝 Reply 匿名訪客 2021-08-12at12:51 (注意:tensorflow>=1.13.1,必須要<2。

CPU版本跟GPU版本都適用。

) 我是直接透過終端機執行pipinstalltensorflow,不曉得有沒有影響 Reply Clay 2021-08-12at13:53 我沒遇過這個問題,但查了一下後發現網路上有對岸網友表示他是在JupyterNotebook上跑程式時遇到這個問題,調整了tensorflow版本後才能正常運作。

可以使用piplist來確認當前安裝的套件版本,安裝時也可以指定版本安裝。

假設你希望安裝1.13.1版,可以使用pipinstalltensorflow==1.13.1這樣的指令來安裝。

至於該如何裝進分析的文本到.txt檔……這個,由於我不清楚你打算如何處理斷句,所以也只能大概說明一下。

基本上就是將你想要分析的文本放在txt檔,假設叫做data.txt。

然後將我程式碼中的: text='傅達仁今將執行安樂死,卻突然爆出自己20年前遭緯來體育台封殺,他不懂自己哪裡得罪到電視台。

' 更改為: text=open("data.txt","r",encoding="utf-8").read() Reply 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



請為這篇文章評分?