news 2026/5/13 0:36:49

分词算法----正向和逆向最大匹配算法(含Python代码实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分词算法----正向和逆向最大匹配算法(含Python代码实现)

分词算法----正向和逆向最大匹配算法(含Python代码实现)

文章目录
      • 分词算法(Segmentation Method)
      • 最大匹配算法(Maximum Matching)
        • 需要的前提
        • 正向最大匹配算法(Forwards Maximum Match,FMM)
        • 逆向最大匹配算法(Reverse Maximum Match,RMM)
        • 双向最大匹配算法
        • 小结

分词算法(Segmentation Method)

在文本处理流程中,对语句进行分词(Segmentation)操作对于计算机认识并理解人类语言是基础且重要的。
对于中文来讲,不同于英文直接采用空格符进行分隔,并且中文词语内涵丰厚,语义丰富,所以只有采用合适的分词算法,才能准确迅速地向计算机表达原有的意思,提高工作效率。

最大匹配算法(Maximum Matching)

最大匹配算法是基于词表进行分词操作的,主要包括正向正向最大匹配算法逆向最大匹配算法双向最大匹配算法等。 其主要原理都是切分出单字串(词语),然后和词库进行比对,如果对比成功就记录下来,从整句切除下来, 否则减少一个单字,继续比较,直到字符串全部切除完毕,即分词成功,数组中的所有词语即是分词结果。
以下详细介绍算法的主要思想及具体代码实现。

需要的前提

进行匹配算法的执行前,一定自己要设定一个字典库,通常作为测试即可。
这里我自己使用
字典库

ch/_dict = [‘我们’,‘经常’,‘有’,‘有意见’,‘意见’,‘分歧’]
测试语句
sentence = ‘我们经常有意见分歧’
最大匹配值
max/_match/_len = 5

正向最大匹配算法(Forwards Maximum Match,FMM)

算法主要思想
从字符串的正方向出发,先截取前5个字符,与词典库中的词语进行对比。若比对不成功,则截取前4个字符进行对比,依次类推,直到仅剩第一个字符,自动进行截取,此次截取结束;若对比成功,则将该词语记录下来,并从句子中截取下来。直至句子全部被拆分为词语,以数组进行存储。
算法思想示意图

具体代码实现

''' (分词算法)正向最大匹配算法 ''' if __name__ == '__main__': ch_dict = ['我们','经常','有','有意见','意见','分歧'] #中文的词典库,用于匹配句子中的词语 sentence = '我们经常有意见分歧' #例句,需要进行分词 segment_list = [] #存放分词后的分词词组 #例句不为空时,循环地进行分词操作 while len(sentence) >= 1: # 最大匹配单词的长度为5,当然实际意义从3开始即可,因为词典最大单词长度为3 max_match_len = 5 #当匹配单词长度大于1时,循环判断分词 while max_match_len > 1: #判断前 max_match_len 个字符是否存在于字典 if sentence[0:max_match_len] in ch_dict: segment_list.append(sentence[0:max_match_len]) #追加到分词词组中 sentence = sentence[max_match_len:len(sentence)] #将符合的词语从原例句中截取 break #退出循环,重新从max_match_len最长匹配数开始匹配截取 max_match_len -= 1 #max_match_len累减,开始匹配4个字符,3个字符,,, #只剩下一个汉字时,说明当前不再存在任何符合的词语,直接截取一个汉字作为词组 if max_match_len == 1: segment_list.append(sentence[0:1]) #追加单个汉字词语 sentence = sentence[1:len(sentence)] #截取例句 #输出存放分词的列表 print(segment_list) #输出进行分词后的例句 print('/'.join(segment_list)) #我们/经常/有意见/分歧

运行结果

['我们', '经常', '有意见', '分歧'] 我们/经常/有意见/分歧 Process finished with exit code 0
逆向最大匹配算法(Reverse Maximum Match,RMM)

算法主要思想
刚好与正向最大匹配算法相反,该算法旨在从句子末尾对句子进行分词操作,基本原理同正向最大匹配算法。
算法思想示意图

具体代码实现

''' (分词算法)后向最大匹配算法 ''' if __name__ == '__main__': ch_dict = ['我们','经常','有','有意见','意见','分歧'] #中文的词典库,用于匹配句子中的词语 sentence = '我们经常有意见分歧' #例句,需要进行分词 segment_list = [] #存放分词后的分词词组 #例句不为空时,循环地进行分词操作 while len(sentence) >= 1: # 最大匹配单词的长度为5,当然实际意义从3开始即可,因为词典最大单词长度为3 max_match_len = 5 #当匹配单词长度大于1时,循环判断分词 while max_match_len > 1: #判断前 max_match_len 个字符是否存在于字典 if sentence[-max_match_len:] in ch_dict: segment_list.append(sentence[-max_match_len:]) #追加到分词词组中 sentence = sentence[:-max_match_len] #将符合的词语从原例句中截取 break #退出循环,重新从max_match_len最长匹配数开始匹配截取 max_match_len -= 1 #max_match_len累减,开始匹配4个字符,3个字符,,, #只剩下一个汉字时,说明当前不再存在任何符合的词语,直接截取一个汉字作为词组 if max_match_len == 1: segment_list.append(sentence[-1:]) #追加单个汉字词语 sentence = sentence[:-1] #截取例句 # 输出进行分词后的例句 print('/'.join(segment_list)) #分歧/有意见/经常/我们 #对分词列表进行倒序 segment_list = segment_list[::-1] #再次输出进行分词后的例句 print('/'.join(segment_list)) # 我们/经常/有意见/分歧

运行结果

分歧/有意见/经常/我们 我们/经常/有意见/分歧 Process finished with exit code 0
双向最大匹配算法

算法的主要思想
双向最大匹配算法是同时采用正向最大匹配算法逆向最大匹配算法,根据对比不同的执行结果,选择最优解。
有以下几种选择方案:

  1. 如果分词数量结果不同:选择数量较少的那个。
  2. 如果分词数量结果相同。
    A. 分词结果相同,返回任意一个。
    B. 分词结果不同,返回单个字数较少的一个。
    C. 若单个字数也相同,任意返回一个。
小结

最大匹配算法在简单场景往往能够发挥出较好的分词效果,但其算法的时间复杂度较高,理解中文歧义问题不够准确,故存在一定的局限性,仅作为低级的分词算法使用。

《网络安全从零到精通全套学习大礼包》

96节从入门到精通的全套视频教程免费领取

如果你也想通过学网络安全技术去帮助就业和转行,我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。

网络安全学习路线图

想要学习 网络安全,作为新手一定要先按照路线图学习方向不对,努力白费。对于从来没有接触过网络安全的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线,大家跟着这个路线图学习准没错。

配套实战项目/源码

所有视频教程所涉及的实战项目和项目源码

学习电子书籍

学习网络安全必看的书籍和文章的PDF,市面上网络安全书籍确实太多了,这些是我精选出来的

面试真题/经验

以上资料如何领取?

.csdnimg.cn/direct/92a6ab8e26034045b97ae8ac36b2a650.png)

以上资料如何领取?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 0:35:33

基于大语言模型的银行对账单自动化分析与财务预测实战

1. 项目概述:当大语言模型遇上个人财务分析最近在GitHub上看到一个挺有意思的项目,叫“AI银行对账单文档自动化与个人财务分析预测”。光看这个标题,就能感觉到一股浓浓的“技术赋能生活”的味道。简单来说,这个项目想干的事儿&am…

作者头像 李华
网站建设 2026/5/13 0:24:09

Spratt Skills:基于LLM规划与代码执行的OpenClaw家庭自动化架构实践

1. 项目概述:Spratt Skills,一个为OpenClaw打造的家庭自动化基础设施套件 如果你正在使用OpenClaw,并且已经厌倦了让LLM(大语言模型)去处理那些它天生就不擅长的事情——比如定时发送消息、轮询航班状态、或者可靠地写…

作者头像 李华
网站建设 2026/5/13 0:24:08

SRWE终极指南:5分钟学会游戏窗口分辨率自定义技巧

SRWE终极指南:5分钟学会游戏窗口分辨率自定义技巧 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 想要在游戏中获得超高清截图,却受限于系统预设的分辨率?想要在窗口模式下享…

作者头像 李华
网站建设 2026/5/13 0:15:37

618.4V锂电池完整设计方案要求【浩博电池】

618.4V锂电池完整设计方案要求618.4V高压锂电池系统广泛应用于重载AGV平台、RGV轨道运输系统、矿山设备、港口机械、无人车、无人船、高空作业平台、电动工程机械、重型运输车辆、工业储能系统及军工辅助动力系统中。其主要承担高压直流驱动、电机控制器供电、大功率持续输出及…

作者头像 李华