zoukankan      html  css  js  c++  java
  • 中文分词:正向匹配最大算法(FMM)

    中文分词:正向匹配最大算法

    正向最大匹配法,对于输入的一段文本从左至右、以贪心的方式切出当前位置上长度最大的词。正向最大匹配法是基于词典的分词方,其分词原理是:单词的颗粒度越大,所能表示的含义越确切。该算法主要分两个步骤:

    • 1、一般从一个字符串的开始位置,选择一个最大长度的词长的片段,如果序列不足最大词长,则选择全部序列。
    • 2、首先看该片段是否在词典中,如果是,则算为一个分出来的,如果不是,则从右边开始,减少一个字符,然后看短一点的这个片段是否在词典中,依次循环,逐到只剩下一个字。
    • 3、序列变为第2步骤截取分词后,剩下的部分序列

    代码实现

    #使用正向最大匹配算法实现中文分词
    words_dic = []
    
    def init():
        '''
        读取词典文件
        载入词典
        :return:
        '''
        with open(r"C:UserslenovoPycharmProjectsfencivenvdicdic.txt","r",encoding="utf-8") as dic_input:
            for word in dic_input:
                words_dic.append(word.strip())#列表
    
        #实现正向匹配算法中的切词方法
    def cut_words(raw_sentence,word_dict):
        #统计词典中最长的词
        max_length = max(len(word) for word in words_dic)
        sentence = raw_sentence.strip()
        #统计序列长度
        word_length = len(sentence)
        #存储切分好的词语
        cut_word_list = []
        while word_length > 0:
            max_cut_length = min(max_length,word_length)#判断最长词语与句子的长度
            subsentence = sentence[0:max_cut_length] #子句与就是最大的长度
            while max_cut_length > 0:
                if subsentence in word_dict:#如果句子是长的,那么从头便取最大词的长度,如果在,首词便框住
                    cut_word_list.append(subsentence) #如果不在词典岂不是完蛋了
                    break
                elif max_cut_length == 1:
                    cut_word_list.append(subsentence)
                    break
                else:
                    max_cut_length = max_cut_length-1 #大概率是不在的,因此切得长度减1
                    subsentence = subsentence[0:max_cut_length]
            sentence = sentence[max_cut_length:]
            words_length = word_length - max_cut_length
            if words_length == 0:
                break
    
        words = "/".join(cut_word_list)
        return words
    
    def main():
        '''
        与用户交互接口
        :return:
        '''
        init()
        while True:
            print("请输入要分词序列:")
            input_str = input()
            if not input_str:
                break
            result = cut_words(input_str,words_dic)
            print("分词结果")
            print(result)
    
    if __name__=="__main__":
        main()
    
    记录学习的点点滴滴
  • 相关阅读:
    django--orm---006
    django--orm---005
    django--orm---004
    django--orm---003
    jmeter连接数据库
    django--view---001
    django--orm---002
    django--model--orm001-- 增删改查
    java并发编程
    jvm
  • 原文地址:https://www.cnblogs.com/yangzilaing/p/14616517.html
Copyright © 2011-2022 走看看