Mmseg中文分词算法解析

@author linjiexing

开发中文搜索和中文词库语义自己主动识别的时候,我採用都是基于mmseg中文分词算法开发的Jcseg开源project。使用场景涉及搜索索引创建时的中文分词、新词发现的中文分词、语义词向量空间构建过程的中文分词和文章特征向量提取前的中文分词等,整体使用下来,感觉jcseg是一个非常优秀的开源中文分词工具,并且可配置和开源的情况下,能够满足非常多场景的中文分词逻辑。本文先把jcseg使用到最主要的mmseg算法解析一下。

1. 中文分词算法之争

在分析mmseg算法前,先讲述一段中文分词的基本历史,在吴军著的《数学之美》中有详述。我主要聊聊我的想法。算法开发的思维流程事实上和这段历史基本上是吻合的。我们的直观思维非常easy受限于我们的知识储备和经验,比方我们在设计出飞机之前,想到是仿生的方式去模拟鸟儿的扇动翅膀姿势,直到后来空气动力学发现飞翔的本质是扇动翅膀能够产生空气涡流而给以上升驱动力,由螺旋桨推升比空气质量高的物体。飞机由此发明。

在中文分词的道路上,也曾走过这样一段类似的探索之路。

一開始。为了实现合理的中文分词。我们能想到的是使用语言学家已经归纳的语法规则,依据传统的“句读”切割,给语句分词。可是。我们知道,非常多出名的诗句或文学语句都不是来自于正常的语法,甚至有些口语化的语句也不满足语法规则,可是并不影响人的识别,并且可能还是流传千古的创新之作。

所以。直觉的有限定义并不能满足千变万化的语言环境。

在IBM花费非常多时间和人力之后。发现走传统思维是行不通的。转而走向如今流行的统计学语言模型。我个人是这么理解统计学模型的。本质上语言学家的语法规则也是来自于大量语料的统计和归纳。并加以个人或专家团队的约束,组织成有限的语法规则,可是这个语法规则被约束成有限的,从而不满足人类的无线创作的可能性——用概率学的角度看,语法规则可能能够覆盖到一个标准差内的可能发生的事件(其实。并没有到这个覆盖率)。可是其他小概率事件并没有覆盖,甚至随着时间的演变,语料库的迅速添加,长尾效应和创新效应的存在,覆盖率更快的减少。使用有限非完备的方式,是非常难应对无限扩展的方式。这个时候,就是基于统计学的机器学习占了实践的上风。

发展到如今。有非常多基于统计理论的中文分词算法,也有非常多成熟的产品。他们在实践中尽管并不是达到百分百正确率,可是在非常多应用场景已经能够满足要求,适定性比基于语法的方式要优越非常多。

当然,但凡基于统计学的模型,其探索之路就意味着永无止境。

不同的算法模型也有不同的适定场景。各位能够自己尝试。我所使用到的场景使用mmseg算法就能够有非常好的效果,所以没有深入查阅其他算法的原理。临时无法给出比較客观的比較。

2. Mmseg算法原理

如上所述,mmseg算法是基于统计模型的,所以算法的规则也是来自于对语料库的分析和归纳,作者依据语料库总结出分词的规则,分为四个步骤。算法原文为 http://technology.chtsai.org/mmseg/ 。

详细规则例如以下:

① 规则1,最大匹配:假设词语能够找到一个简单的词匹配,则觉得该词即为该词语的分词

类似。词语“国际化”,通过词典分词。能够有例如以下分词结果

1. 国_际_化
2. 国际_化
3. 国际化
1. C1_C2_C3
2. C1C2_C3
3. C1_C2C3
4. C1C2C3

可见“国际化”有全然相应的词,则觉得这个词语即是一个词。

规则总结例如以下:

选取C1C2C3模式

② 规则2,最大平均词汇长度。假设词语分词不满足规则1,则使用规则2:

类似。词语“南京市长江大桥”,分词结果可能例如以下

1. 南京市_长江大桥  —— 平均词长度为7/2=3.5
2. 南京_市长_江大桥  —— 平均词长度为7/3=2.3

归纳该规则为则选取第一种分词方式,可见这个规则是兼容第一个规则的

1. C1C2_C3C4C5C6
2. C1C2_C3C4_C5C6

③ 规则3,最小词长方差。假设规则②不成立,则进行规则三。这个规则和我们平时用语有关,一般我们在组织语句时,为了朗朗上口,往往使用的词汇组成长度比較一致。

比方,“幸福_快乐”,“人之初_性本善”,“君子一言,驷马难追”。

类似,词语“研究生命科学”

1. 研究生_命_科学  ——词长方差0.82
2. 研究_生命_科学  ——词长方差0

上述平均词长都是2,可是词长方差不一致。依据规则③。选择另外一种分词方式,这样的规则能够归纳为

1. _C1C2_C3C4_C5C6_
2. _C1C2C3_C4_C5C6_

④ 规则4。最大单字自由度。

所谓单字自由度,能够简单的理解为这个字作为单独出现的语境次数。比方“的”常常作为定语修饰字,常常出如今各种语境。可是“的”偶尔也会和其它字词组成成语。比方“目的”等,这样的组合会影响改字的自由度。

有关自由度和凝固度。回头在《新词发现》中讨论。这样的推断主要是使用在单字存在的场景。

在规则③不成立的情况下,进行规则④的推断。

1. 化妆_和(10)_服装
2. 化妆_和服_装(3)

总结该规则为(备注,上面自由度属于个人瞎编)平均词长和词长方差是一致的,可是单字的自由度不同。选择第一种分词方式

1. _C1C2_C3_C4C5_

2. _C1C2_C3C4_C5_

Compare the freedom(C3) to freedom(C5)

3. 该算法的错误情况

该算法的错误案例能够详见原论文的Example of errors小节。个别错误是能够避免的,尤其是单字自由度,主要是语料库的训练问题。有些问题能够通过新词发现解决。查看该约束,能够推断是否满足自己的应用场景。

4. 小结

能感觉这篇算法阐述还是非常精炼美丽的,在非常多场景适定性也非常强。兴许将对基于mmseg算法开源的jcseg做个分析。

转载于:https://www.cnblogs.com/lytwajue/p/6859946.html

Mmseg中文分词算法解析相关推荐

  1. ZZ MMSEG 中文分词算法

    译者原文地址: http://leeing.org/2009/11/01/mmseg-chinese-segmentation-algorithm/ 论文原文地址: http://technology ...

  2. 中文分词算法python代码_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

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

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

  4. 列举:中文分词算法你知道几种?

    列举:中文分词算法你知道几种? 摘要:看似普通的一句话,甚至几个词,在机器眼里都要经过好几道"程序".这个过程主要靠中文分词算法,这个算法分为三大类:机械分词算法.基于n元语法的分 ...

  5. 正向最大匹配算法 python代码_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

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

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

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

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

  8. 在Hadoop上运行基于RMM中文分词算法的MapReduce程序

    原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词 ...

  9. python最大分词_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

最新文章

  1. 如何控制在一个软件中特殊的字符比如#都显示为红色呢?该字符是作为标签中的内容出现的,可能出现在JLABEL,JCheckBox,JCombox的标签中的,
  2. 提高你开发效率的十五个Visual Studio 2010使用技巧
  3. rk3399性能_AIIA AI公布首轮评估结果:瑞芯微RK3399数据抢眼
  4. Cutting Codeforces Round #493 (Div. 2)
  5. golang 远程批量执行shell_S2061远程代码执行漏洞复现及批量检测脚本(CVE202017530)...
  6. java网络篇-tcp的握手和挥手!
  7. 如果张东升是个程序员,你还有机会吗?
  8. python数据挖掘学习】十五.Matplotlib调用imshow()函数绘制热图
  9. C#基于websocket-sharp实现简易httpserver(封装)
  10. 不知道先学工具还是方法,数据分析入错门,后悔一辈子
  11. 怎么查看linux硬盘多路径,linux下磁盘多路径
  12. Flutter:Slivers大家族,让滑动视图的组合变得很简单!
  13. 面向对象的JavaScript-008-Function介绍
  14. C#andSql获取当前日期格式
  15. 关于连接数据库出现时差问题的解决方法
  16. 获得鸿蒙级抽奖,37鸿蒙天尊抽奖活动概率公示
  17. 对TexStudio配置拼写和语法检查LanguageTool
  18. U盘重装centos7系统(开发者模式)
  19. spring-boot-redis-cache集成总结及源码分析
  20. 计算机网络:数据链路层功能

热门文章

  1. Android View与GroupView原理以及其子类描述
  2. Android自定义控件(四)仿网易客户端上拉加载更多
  3. 后台开发实用书籍--后台开发:核心技术与应用实践
  4. linux命令pwd
  5. JUC并发编程三 并发架构--线程运行原理
  6. https ssl 非对称加密
  7. java: String的==与equals
  8. 前端一HTML:二十三行高的介绍,行高的单位
  9. 物联网成果初显但瓶颈犹存
  10. react-dnd 拖拽