前向,逆向,双向最大匹配算法原理及实现
前向最大匹配算法
-
原理
正向最大匹配算法的基本思想为:假定分词词典中的最长词有个汉字字符,则用被处理文档的当前字串中的前个字作为匹配字段,查找字典。若字典中存在这样的一个字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个1字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理。如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。
其算法描述如下:
1)从左向右取待切分汉语句的m个字符作为匹配字段,m为机器词典中最长词条的字符数。
2)查找机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切分出所有词为止。 -
例子:
例子:我们经常有意见分歧 词典:['我们', '经常', '有', '有意见', '意见', '分歧'] 假设窗口大小为5 ①[我们经常]有意见 × [我们经常] × [我们经] × [我们] √ ②[经常有意见] × [经常有意] × [经常有] × [经常] √ ③[有意见分歧] × [有意见分] × [有意见] √ ④[分歧] 最终分词: 我们|经常|有意见|分歧
-
代码实现
words_dic = [] # 将字典载入进来,先要申请一个列表 def _init_(): # 读取词典文件,载入词典 with open('dic/dic.txt', 'r', encoding='utf-8') as dic_input: for word in dic_input: words_dic.append(word.strip()) # 实现正向最大匹配算法中的切词 def cut_words(raw_sentence, words_dic): # 原始的文本句子(最长的序列),字典 # 统计词典中最长的词 max_length = max(len(word) for word in words_dic) # 对词典中的词进行遍历,选取最大的词 sentence = raw_sentence.strip() # 去掉文本中的空格或者换行符等 # 统计序列长度,这是要进行切的文本 words_length = len(sentence) # 存储切分词语 cut_word_list = [] while words_length > 0: max_cut_length = min(max_length, words_length) # 选取最小值作为首次匹配长度 subSentence = sentence[0:max_cut_length] # 切片 while max_cut_length > 0: if subSentence in words_dic: # 判断是否在词典中.. cut_word_list.append(subSentence) # 在字典尾部添加切好的词 break elif max_cut_length == 1: # 如果切分长度为1,则这个词为单词,也要将其添加进字典 cut_word_list.append(subSentence) break else: # 如果不在词典中同时也