分词-前向最大匹配算法

前向最大匹配算法(Forward Max Match)

依赖于词典匹配

# 前提条件

语句已经去掉特殊标点符号
需要预先设置一个字典,然后根据字典进行匹配

# 算法原理

首先我们可以规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,
如果没有找到,就缩短长度继续寻找,直到找到或者成为单字。如果最后词典没找到变成了单字,那就把单字单独切分,从头开始重新循环下一个最大长度的词组。如果剩余长度不足为最大长度,那就取剩余长度。

从左向右扫描寻找词的最大匹配,和字符串匹配算法类似。

这里有张图很清晰的表示出了过程

部分操作过程演示:

 

 

 实现:

  1. 对输入的一个中文语句,首先在程序中判断并确保语句中不包含数字或者字母
  2. 在句子中的当前位置开始取与词典中最大匹配长度的词作为一个分词段,如果没有在词典中成功匹配到,就将这个单字作为一个分词段,并将匹配位置向后挪一个位置,同时如果剩余长度小于最大长度,那就取剩余的
  3. 重复第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

posted @ 2019-10-31 09:57  谦曰盛  阅读(1739)  评论(0编辑  收藏  举报