蛮力法求最大字段和时间复杂度_中文分词算法之--最大匹配法

​ 前段时间研究了如何用分词工具进行分词,但是分词中涉及的一些算法,不太了解,所以,准备这段时间专攻分词算法原理,大家有补充,或者建议,欢迎留言。

1. 最大匹配法(Maximum Matching)

​ 最大匹配法是指以词典为依据,取词典中最长词长度作为第一次取字数量的长度,在词典中进行扫描。例如:词典中最长词为“中华人民共和国”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。

​ 最大匹配法主要包括正向最大匹配法(FMM,Forward Maximum Matching)、反向最大匹配法(BMM, Backward Maximum Matching)和双向最大匹配法,均是基于词典的。

缺点:

  1. 需要给定词典,如果词典中记录不全,比如新词没在字典中,可能就识别不出来;
  2. 矛盾之处:词典中的词少的话,会影响准确率,词典中词多的话,会影响运行效率;

优化:

​ 为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描。

1.1 正向最大匹配法

​ 正向即从左往右取词,取词最大长度为词典中长词的长度,每次右边减一个字,直到词典中存在或剩下1个单字。

比如:

sentence = '我们在野生动物园玩'

user_dict = ['我们', '在', '在野', '生动', '野生', '动物园', '野生动物园', '物','玩']

词典最大长度 max_len = 5

第1轮扫描

47e8311605b36ae3ba92bf826ae6ee3e.png

​ 第1次:“我们在野生”,扫描词典,无

​ 第2次:“我们在野”,扫描词典,无

​ 第3次:“我们在”,扫描词典,无

​ 第4次:“我们”,扫描词典,有

扫描中止,输出第1个词为“我们”,去除第1个词后,开始第2轮扫描

第2轮扫描

5a2c6bf40a31f6dd6dad4263efd6ff3e.png

​ 第1次:“在野生动物”,扫描词典,无

​ 第2次:“在野生动”,扫描词典,无

​ 第3次:“在野生”,扫描词典,无

​ 第4次:“在野”,扫描词典,有

扫描中止,输出第2个词为“在野”,去除第2个词后,开始第3轮扫描

第3轮扫描

5232d5b7921f870985cb7ed98b5d003e.png

​ 第1次:“生动物园玩”,扫描词典,无

​ 第2次:“生动物园”,扫描词典,无

​ 第3次:“生动物”,扫描词典,无

​ 第4次:“生动”,扫描词典,有

扫描中止,输出第3个词为“生动”,去除第3个词后,开始第4轮扫描

第4轮扫描

87160a15d58055b9d7f1276f54a25416.png

​ 第1次:“物园玩”,扫描词典,无

​ 第2次:“物园”,扫描词典,无

​ 第3次:“物”,扫描词典,有

扫描中止,输出第4个词为“物”,去除第4个字后,开始第5轮扫描

第5轮扫描

ab5e20fdbfd52ba326a909c7656fdff7.png

​ 第1次:“园玩”,扫描词典,无

​ 第2次:“园”,扫描词典,无

扫描中止,输出第5个词为“园”,去除第5个字后,开始第6轮扫描

第6轮扫描

8f1d50069084bbaa3c57e423ce6943b0.png

​ 第1次:“玩”,扫描词典,有

扫描中止,输出第6个词为“玩”, ,整体扫描结束。

最终分词结果为:“我们/在野/生动/物/园/玩”。

FMM算法python代码如下:

def 

定义字典和例句,调用FMM方法,具体python代码如下

user_dict 

则FMM输出结果为:

我们/在野/生动/物/园/玩/

1.2 反向最大匹配法

反向即从右往左取词,其他逻辑和正向相同。句子和字典与1.1中相同。

第1轮扫描

90c6f49971e43d3d3d5092984e9ae85f.png

​ 第1次:“生动物园玩”,扫描词典,无

​ 第2次:“动物园玩”,扫描词典,无

​ 第3次:“物园玩”,扫描词典,无

​ 第4次:“园玩”,扫描词典,无

​ 第5次:“玩”,扫描词典,有

扫描中止,输出第1个词为“玩”,去除第1个词后,开始第2轮扫描

第2轮扫描

b6f74f9ae5777a31f969da35c8858f65.png

​ 第1次:“野生动物园”,扫描词典,有

扫描中止,输出第2个词为“野生动物园”,去除第2个词后,开始第3轮扫描

第3轮扫描

bdedd35650cbe2d5062ba980b5c5122b.png

​ 第1次:“我们在”,扫描词典,无

​ 第2次:“们在”,扫描词典,无

​ 第3次:“在”,扫描词典,有

扫描中止,输出第3个词为“在”,去除第3个词后,开始第4轮扫描

第4轮扫描

0ac3ddffaf900f4d7f32792a1391e7fc.png

​ 第1次:“我们”,扫描词典,有

扫描中止,输出第4个词为“我们”,去除第4个词后,整体扫描结束。

最终分词结果为:“我们/在/野生动物园/玩”。

BMM算法python代码如下:

def 

定义字典和例句,调用FMM方法,具体python代码如下

user_dict 

则BMM输出结果为:

我们/在/野生动物园/玩/

1.3 双向最大匹配法

​ 双向最大匹配法:FMM和BMM两种算法都分词一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。

如:“我们在野生动物园玩”

正向最大匹配法,最终分词结果为:“我们/在野/生动/物/园/玩”,其中,总分词数6个,单个词为3。

逆向最大匹配法,最终分词结果为:“我们/在/野生动物园/玩”,其中,总分词数4个,单个词为2。

选择标准:

  1. 首先看两种方法结果的分词数,分词数越少越好;
  2. 分词数相同的情况下,看单个词的数量,越少越好;

因此最终输出为逆向结果。

参考链接:

https://blog.csdn.net/qq_41500251/article/details/88665875

https://blog.csdn.net/SMith7412/article/details/8813819

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值