中文分词的正向及逆向最大匹配算法

中文分词的正向及逆向最大匹配算法

不同于英文,汉语的句子是单词的组合,除标点符号外,并不存在分隔符,这是中文分词的难点所在。


分词的第一步是获得词汇表,中文词汇存在叠词现象,例如:
中文分词的正向及逆向最大匹配算法
词汇表越大,分词歧义性出现的可能越大,所以需要在词汇表的规模和最终分词结果之间找到平衡点。


1. 基于正向最大匹配算法

2. 基于逆向最大匹配算法

基于匹配规则分词采用固定的规则对输入文本进行分割,使得每一部分都是词表中的单词,正向匹配算法是其中一种常用的方法,原理是,文本中出现的词一般是可以匹配的最长候选词,例如上文提到“鞭炮声响彻夜空”,鞭炮和鞭炮声都是合理的单词,这里会选择更长的单词“鞭炮声”,并最终分割为“鞭炮声 |响彻 | 夜空”。具体而言,正向匹配算法从第一个汉字开始,,每次尝试匹配句子里存在于词表中最长的单词,随后处理下一个词。当然,这一过程不需要每次都查找词表,可以使用哈希表高效匹配。

但是算法存在于缺陷,例如:
中文分词的正向及逆向最大匹配算法
因为“为人”也是一个词,所以使用正向匹配算法会切分成:
中文分词的正向及逆向最大匹配算法
另一种方法——逆向最大匹配算法改变了匹配的顺序,即从后往前进行最大匹配,寻找词表中最长的单词,可以正确切分类似“为人民服务”这种句子。

统计结果表明,逆向最大匹配算法的错误率为1/245;正向最大匹配算法的错误率为1/169。

以下为逆向最大匹配算法实例

s = "今天天气真不错"
vocab = ['天气','今天','昨天','真','不错','真实','天天']
def backward_max_matching(s,vocab):
	result = []
	end = len(s)
	while end > 0:
		found = False
		for start in range(end):
			if s[start:end] in vocab:
				//找到最长匹配的单词,放在分词结果最前面
				result = [s[start:end]] + result 
				found = True
				break
		if found:
			end = start
		else:
			//没找到匹配单词,但单字作为词分出
			result = [s[end-1]] + result
			end -= 1
	print(result)

中文分词的正向及逆向最大匹配算法

上一篇:Java项目:精品养老院管理系统(java+Springboot+Maven+mybatis+Vue+Mysql)


下一篇:Leetcode 494. 目标和(中等)回溯算法