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

article/2025/10/18 14:50:13

文章目录

      • 分词算法(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开始即可,因为词典最大单词长度为3max_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开始即可,因为词典最大单词长度为3max_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. 若单个字数也相同,任意返回一个。

小结

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


http://chatgpt.dhexx.cn/article/TowLAtbQ.shtml

相关文章

自然语言处理——分词算法

引言 分词是自然语言处理中的基本操作,今天我们就来看一下常用的分词算法及实现。 最大匹配算法 所谓的最大匹配指的是匹配最长的单词,通常会指定一个最大长度。根据搜索顺序的不同,主要有前向最大匹配算法、后向最大匹配算法、双向匹配算…

分词算法介绍——千里之行,始于足下

NLP(自然语言处理),对于它来说,如何有效地编码一段文本,是它首先要考虑的问题。而在编码文本之前,要先把它切割成小块,这些小块叫做 tokens,这个过程叫做分词(tokenizati…

C#分词算法

C#分词算法 分词算法的正向和逆向非常简单,设计思路可以参考这里: 中文分词入门之最大匹配法 我爱自然语言处理 http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation 正向最大匹配,简单来说,就是分词的时候&#xf…

windows10家庭版打开组策略

目录 一、新建文本文件,输入以下内容二、鼠标右键单击,以管理员身份运行三、验证 windows10家庭版默认没有放开组策略,可以通过以下方法添加。 一、新建文本文件,输入以下内容 echo offpushd "%~dp0"dir /b C:\Window…

【Windows】Win10家庭版启用组策略gpedit.msc

转载请注明出处,原文链接:https://blog.csdn.net/u013642500/article/details/80138799 【前言】 大家都认为,Windows 10家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已。那么我们让…

win10(家庭版)打开本地组策略失败的处理方法

win10(家庭版)打开本地组策略失败的处理方法 1 新建TXT文件 将下列代码复制粘贴到txt中: echo off pushd “%~dp0” dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt…

win10找不到组策略,解决方法

win10找不到组策略,可以用以下办法开启权限: 1.winr 唤出运行,输入notepad创建记事本; 2.输入以下代码并另存为gpedit.bat; echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Micros…

如何停止Monkey测试

当我们运行Monkey测试时,命令发出之后,手机便开始执行monkey命令了。Monkey命令具体用法如下图所示: 网上大部分人认为monkey开始测试之后,就不能停止,除非时间数执行完成,或者在cmd窗口执行adb reboot来进…

Android的monkey测试

Android SDK中的android调试桥(adb)shell里,有一个用于测试的工具——monkey。不知道最早monkey这个名字的来历,不过他确实如同一只调皮的猴子,在android app里各种乱按、乱晃、乱摸。 如何使用:进入命令行…

android测试-monkey测试

文章目录 前言一、为什么Monkey测试二、什么是Monkey测试三、如何做monkey测试 前言 Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试; 通俗来说&#xf…

Monkey测试工具使用

目录 1.monkey测试原理 2.Monkey启动架构图 3.Monkey为什么是Android测试工具原理解析 4.Monkey命令 5.Monkey日志分析 1.monkey测试原理 monkey是向系统发送一系列的伪随机的用户事件流,这些事件流包括:按键输入、触摸屏输入、手势输入。实现对应用程…

Android Monkey测试入门:安装sdk、studio、模拟器,并分析monkey日志

Android Monkey测试入门:安装sdk、studio、模拟器,并分析monkey测试报告结果 1. 安装Java JDK和android SDK2. 安装Andriod studio及模拟器3. 在模拟器上运行monkey测试3.1 手动植入简单缺陷 4. 分析monkey报告结果信息4.1 标准流4.2 错误流 5. 导出ANR文…

python+monkey实现app的monkey测试

目标: 使用monkey对当前windows电脑连接的一个或者多个手机设备,完成对某个app的monkey测试,输出monkey日志以及monkey脚本。思路: 通过terminal交互控制台,获取测试的app以及可以测试的设备。将获取的参数和固定的mo…

最全的monkey测试过程及分析

一、首先第一步安装Android SDK,完成后。编写测试脚本,我的脚本已经编写好。具体大家可以从网上Google针对自己的情况再进行详细的编改。 ECHO OFFECHO.:::::::::::::::::::::::::::::::::::::::::::::::::ECHO.:: 分析Monkey日志 …

【monkey】monkey测试入门

目录 一、安装 二、真机或者模拟器 三、基本命令 (一)基础参数 (二)调试选项 四、 停止命令 五、测试结果分析 (一) 初步分析方法 (二)一般的测试结果分析: 一、…

Monkey测试个人笔记

安卓monkey简介 Monkey是一款安卓自带的、java编写的app自动化测试工具,monkey是猴子的意思,所以从原理上说,它的自动化测试就类似猴子一样在软件上乱敲按键,猴子什么都不懂,就爱捣乱。Monkey原理也是类似,…

monkey测试工具

Monkey的概念: “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的…

Monkey的测试原理和方法

参考资料:http://blog.csdn.net/io_field/article/details/52189972 一、Monkey测试原理:Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等)&#xf…

iOS端Monkey测试

说起Monkey测试,大家想到的是monkey测试只有安卓有,monkey测试只针对安卓app,今天给大家分享一下Monkey测试在iOS端也能跑!iOS端app也能使用Monkey测试来执行稳定性测试。 一、环境准备 1、准备Mac设备,并安装xcodeI…

Monkey测试工具详解

Monkey测试工具简介: Monkey是Android SDK 中附带的一个工具;Monkey测试的原理:利用socket通讯(Android客户端和服务器以TCP/UDP方式)的方式来模拟用户的按键输入、触摸屏输入、手势输入等;Monkey测试的…