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

这篇具有很好参考价值的文章主要介绍了分词算法----正向和逆向最大匹配算法(含Python代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


分词算法(Segmentation Method)

在文本处理流程中,对语句进行分词(Segmentation)操作对于计算机认识并理解人类语言是基础且重要的。

对于中文来讲,不同于英文直接采用空格符进行分隔,并且中文词语内涵丰厚,语义丰富,所以只有采用合适的分词算法,才能准确迅速地向计算机表达原有的意思,提高工作效率。


最大匹配算法(Maximum Matching)

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

以下详细介绍算法的主要思想及具体代码实现。

需要的前提

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

ch_dict = [‘我们’,‘经常’,‘有’,‘有意见’,‘意见’,‘分歧’]

测试语句

sentence = ‘我们经常有意见分歧’

最大匹配值

max_match_len = 5

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

算法主要思想

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

算法思想示意图

正向最大匹配算法,自然语言处理(NLP),# 分词,算法,python,开发语言
具体代码实现

'''
(分词算法)正向最大匹配算法
'''
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)

算法主要思想

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

算法思想示意图

正向最大匹配算法,自然语言处理(NLP),# 分词,算法,python,开发语言

具体代码实现

'''
(分词算法)后向最大匹配算法
'''

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. 若单个字数也相同,任意返回一个。
小结

最大匹配算法在简单场景往往能够发挥出较好的分词效果,但其算法的时间复杂度较高,理解中文歧义问题不够准确,故存在一定的局限性,仅作为低级的分词算法使用。文章来源地址https://www.toymoban.com/news/detail-843265.html

到了这里,关于分词算法----正向和逆向最大匹配算法(含Python代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机械臂正向与逆向运动学求解

            机械臂的正运动学求解即建立DH参数表,然后计算出各变换矩阵以及最终的变换矩阵。逆运动学求解,即求出机械臂各关节θ角与px,py,pz的关系,建立θ角与末端姿态之间的数学模型,在这里以IRB6700为例,对IRB6700进行正逆运动学求解和验证。 目录 正运动学求解 逆

    2023年04月10日
    浏览(26)
  • C++程序正向编译逆向反编译(一)

            逆向工程师必须先是一个正向开发工程师,如果没有C++/MFC的开发经验,就不会懂得如何逆向分析C++/MFC的程序,本文完成一个helloworld的C++正逆向过程。     编译环境:visual studio 2022 编译完毕后生成exe程序,导入Ghidra,分析完毕后,在symbol tree窗口,输入main查找到主

    2024年01月17日
    浏览(44)
  • Python实现螺丝与螺母匹配分治算法示例

    如何使用Python实现螺丝与螺母匹配的分治算法示例。快速排序思想帮助您解决这一问题。详细代码和解释。

    2024年02月11日
    浏览(89)
  • 【计算机视觉、关键点检测、特征提取和匹配】基于SIFT、PCA-SIFT和GLOH算法在不同图像之间建立特征对应关系,并实现点匹配算法和图像匹配(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年03月14日
    浏览(34)
  • 滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句

    原理:arr[5]是ebp的位置,而arr[6]是ebp+0x4的位置,即函数的返回地址,赋值给arr[6]相当于是修改了eip寄存器。 反汇编:i等于7时,修改了rbp+0x1c-0x20即rbp-0x4位置的值,将其置为0,而该位置为i的值,所以每一轮for过后将i重新置0,就造成了不停的循环。 声明一个变量就是告诉计

    2024年02月15日
    浏览(41)
  • C语言数据结构+KMP算法next数组优化计算方法+优化后子串匹配代码实现

    通过我之前那篇KMP算法的讲解,我们可以快速手算KMP算法的next数组,但是之前计算的next数组在一些情况下会有缺陷,比如模式串’aaaab’和主串’aaabaaaab’进行匹配 令模式串指针为j 当第一个元素不匹配时,下一次匹配还是要从模式串的第一个元素与主串匹配,其实我们可以直接写

    2024年02月06日
    浏览(33)
  • OpenCV Python – 使用SIFT算法实现两张图片的特征匹配

    1.要实现在大图中找到任意旋转、缩放等情况下的小图位置,可以使用特征匹配算法,如 SIFT (尺度不变特征变换) 或 SURF (加速稳健特征)。这些算法可以在不同尺度和旋转情况下寻找匹配的特征点 2.我们使用了 SIFT 算法检测和匹配特征点,然后使用 RANSAC 算法计算透视变换矩阵

    2024年02月06日
    浏览(32)
  • 【华为OD】C卷真题100分:最大矩阵和 python代码实现[思路+代码]

    C++、Java、JS、C代码: 【华为OD】C卷真题100分:最大矩阵和 C/C++代码实现[思路+代码]-CSDN博客 【华为OD】C卷真题100分:最大矩阵和 Java代码实现[思路+代码]-CSDN博客 【华为OD】C卷真题100分:最大矩阵和 JavaScript代码实现[思路+代码]-CSDN博客 【华为OD】C卷真题100分:最大矩阵和

    2024年04月16日
    浏览(24)
  • 机器人——正向运动学(Forward Kinematics)与逆向运动学(Inverse Kinematics)

    正向运动学和反向运动学分别是什么意思 正向运动学是指从机器人的关节运动推导出末端执行器的运动的过程,也就是从机器人的关节坐标计算出末端执行器的位置和姿态信息的过程。反向运动学则是指从末端执行器的位置和姿态信息推导出机器人的关节坐标的过程。简单来

    2024年02月16日
    浏览(30)
  • 使用Python实现高效数据下采样:详解最大三角形三桶(LTTB)算法

    引言 在我们接触大规模的数据集时,数据的数量往往会让人望而却步。数据分析、机器学习等领域的专业人员需要对这些数据进行处理,以便更好地理解数据,以及利用数据进行预测。然而,处理大规模数据的计算成本往往非常高,这时候,就需要引入下采样(Downsampling)的

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包