算法描述:
- S1为带切分字符串,S2为空,MaxLen为词典中的最大词长
- 判断S1是否为空,若是则输出S2
- 从S1左边开始,取出待处理字符串str(其中str的长度小于MaxLen)
- 查看str是否在词典中,若是则转5,若否则转6
- S2+=str+”/”,S1-=str,转2
- 将str最右边的一个字去掉
- 判断str是否为单字,若是则转5,若否则转4
Java实现代码:
1 public static List<String> FMM(String text) { 2 List<String> result = new ArrayList<String>(); 3 while (text.length() > 0) { 4 int len = MAX_LENGTH; 5 if (text.length() < len) { 6 len = text.length(); 7 } 8 String tryWord = text.substring(0, 0 + len); 9 while (!DIC.contains(tryWord)) { 10 if (tryWord.length() == 1) { 11 break; 12 } 13 tryWord = tryWord.substring(0, tryWord.length() - 1); 14 } 15 result.add(tryWord); 16 text = text.substring(tryWord.length()); 17 } 18 return result; 19 }
小结:
正向最大匹配算法是中文分词基本算法之一,它分词速度快但是准确度并不高,比如“长春市长春节快乐”用正向最大匹配分出的来得结果是“长春市,市长,节,快乐”,这显然不符合我们的语言习惯,所以在此思想上,我们可以用逆向最大匹配算法来解决此类问题。