[NLP][Python] 透過ckiptagger 來使用繁體中文斷詞的最佳工具 ...
文章推薦指數: 80 %
中研院的繁體中文斷詞系統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
延伸文章資訊
- 1Python – GKIPtagger – 國產斷詞工具
在安裝下面套件之前請先在你的conda env 安裝tensorflow,版本介於1.13 - 2.0 //標準- 我選擇這個安裝pip install -U ckiptagger[tf,gdo...
- 2ckiplab/ckiptagger: CKIP Neural Chinese Word ... - GitHub
CkipTagger is a Python library hosted on PyPI. Requirements: python>=3.6; tensorflow>=1.13.1 / te...
- 3中研院開源NLP套件「CKIPtagger」,繁中不結巴. 雙十假日有 ...
完整安裝:pip install -U ckiptagger[tfgpu,gdown]. 差別就在於要不要裝「Tensorflow」與「gdown」這兩個套件,由於我本身的環境已經有 ...
- 46. 中文斷詞工具:CkipTagger
CkipTagger 為台灣中央研究院詞庫小組所開發的NLP(自然語言處理) 套件,是個以深度學習模型為基礎而成的NLP(自然語言處理) 應用。 · 在繁體中文上斷詞與詞性標記的表現 ...
- 5詞性標記、實體辨識的一站式中文處理開源套件- CkipTagger
目前有五個主要研究方向:深度學習、自然語言理解、知識表達、知識擷取、聊天機. 器人。 中研院詞庫小組(CKIP). Page 3. CkipTagger Developers.