Last Updated on 2021-04-03 by Clay
說實話,我好久沒用到這個工具了,最近突然有這種需要,便挖出以前研究過的程式碼,並開始尋找是否有我當初沒有測試過的功能,順便紀錄成筆記。
有時候會想,若是當初有像現在這樣紀錄筆記該有多好,能夠留點東西給自己、方便查詢。
當初使用 Thulac,是因為指導教授叫我們使用各種不同的斷詞器試試效果如何。要我說的話,當初 Thulac 的斷詞精準度確實震撼到了我 —— 是的!在當初我們分析的文本上,我雖然只是匆匆看過,但總覺得比 Jieba 來得精準。(那時候 CKIP 還沒有開源在 Github 上,要用的話的確是可以用,但會麻煩一點。如果想參考如何使用 CKIP,可以參考這裡:NLP 繁體中文斷詞的霸主 —— CKIP)
但其實那也只是在那個文本中表現較好,其實也並不是說真的比 Jieba 強。至少速度方面, Jieba 的速度是真的真的很快。(如果想參考怎麼使用 Jieba 這個斷詞工具,可以參考:NLP 中文斷詞最方便的開源工具之一 —— Jieba)
還是回到我們今天的主題 —— Thulac 吧。
Thulac 是由 《清华大学自然语言处理与社会人文计算实验室》 這樣著名的實驗室所開發的。理所當然,Thulac 對於簡體中文的斷詞效果會比較好。
如果你想要試用 Thulac 的效果,也許你可以直接去線上的 Demo 網站: http://thulac.thunlp.org/demo
如果你想要看如何透過 Python 呼叫這個工具。那麼,以下我們就開始實際講解開如何使用 Thulac 吧。
前置作業
首先,我們必須在 Python 的環境中安裝 thulac。這樣有個好處,就是會自動下載模型到你安裝的路徑,我們就不用再費心多試一次了。
pip3 install thulac
斷詞
詞性標記
這兩種功能可以一起講沒關係,畢竟只要使用 cut() 函式就會一同跑出結果。
以下我們來看段簡單的 sample code:
# -*- coding: utf-8 -*- from opencc import OpenCC import thulac cc = OpenCC('tw2sp') text = '傅達仁今將執行安樂死,卻突然爆出自己20年前遭緯來體育台封殺,他不懂自己哪裡得罪到電視台。' text = cc.convert(text) thu = thulac.thulac() print(thu.cut(text))
Output:
Model loaded succeed
[['傅达仁', 'np'], ['今将', 'd'], ['运行', 'v'], ['安乐', 'ns'], ['死', 'v'], [',', 'w'], ['却', 'd'], ['突然', 'a'], ['爆出', 'v'], ['自己', 'r'], ['20', 'm'], ['年', 'q'], ['前', 'f'], ['遭', 'v'], ['纬', 'g'], ['来', 'v'], ['体育台', 'n'], ['封杀', 'v'], [',', 'w'], ['他', 'r'], ['不', 'd'], ['懂', 'v'], ['自己', 'r'], ['哪', 'r'], ['里', 'q'], ['得罪', 'v'], ['到', 'v'], ['电视台', 'n'], ['。', 'w']]
首先,我們需要 import thulac 這個套件。然後,我使用 OpenCC 將我的範例文本轉成簡體,剛才上方也提到了, Thulac 對於簡體中文的支援較好。
我們可以看到,cut() 的結果為『詞』-『詞性』這樣一對 pair 的組合。如果你只想要斷詞的結果,要嘛自己使用 for-loop 只印出詞的部份;要嘛直接修改程式碼如下。
thu = thulac.thulac(seg_only=True)
更改了初始化的 seg_only 參數為 True,這樣我們產生的結果就會只有斷詞結果了。
補充說明
Thulac 似乎沒有什麼特別的功能,它就是專心在斷詞上,然後做得很精。若是想要更好的斷詞結果的話,其實可以寫信跟他們索取更好的模型,這件事我同學就有做過。
可以參考 Thulac 的 Github: https://github.com/thunlp/THULAC-Python