中文分词:双向匹配最大算法(BI-MM)

摘要:
=fmm_ word_list_Size:要做什么Fsingle=0Bsingle=0issame=Trueforiinrange(len(fmm_word_list)):“)input_str=input()ifnotinput_str:encoding=“utf-8”)asdic_input:

中文分词:双向匹配最大算法(BI-MM)

启发式规则:

  • 1.如果正反向分词结果词数不同,则取分词数量较少的那个
  • 2.如果分词结果词数相同
    • a. 分词结果相同,就说明没有歧义,可返回任意一个
    • b. 分词结果不同,返回其中单字较少的那个

代码实现

#使用双向最大匹配算法实现中文分词
words_dic = []
import BMM #引入逆向匹配算法
import fmm #引入正向匹配算法
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,words_dic):
    bmm_word_list = BMM.cut_words(raw_sentence,words_dic) #返回切词列表
    fmm_word_list = fmm.cut_words(raw_sentence,words_dic) #返回切词列表
    bmm_word_list_size = len(bmm_word_list) #计算各自的长度
    fmm_word_list_size = len(fmm_word_list)
    if bmm_word_list_size != fmm_word_list_size: #如果不相等返回分词数较少的那个
        if bmm_word_list_size < fmm_word_list_size:
            return bmm_word_list
        else:
            return  fmm_word_list
    else: #如果相等了,怎么办
        Fsingle = 0
        Bsingle = 0
        issame = True
        for i in range(len(fmm_word_list)):#对列表中的词进行分词
            if fmm_word_list[i] not in bmm_word_list: #二者不等,跳出
                issame = False
            if len(fmm_word_list[i]) == 1: #正向匹配的的单字计数累加,为后续的比较打下基础
                Fsingle = Fsingle + 1
            if len(bmm_word_list[i]) == 1: #逆向匹配的的单字计数累加
                Bsingle = Bsingle + 1
        if issame:
            return  fmm_word_list #二者相等返回任意一个
        elif Bsingle > Fsingle:
            return  fmm_word_list
        else:
            return bmm_word_list


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()#使用逆向最大匹配算法实现中文分词
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,words_dic):
    #统计词典中词的最大长度
    max_length = max(len(word) for word in words_dic )
    sentence = raw_sentence.strip()
    #统计序列的长度
    words_length = len(sentence)
    cut_words_list = []
    while words_length > 0: #判断是否需要继续切词
        max_cut_length = min(max_length,words_length)
        subsentence = sentence[-max_cut_length:]
        while max_cut_length >0:
            if subsentence in words_dic:
                cut_words_list.append(subsentence)
                break
            elif max_cut_length == 1:
                cut_words_list.append(subsentence)
                break
            else:
                max_cut_length = max_cut_length - 1
                subsentence = subsentence[-max_cut_length:]
        sentence = sentence[0:-max_cut_length]
        words_length = words_length - max_cut_length
    cut_words_list.reverse()#自身反转
    words = "/".join(cut_words_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()

免责声明:文章转载自《中文分词:双向匹配最大算法(BI-MM)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇web 阶段的一些简答题[vuex] unknown mutation type:下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【巷子】---json-server---基本使用

一、前后端并行开发的痛点 前端需要等待后端开发完接口以后 再根据接口来完成前端的业务逻辑 二、解决方法 在本地模拟后端接口用来测试前端效果 这种做法称之为构建前端Mock 三、json-server的基本使用 (1)、全局安装 cnpm install json-server -g (2)、准备json文件 (data.json) json-serv...

jacob使用入门及问题解析

转自:http://blog.csdn.net/hemingwang0902/article/details/4377994 本博客 jacob 列文章导读Java操作Microsoft Word之jacob jacob使用入门及问题解析使用Jacob将Word转为Html或txt 使用Jacob将Word转为PDFjava通过jacob调用word (根...

js和java中使用join来进行数组元素的连接

  合理地使用join来进行数组中元素的连接,代码简洁,比自己编码也更为方便。   js中join的用法 var arr = new Array(3) arr[0] = "a" arr[1] = "b" arr[2] = "c" arr.join(".") a.b.c ------------------ arr.join(",") a,b,c   ja...

MVC中 DropDownList编辑默认选中的使用

MVC DropDownList编辑默认选中   DropDownList则与TextBox等控件不同,它使用的是select标记。它需要两个值:在下拉框中显示的列表,和默认选项。而自动绑定一次只能绑定一个属性,因此你需要根据需要选择是绑定列表,还是默认选项。 DropDownList扩展方法的各个重载版本“基本上”都会传递到这个方法上: ? pu...

【盘古分词】Lucene.Net 盘古分词 实现公众号智能自动回复

盘古分词是一个基于 .net framework 的中英文分词组件。主要功能 中文未登录词识别 盘古分词可以对一些不在字典中的未登录词自动识别 词频优先 盘古分词可以根据词频来解决分词的歧义问题 多元分词 盘古分词提供多重输出解决分词粒度和分词精度权衡的问题 中文人名识别 输入: “张三说的确实在理” 分词结果:张三/说/的/确实/在理/...

java web开发小记(6)将int类型的list插入到mysql数据库

首先要明确一点,数据库中没有直接与list对应的数据类型,因此要曲线救国,先转换成string再插入数据库 list转换为str 使用join方法 例子 a = ','.join(['abc','def','ghi']) print(a) 就能得到一个string  但是int类型会出点小问题,说int不能用join,因此要先转换成str list...