中文分词的正向及逆向最大匹配算法
作者:互联网
中文分词的正向及逆向最大匹配算法
不同于英文,汉语的句子是单词的组合,除标点符号外,并不存在分隔符,这是中文分词的难点所在。
分词的第一步是获得词汇表,中文词汇存在叠词现象,例如:
词汇表越大,分词歧义性出现的可能越大,所以需要在词汇表的规模和最终分词结果之间找到平衡点。
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)
标签:逆向,end,单词,算法,result,匹配,分词 来源: https://blog.csdn.net/qq_34468890/article/details/123206632