前向,逆向,双向最大匹配算法原理及实现

前向,逆向,双向最大匹配算法原理及实现

前向最大匹配算法
  • 原理

    正向最大匹配算法的基本思想为:假定分词词典中的最长词有个汉字字符,则用被处理文档的当前字串中的前个字作为匹配字段,查找字典。若字典中存在这样的一个字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个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:  # 如果不在词典中同时也
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值