Python 套件比較:繁體中文斷字

Pei Lee
11 min readJun 14, 2017

之前因為專案而開始做繁體中文的文字探勘,嘗試了幾個套件,趁現在有時間想來稍微整理一下,分別有:HanLP、SnowNLP、Stanford NLP、Jieba。以下是簡單的比較表:

其中,HanLP 跟 Stanford NLP 雖然都是 Java 的套件,但還是有辦法用 Python 叫進來使用,可參考之前寫的 HanLPStanford NLP,只是安裝的難度就會稍微比較高一點。

其中似乎只有 Jieba 有支援繁體中文,所以前三個在斷字前還先經過了繁簡轉換,因此執行時間會再長一點。不過 Jieba 的功能就相對單純,比較針對斷字,而 Stanford NLP 則多了句法分析可以用,HanLP再多了繁簡轉換、關鍵字提取跟文章摘要等等,最後是 SnowNLP,又比 HanLP 再多了情緒分析跟文章分類等功能,不過以下只會針對斷字來做比較。

執行效率

我找了五篇網路上的文章,主題分別是:遊記、食記、開箱、裝潢、新聞,分別取一段來做比較。首先,先來看看執行效率:

可以看到 Stanford NLP 明顯慢上非常非常非常多,而 Jieba 跟 HanLP 則是相對效率比較好的。其中,HanLP 需先執行繁簡轉換後再做斷字,如果省下這個步驟也許整體速度會比 Jieba 再優秀。

執行成效

接著是斷字的效果。先說結論:單就斷字而言,個人認為 Jieba 的結果還是優秀許多,但因為套件中的其他功能很多都是綁著斷字的結果,所以除非去改原始碼,不然還是得乖乖用各自內建的斷字功能。

一、首先在遊記,我在這篇文章中取了這段:

travelString = '''
這六七年來重機出遊路線都大同小異,跟車隊環島環了四五次,西部就是跑西濱,東部就是跑台9或台11,偶而再來個縣道193,但景色再美,看久了也會想換換口味~~
直到最近迷上了林道車與路線,就把以前假日都會騎出門的重機都擺在角落,雖然只是騎著大B還沒買到真正的越野車,不過騎這台跟著車友們跑也有相同的樂趣說
瑞岩&紅香部落是車友很早之前就來過的,一直跟我說地方還不錯值得來訪,沿途也順便帶我跑一下"林道"的感覺,本來問說可不可以騎三輪的過去,車友說很勉強~因為要跑林道還有要經過令人聞之色變的"力行產業道路",如果輪胎換成"粗花"或"越野胎"會比較好跑,後來想想就放棄換騎大B前往了 (事實證明決定是對的!!)
'''
  1. 數字跟單位詞:「六七年」、「四五次」

HanLP:「六七」、 「年」、「四五」、「次」

SnowNLP:「六七」、「年」、「四五」、「次」

Stanford NLP:「六七年」、「四五」、「 次」

Jieba:「六七年」、「四五次」。

2. 特殊名詞:「林道車」、「越野車」、「瑞岩」、「紅香」、「粗花」、「越野胎」

HanLP :「林道」、「車與」;「越野車」;「瑞」、「岩」;「紅」、「香」;「粗」、「花」;「越野」、「胎」

SnowNLP :「林道」、「車」;「越野」、「車」;「瑞岩」;「紅」、「香」;「粗」、「花」;「越野」、「胎」

Stanford NLP:「林道」、「車」;「越野車」;「瑞岩&紅香」;「 “粗花”或”越野」、「胎」

Jieba :「林道車」;「越野車」;「瑞岩」;「紅香」;「粗花」;「越野」、「胎」

不過我想這種特殊名詞大多都還是得靠新增詞典來解決問題了。

3. 四字成語:「大同小異」、「聞之色變」。

HanLP:「大同小異」、「令人聞」、「之」、「色」、「變」

SnowNLP:「大同小異」、「聞」、「之」、「色」、「變」

Stanford NLP:「大同小異」、「聞」、「之色」、「變」

Jieba:「大同小異」、「聞之色」、「變」。

4. 複雜句型:「迷上了」、「還沒買到」、「很早之前就來過」、「本來問說可不可以」。

HanLP:「迷上」、「了」;「還」、「沒」、「買到」;「車友很」、「早」、「之前」、「就」、「來過」;「本來」、「問」、「說」、「可不」、「可以」

SnowNLP:「迷」、「上」、「了」;「還」、「沒」、「買」、「到」;「很」、「早」、「之前」、「就」、「來」、「過」;「本來」、「問」、「說」、「可不」、「可以」

Stanford NLP:「迷上」、「了」;「還」、「沒」、「買」、「到」;「很」、「早」、「之前」、「就」、「來過」;「本來」、「問」、「說」、「可」、「不」、「可以」

Jieba:「迷上」、「了」;「還沒買」、「到」;「很早」、「之前」、「就」、「來過」;「本來」、「問說」、「可不可以」

二、食記,取自這裡的一小段

restaurantString = '''
我們去到的時候只有一桌客人,等點完餐點後店內已經是滿滿人潮了
還好來的早,不然大熱天帶著小生物找餐廳真的很麻煩
不過話說以前和老黃兩個人喝咖啡超輕鬆的,發現不錯的咖啡店就直接衝去
完全不需考慮店家有沒有接待小小孩或坐位安排是否合宜的問題
有時鄰坐客人的小孩在哭鬧,心裡總有意無意地嫌小孩吵
反觀現在,遇到無法接待小小孩的店家,多少可以理解不接待的理由
只是內心或多或少還是有些失落,相對地,更感謝那些願意讓小小孩入內用餐的店家及客人的包容 '''
  1. 數字跟單位詞:這部分的結論跟上一篇的差不多,就不贅述了。
  2. 特殊名詞:「大熱天」、「小生物」、「老黃」、「小小孩」

HanLP:「大熱天」;「小」、「生物」;「老黃」;「小小孩」

SnowNLP:「大」、「熱天」;「小生物」;「老黃」;「小」、「小孩」

Stanford NLP:「大」、「熱天」;「小」、「生物」;「老黃」;「小小孩」

Jieba:「大熱天」;「小」、「生物」;「老」、「黃」;「小」、「小孩」

3. 四字成語:「有意無意」、「或多或少」

HanLP、SnowNLP、Stanford NLP、Jieba 都成功分出了這兩個成語。

4. 複雜句型:「還好來的早」、「完全不需考慮店家有沒有接待小小孩」

HanLP:「還好」、「來」、「的」、「早」;「完全」、「不」、「需」、「考慮」、「店家」、「有」、「沒」、「有」、「接待」、「小小孩」

SnowNLP:「還」、「好來」、「的」、「早」;「完全」、「不」、「需」、「考慮」、「店家」、「有」、「沒」、「有」、「接待」、「小」、「小孩」

Stanford NLP:「還」、「好來」、「的」、「早」;「完全」、「不」、「需」、「考慮」、「店家」、「有」、「沒」、「有」、「接待」、「小小孩」

Jieba:「還好」、「來」、「的」、「早」;「完全」、「不需」、「考慮」、「店家」、「有沒有」、「接待」、「小」、「小孩」

三、開箱文,取自這裡

vaccumString ='''
原先是看剛推出不久的V8 Fluffy,發現V8吸頭完全不共用,價位又偏高
改看V6 Fluffy,幾乎確定要買了,但在老婆建議先看看Fluffy的評價
發現Fluffy對大一點垃圾與毛髮好用、但吸塵力略遜於電動碳纖刷頭
讓我猶豫了起來,甚至看了數字先生推的小綠,感覺更差不值那個價...
'''
  1. 特殊名詞:「V8」、「吸塵力」、「電動碳纖刷頭」、「小綠」

HanLP:「V」、「8」;「吸」、「塵」、「力」;「電動」、「碳」、「纖」、「刷」、「頭」;「小綠」

SnowNLP:「V8」;「吸塵」、「力」;「電動」、「碳」、「纖刷」、「頭」;「小」、「綠」

Stanford NLP:「V」、「8」;「吸塵」、「力」;「電動」、「碳」、「纖刷頭」;「小」、「綠」

Jieba:「V8」;「吸塵」、「力略」;「電動」、「碳纖刷頭」;「小」、「綠」

2. 複雜句型:「原先是看剛推出不久的」

HanLP:「原」、「先是」、「看」、「剛」、「推出」、「不久」、「的」

SnowNLP:「原先」、「是」、「看剛」、「推出」、「不久」、「的」

Stanford NLP:「原先」、「是」、「看」、「剛」、「推出」、「不久」、「的」

Jieba:「原先」、「是」、「看剛」、「推出」、「不久」、「的」

四、裝潢,取自這裡

decoString = '''
因為我本身很愛很愛粉紅色,老公也早在婚前就答應以後房子的布置規畫全部依我,
所以我也盡可能的在不要太超過(?!)的情況下,要求設計師把牆面漆成粉紅色,
而溫馨的鄉村風一直是我們夫妻倆喜愛的裝潢風格,
但不喜歡鄉村風常見小碎花,也不要太多雜物感,
只保留鄉村風經典的線板跟文化石,其實有點偏像北歐風格了,
但整體感覺又比極簡的北歐風多了一點點溫暖,暫且就歸類在輕鄉村吧!
'''

1. 特殊名詞:「鄉村風」、「小碎花」、「線板」、「文化石」、「輕鄉村」

HanLP:「鄉」、「村風」;「小」、「碎」、「花」;「線板」;「文化石」;「輕」、「鄉村」

SnowNLP:「鄉村」、「風」;「小碎」、「花」;「的線」、「板」;「文化石」;「在輕」、「鄉村」

Stanford NLP:「鄉村」、「風」;「小」、「碎」、「花」;「線板」;「文化」、「石」;「輕」、「鄉村」

Jieba:「鄉」、「村風」;「小」、「碎花」;「線板」;「文化」、「石」;「輕」、「鄉村」

2. 複雜句型:「我也盡可能的在不要太超過(?!)的情況下」

HanLP:「我」、「也」、「盡可能」、「的」、「在」、「不要」、「太」、「超過」、「(?!)」、「的」、「情況」、「下」

SnowNLP:「我」、「也」、「盡可能」、「的」、「在」、「不要」、「太」、「超過」、「(?!)」、「的」、「情況」、「下」

Stanford NLP:「我」、「也」、「盡可能」、「的」、「在」、「不要」、「太」、「超過」、「(」、「?」、「!」、「)」、「的」、「情況」、「下」

Jieba:「我」、「也」、「盡」、「可能」、「的」、「在」、「不要」、「太」、「超過」、「(」、「?」、「!」、「)」、「的」、「情況」、「下」

五、新聞,取自這裡

newsString = '''
同性到底可不可以結婚?這個議題引發爭議多年,大法官今針對台北市政府、同志運動先驅祁家威聲請的同性婚姻釋憲案,作出釋字第748號解釋,並首度同步發出英文版釋憲文,宣告《民法》不允許同性結婚的規定違憲,主管機關應以法律保障同婚,等於宣告台灣成為亞洲第一個以法律保障同性婚姻的國家,但大法官並未指明應另立專法或修改《民法》保障同婚權益。'''

1. 特殊名詞:「大法官」、「台北市政府」、「祁家威」、「同性婚姻」、「釋憲案」、「釋字」、「釋憲文」、「民法」、「違憲」、「主管機關」、「同婚」、「專法」

HanLP:「大法官」;「台北市政府」;「祁家」、「威聲」;「同性」、「婚姻」;「釋憲案」;「釋字第」;「釋憲文」;「民法」;「違憲」;「主管機關」;「同」、「婚」;「專」、「法」

SnowNLP:「大法官」;「台北市」、「政府」;「祁家」、「威聲」;「同性」、「婚姻」;「釋」、「憲案」;「釋」、「字」;「釋」、「憲」、「文」;「民法」;「違」、「憲」;「主管」、「機關」;「同婚」;「專法」

Stanford NLP:「大法官」;「台北」、「市政府」;「祁」、「家」、「威」;「同性」、「婚姻」;「釋」、「憲」、「案」;「釋」、「字」;「釋」、「憲」、「文」;「民法」;「違憲」;「主管」、「機關」;「同」、「婚」;「專」、「法」

Jieba:「大法官」;「台北市」、「政府」;「祁家」、「威聲」;「同性」、「婚姻」;「釋憲案」;「釋字」;「釋憲文」;「民法」;「違憲」;「主管機關」;「同婚」;「專法」

結論

整體看起來,雖然 Jieba 在一些小地方斷得沒有其他的好,但應該算是效果最符合預期的一個了,而且它好安裝又跑得快,單純做斷詞的話應該會是我的首選。

第二個大概會選擇 HanLP,斷詞的結果也還算漂亮,雖然不好安裝,但執行速度算是跟 Jieba 相差不多。第三個會是 SnowNLP,雖然覺得它斷詞不夠漂亮,但因為它有情緒分析以及文章分類的功能,覺得往後應該還是會有不得不用它的時候。

最後一個才是 Stanford NLP,斷得不漂亮,只要碰到沒聽過的詞,似乎傾向把它們拆成一個一個字,而且又難安裝,執行速度也慢,功能也沒有前兩個多……所以中文自然語言處理可能不會用到它,不過它英文的做出來的某些效果其實還不錯,所以英文的話也許還是有考慮的機會。

--

--