前向最大匹配算法(Forward Max Match)
依賴於詞典匹配
# 前提條件
語句已經去掉特殊標點符號
需要預先設置一個字典,然后根據字典進行匹配
# 算法原理
首先我們可以規定一個詞的最大長度,每次掃描的時候尋找當前開始的這個長度的詞來和字典中的詞匹配,
如果沒有找到,就縮短長度繼續尋找,直到找到或者成為單字。如果最后詞典沒找到變成了單字,那就把單字單獨切分,從頭開始重新循環下一個最大長度的詞組。如果剩余長度不足為最大長度,那就取剩余長度。
從左向右掃描尋找詞的最大匹配,和字符串匹配算法類似。
部分操作過程演示:

實現:
- 對輸入的一個中文語句,首先在程序中判斷並確保語句中不包含數字或者字母
- 在句子中的當前位置開始取與詞典中最大匹配長度的詞作為一個分詞段,如果沒有在詞典中成功匹配到,就將這個單字作為一個分詞段,並將匹配位置向后挪一個位置,同時如果剩余長度小於最大長度,那就取剩余的
- 重復第2步,直到匹配位置移到句末
// 主體代碼 java
public List<String> seg(String text) {
List<String> result = new ArrayList<>();
while(text.length() > 0) {
int len = MAX_LENGTH;
if (text.length() < len) {
len = text.length();
}
// 取指定的最大長度的文本去詞典里匹配
String tryWord = text.substring(0, 0 + len);
while(!DIC.contains(tryWord)) {
// 如果長度為1 且在詞典中為找到匹配, 則按長度為1切分
if (text.length() == 1) {
break;
}
// 如果找不到,則按長度減1 繼續切分
tryWord = tryWord.substring(0, tryWord.length() - 1 );
}
result.add(tryWord);
// 從待分詞文本中去除已經分詞的文本
text = text.substring(tryWord.length());
}
return result;
}
注意點:
匹配的長度可以自行設置,但是一般盡量控制在10以內。
中文字符編碼 utf8 需要讀入數據時就確定。
參考資料:
https://blog.csdn.net/zhmmx/article/details/72886942
