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

本文介绍了中文分词的挑战,特别是词汇表的选择和大小对歧义的影响。讨论了正向最大匹配和逆向最大匹配两种常见算法,包括它们的工作原理和优缺点。通过实例展示了如何运用这两种算法进行分词。逆向最大匹配算法在处理句子如'为人民服务'时能避免错误,其错误率低于正向匹配算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


分词的第一步是获得词汇表,中文词汇存在叠词现象,例如:
在这里插入图片描述
词汇表越大,分词歧义性出现的可能越大,所以需要在词汇表的规模和最终分词结果之间找到平衡点。


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)

逆向最大匹配分词结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值