跳到主要內容

Concise's Anatomy: MMSeg中文分詞


這些天一直在弄Concise中一項相當重要,卻又相當麻煩的功能——中文分詞。

在西方主導的語言學當中,單詞是語言的基本單位。英文、法文、德文等西方語言中的單詞多能以空格作為邊界來區分;但是熟悉中文的使用者都知道,在中文的書寫系統中,並不存在這種邊界。每個中文字、每個漢字都可能是一個單詞,甚至同樣的排列,依據不同的語氣來閱讀,會有不同的意思。從前在國中時,最常被拿來開玩笑的就是徐志摩的那句「數大便是美」,究竟是「數 | 大 | 便是 | 美」?或是「數 | 大便 | 是 | 美」?兩者的意思差了十萬八千里。



這個狀況讓我們在開始使用Concise之前就遇到了困境。那麼,到底怎麼樣算是一個單詞?這涉及中文分詞的技術。截至目前為止,還沒有研究團隊宣稱能完全掌握中文分詞,我只能夠從現有的幾個選擇中選出一個比較能接受的。

之前的Concise,我寫了一個介面連結到Yahoo的斷章取義,以及中央研究院的中文斷詞小組,借用遠端的服務來轉換成Concise的格式。這個方法是可行的,但是有一些限制在。首先,兩個系統都看不到分詞的過程是怎麼進行的,沒有詳細的演算法,就算對結果不滿意,也只能從傳回的資料再去想辦法。此外,對於多數研究要使用的專門語料庫,這兩個系統的API沒辦法載入外部的詞典。

為了處理這些東西,我決定找一個可用的分詞演算法,直接嵌入Concise當中。MMSeg成了我的選擇。如果你用C語言在寫程式,可以直接從演算法下方下載C語言的程式碼。至於Concise使用的Java,則可以從mmseg4j下手。

MMSeg的原理很簡單,先把文章斷成句子,再從句子裡頭去切分單詞。它的運作仰賴四個規則:

規則1:最大匹配。
規則2:最大平均單詞長度。
規則3:單詞長度的最小方差。
規則4:單字單詞的語素自由度的最大和。

詳細的介紹請看MMSeg的官方介紹,或自行下載程式碼看實際的運作過程。

MMSeg4j的另一個特點,就是能載入自訂的詞庫,比起泛用型的中文分詞服務,應當更適合專注於特殊領域的研究使用。原本內嵌於mmseg4j的辭典是搜狗(sogou)從網路環境擷取的,用在簡體中文的語境中好像滿OK的。但是用在繁體的語境,特別是台灣的中文語境當中,分詞好像怪怪的。於是我把裡面的字頻檔char.dic和辭典words.dic換成教育部所公佈的字頻和詞頻表。換過之後,好像好多了。不過還是不夠理想,比方說,名字似乎沒辦法辨識。最大的要素應當是教育部所收錄的常用單詞太少了,之後得增加一些詞庫來使用。

這個功能目前還在測試中,將會在下一個版本中嵌入。

留言

熱門文章

差不多食譜:萬聖節的蛋白霜幽靈們 Halloween Meringue Ghosts

說到十月,月底的萬聖節肯定是驚嚇指數最高的一天,到處飄忽的幽靈們更是西洋鬼節的主角。不甘心這天總是被 Trick-or-Treat(不給糖就搗蛋)威脅,差不多食譜今年要開始來反擊,邀請大家來當 Ghostbusters 魔鬼剋星,將這群調皮搗蛋的幽靈們一網打盡。 抓鬼的先決條件就是⋯⋯得有些幽靈鬼怪來抓。這可是練習擠花的好時機,因為幽靈本來就是奇形怪狀的,什麼樣的怪樣子都不奇怪,太精緻反而有點奇怪呢!做好直送嘴巴「喀嚓」,看它還敢不敢來 Trick-or-Treat!

差不多食譜:蜂蜜烤南瓜 Roasted Pumpkin with Honey

還記得差不多食譜分享過用煎的南瓜吧!那是屬於家常菜的做法,現在差不多食譜推出另外一種做法,淋上蜂蜜,用烤箱加上精緻的裝飾,讓家常菜變身成為派對食物。相信當你端出這盤「蜂蜜烤南瓜」時,肯定會吸引不少眼球的注意。

金門。毋忘在莒勒石 “Wu Wang Zai Jyu” Inscription

金門有塊石頭,不去看看感覺怪怪的,看了又覺得實在沒什麼。聰明的你應該猜到了,就是那塊出現在教科書裡頭的「毋忘在莒」,金門的象徵。印象中,刻著「毋忘在莒」的那塊大石頭旁邊光禿禿的。或許從小學畢業二十多年後,我頭一次有機會來拜見這塊石頭,旁的小樹苗已經長成這副模樣了吧!再過幾年,恐怕要在林蔭中尋找「毋忘在莒」這四個字。但真要問起「毋忘在莒」這四個字是什麼意思,我相信不少人需要稍微想一下。