MMSeg分詞演算法簡述
MMSeg只是實現了Chih-Hao Tsai的MMSEG演算法,這是一個來源於網路的分詞演算法。我照抄了演算法開始的部分:
MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm
Published: 1996-04-29
Updated: 1998-03-06
Document updated: 2000-03-12
License: Free for noncommercial use
Copyright 1996-2006
我將依據自己的理解來簡述MMSeg分詞演算法的基本原理,如有錯誤請不吝賜教。
首先來理解一下chunk,它是MMSeg分詞演算法中一個關鍵的概念。Chunk中包含依據上下文分出的一組詞和相關的屬性,包括長度(Length)、平均長度(Average Length)、標準差的平方(Variance)和自由語素度(Degree Of Morphemic Freedom)。我在下面列出了這4個屬性的計算方法:
屬性 | 含義 | 程式碼位置 |
長度(Length) | chuck中各個詞的長度之和 | org.solol.mmseg.internal.Chunk.getLength() |
平均長度(Average Length) | 長度(Length)/詞數 | org.solol.mmseg.internal.Chunk.getAverageLength() |
標準差的平方(Variance) | 同數學中的定義 | org.solol.mmseg.internal.Chunk.getVariance() |
自由語素度(Degree Of Morphemic Freedom) | 各單字詞詞頻的對數之和 | org.solol.mmseg.internal.Chunk.getDegreeOfMorphemicFreedom() |
注意:表中的含義列可能有些模糊,最好參照MMSeg的原始碼進行理解,程式碼所在的函式已經給出了。
Chunk中的4個屬性採用Lazy的方式來計算,即只有在需要該屬性的值時才進行計算,而且只計算一次。
其次來理解一下規則(Rule),它是MMSeg分詞演算法中的又一個關鍵的概念。實際上我們可以將規則理解為一個過濾器(Filter),過濾掉不符合要求的chunk。MMSeg分詞演算法中涉及了4個規則:
- 規則1:取最大匹配的chunk (Rule 1: Maximum matching)
- 規則2:取平均詞長最大的chunk (Rule 2: Largest average word length)
- 規則3:取詞長標準差最小的chunk (Rule 3: Smallest variance of word lengths)
- 規則4:取單字詞自由語素度之和最大的chunk (Rule 4: Largest sum of degree of morphemic freedom of one-character words)
這4個規則分別位於org.solol.mmseg.internal.MMRule.java、org.solol.mmseg.internal.LAWLRule.java、org.solol.mmseg.internal.SVWLRule.java和org.solol.mmseg.internal.LSDMFOCWRule.java4個原始檔中。之所以這樣來處理是因為我們可以方便的增加規則和修改應用規則的順序。
這4個規則符合漢語成詞的基本習慣。
再次來理解一下兩種匹配方式,簡單最大匹配(Simple maximum matching)和複雜最大匹配(Complex maximum matching)。
簡單最大匹配僅僅使用了規則1。
複雜最大匹配先使用規則1來過濾chunks,如果過濾後的結果多於或等於2,則使用規則2繼續過濾,否則終止過濾過程。如果使用規則2得到的過濾結果多於或等於2,則使用規則3繼續過濾,否則終止過濾過程。如果使用規則3得到的過濾結果多於或等於2,則使用規則4繼續過濾,否則終止過濾過程。如果使用規則4得到的過濾結果多於或等於2,則丟擲一個表示歧義的異常,否則終止過濾過程。
最後通過一個例句--研究生命起源來簡述一下複雜最大匹配的分詞過程。MMSeg分詞演算法會得到7個chunk,分別為:
編號 | chunk | 長度 |
0 | 研_究_生 | 3 |
1 | 研_究_生命 | 4 |
2 | 研究_生_命 | 4 |
3 | 研究_生命_起 | 5 |
4 | 研究_生命_起源 | 6 |
5 | 研究生_命_起 | 5 |
6 | 研究生_命_起源 | 6 |
使用規則1過濾後得到2個chunk,如下:
編號 | chunk | 長度 |
4 | 研究_生命_起源 | 6 |
6 | 研究生_命_起源 | 6 |
計算平均長度後為:
編號 | chunk | 長度 | 平均長度 |
4 | 研究_生命_起源 | 6 | 2 |
6 | 研究生_命_起源 | 6 | 2 |
使用規則2過濾後得到2個chunk,如下:
編號 | chunk | 長度 | 平均長度 |
4 | 研究_生命_起源 | 6 | 2 |
6 | 研究生_命_起源 | 6 | 2 |
計算標準差的平方後為:
編號 | chunk | 長度 | 平均長度 | 標準差的平方 |
4 | 研究_生命_起源 | 6 | 2 | 0 |
6 | 研究生_命_起源 | 6 | 2 | 4/9 |
使用規則3過濾後得到1個chunk,如下:
編號 | chunk | 長度 | 平均長度 | 標準差的平方 |
4 | 研究_生命_起源 | 6 | 2 | 0 |
匹配過程終止。最終取“研究”成詞,以相同的方法繼續處理“生命起源”。
分詞效果:
Simple ->研究生_命_起源_
Complex->研究_生命_起源_
Simple ->研究生_教育_
Complex->研究生_教育_
注意:Simple表示簡單最大匹配的分詞效果,Complex表示複雜最大匹配的分詞效果。
Update:這是一篇老文,之前放在http://dobestdeveloper.blogspot.com上,現在移到這裡方便大家查閱。