中文分词算法之–最大匹配法

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

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轮扫描

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

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

第2轮扫描

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

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

第3轮扫描

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

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

第4轮扫描

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

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

第5轮扫描

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

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

第6轮扫描

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

扫描中止,输出第6个词为“玩”, ,整体扫描结束。
最终分词结果为:“我们/在野/生动/物/园/玩”。

FMM算法python代码如下:

def FMM_func(user_dict, sentence):"""正向最大匹配(FMM):param user_dict: 词典:param sentence: 句子"""# 词典中最长词长度max_len = max([len(item) for item in user_dict])start = 0while start != len(sentence):index = start+max_lenif index>len(sentence):index = len(sentence)for i in range(max_len):if (sentence[start:index] in user_dict) or (len(sentence[start:index])==1):print(sentence[start:index], end='/')start = indexbreakindex += -1

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

user_dict = ['我们', '在', '在野', '生动', '野生', '动物园', '野生动物园', '物','园','玩']
sentence = '我们在野生动物园玩'
FMM_func(user_dict, sentence)

则FMM输出结果为:

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

1.2 反向最大匹配法

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

第1轮扫描

​ 第1次:“生动物园玩”,扫描词典,无
​ 第2次:“动物园玩”,扫描词典,无
​ 第3次:“物园玩”,扫描词典,无
​ 第4次:“园玩”,扫描词典,无
​ 第5次:“玩”,扫描词典,有

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

第2轮扫描

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

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

第3轮扫描

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

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

第4轮扫描

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

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

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

BMM算法python代码如下:

def BMM_func(user_dict, sentence):"""反向最大匹配(BMM):param user_dict:词典:param sentence:句子"""# 词典中最长词长度max_len = max([len(item) for item in user_dict])result = []start = len(sentence)while start != 0:index = start - max_lenif index < 0:index = 0for i in range(max_len):if (sentence[index:start] in user_dict) or (len(sentence[start:index])==1):result.append(sentence[index:start])start = indexbreakindex += 1for i in result[::-1]:print(i, end='/')

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

user_dict = ['我们', '在', '在野', '生动', '野生', '动物园', '野生动物园', '物','园','玩']
sentence = '我们在野生动物园玩'
BMM_func(user_dict, sentence)

则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

中文分词算法之--最大匹配法相关推荐

  1. 词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法

    词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法 Type真是太帅了 于 2018-12-31 13:20:07 发布 1930  收藏 1 分类专栏: 编程 版权 编程 专栏收录该内容 15 ...

  2. c语言西文空格,中文分词入门之最大匹配法

    中文分词在中文信息处理中是最最基础的,无论机器翻译亦或信息检索还是其他相关应用,如果涉及中文,都离不开中文分词,因此中文分词具有极高的地位.中文分词入门最简单应该是最大匹配法了,当年师兄布置给我的第一 ...

  3. java正向最大匹配算法_java中文分词之正向最大匹配法实例代码

    前言 基于词典的正向最大匹配算法(最长词优先匹配),算法会根据词典文件自动调整最大长度,分词的好坏完全取决于词典. 所谓词典正向最大匹配就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子 ...

  4. 基于词表的中文分词算法

    基于词表的中文分词算法 正向最大匹配法 对于输入的一段文本从左至右,以贪心的方式切分出当前位置上长度最大的词.正向最大匹配法是基于词典的分词方法,其分词原理是:单词的颗粒度越大,所能表示的含义越确切. ...

  5. 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词

    基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤 第一次写中文分词程序,欢迎拍砖. publicclass MM ...

  6. 基于词典的逆向最大匹配中文分词算法,更好实现中英文数字混合分词

    基于词典的逆向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤.实际分词效果比正向分词效果好 publicclass RMM ...

  7. java中文分词算法_Java实现逆向最大匹配中文分词算法

    写道 //Java实现逆向最大匹配中文分词算法 public class SplitChineseCharacter { public static void main(String[] args) ...

  8. 入门科普:一文看懂NLP和中文分词算法(附代码举例)

    导读:在人类社会中,语言扮演着重要的角色,语言是人类区别于其他动物的根本标志,没有语言,人类的思维无从谈起,沟通交流更是无源之水. 所谓"自然"乃是寓意自然进化形成,是为了区分一些 ...

  9. Matrix67:漫话中文分词算法

    这篇文章不错,列举了很多有意思的中文分词困难例子(特别是对未登词部分)来说明中文分词的困难之处. Matrix67:漫话中文分词算法 发表于 2011年03月10号 由 52nlp 注:这是今天在Ma ...

最新文章

  1. 深圳湾口岸明起开通公交大巴
  2. 【自动驾驶】17. pitch yaw roll是什么
  3. linux下ftp服务器的搭建与使用
  4. linux配置服务器超时退出,Linux下实现不活动用户登录超时后自动登出
  5. 【C++面向对象】类的静态成员函数(static member functions)
  6. 【Advanced Windows Phone Programming】在windows phone 8中录制MP3和AAC及Amr音频
  7. Android中Webview自适应屏幕
  8. 专题:CentOS社区企业操作系统
  9. 华为视频会议系统常见问题及解决方法
  10. python文本情感分析代码_6行代码的超简单语言情感分析:由Python的Vader情感库实现,超级,使用,vaderSentiment...
  11. WPF里面制作圆角文本框
  12. matlab 图像保存为视频教程,山东大学《数字图像处理(MATLAB)》江铭炎视频教程
  13. 人工智能—产生式系统(专家系统)
  14. java编程选游戏本还是轻薄本,编程用什么笔记本,超薄本还是游戏本
  15. matlab求一个矩阵的逆矩阵的命令,如何用MATLAB求逆矩阵
  16. 小O地图EXE版V0.9.5.5 - 功能总览
  17. mysql inet aton ipv6_Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结
  18. shell脚本监控网站是否正常
  19. Zephyr启动过程与中断响应
  20. 微信第三方登录redirect_uri 参数错误

热门文章

  1. 找零钱问题刨析(Python代码)
  2. 10 大黑客专用的 Linux 操作系统
  3. 手把手教你如何微信公众号开发“翻译功能
  4. 3.3.4 Memcached分布式算法
  5. 网易云歌单重合率2.0
  6. linux删除文件夹或者文件
  7. 3D模型欣赏:黑色的巴斯泰托女神【3D游戏建模教程】
  8. 新型红包套路,论推广和运营,灰产们真是一把好手
  9. 机器学习算法优缺点_用于机器学习的优化算法的优缺点
  10. 人工智能知识图谱研究