中文分词
过年期间由于新冠肺炎疫情的原因,在家里多待了一周多的时间。于是就学了一下分布式系统之类杂七杂八的东西,现在终于有时间来整理一下之前学过的知识了。这次介绍一下全文检索中用到的中文分词器。
中文分词的问题
中文是博大精深的,因此要对中文进行系统分析的工作也是困难滴。不同于英文,英文的格式一个词就要空一格,这种设定使得英文的分析工作变得简单许多。而我们的中文就很不一样了,要对中文进行解析会面临各种各样的问题。
根据网上各种大佬的文章总结得出,中文分词的主要难点有下面几个:
1.中文歧义的识别
比较出名的一句话“结婚的和尚未结婚的”,如果使用正向最大匹配,容易分成“结婚/的/和尚/未/结婚的”,于是有的学者试图倒过来识别,逆向匹配会大于正向。但是碰到这句“结合成分子时”,采用逆向最大匹配,则会分为“结合/成分/子时”,更有甚者像“咬了猎人的狗”这种语意不明的词语,就更不容易正确分词了。这是中文分词的软肋。下面是些典型的歧义句:
交叉歧义(多种切分交织在一起):内塔内亚胡说的/确实/在理
组合歧义(不同情况下切分不同):这个人/手上有痣、我们公司人手
真歧义(几种切分都可以):乒乓球拍/卖/完了、乒乓球/拍卖/完了
2. 实体名识别
这个是中文分词遇到的最大的难点,也是最最紧迫的。实体名识别包括人名识别、地名识别、机构名识别,还包括有监督识别和无监督识别。有监督的还好,无监督基本是无解的,比如“王大力发球”是“王大力”还是“大力发球”,一般人都难以识别。
3. 新词热词发现
目前常用的新词发现还是一个比较有研究性的课题,虽然有些论文在准确率很高,但是大多是封闭测试,这意味着结果很难应用到实际工程中。
4.颗粒度问题
这个就是一个规则探讨的问题了,比如“北京大学”是“北京”+“大学”还是“北京大学”,人各有志,就连同一个人不同时间的标注也有可能是有区别的,虽然这个问题严格上来说不属于技术问题,但是对分词结果的评测却有着很大的关系。
主流的分词器
IKanalyzer分词器
IKanalyzer采用的是“正向迭代最细粒度切分算法”,开源简单,可拓展词典。但是自2012后不在更新,需要修改源码才能适配Lucene4的版本。具有“细粒度切分”和“智能分词”两种模式,早期比较出名的一款分词器。值得注意的是,现在
的知乎软件使用的分词器也是IKanalyzer。
IKanalyzer分词源码地址:
http://git.oschina.net/wltea/IK-Analyzer-2012FF/tree/master
Jcseg分词器
Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言直接http调用,同时提供了最新版本的lucene, solr, elasticsearch的分词接口!Jcseg自带了一个 jcseg.properties文件用于快速配置而得到适合不同场合的分词应用,例如:最大匹配词长,是否开启中文人名识别,是否追加拼音,是否追加同义词等!
经过测试:在人名、机构名称分词方面不如Ansj分词器,且使用会比较麻烦。
Jcseg分词器源码地址:http://git.oschina.net/lionsoul/jcseg
Ansj分词器
ansj_seg分词器暂时是网上较多文章认为是开源分词器里最强悍功能最丰富的。ansj_seg基于中科院的 ictclas 中文分词算法,智能、高效,在索引和自然语言分析方面都有很优秀的表现。同样也兼有拓展字典,多种分词模式。
但是要使用该分词器还是要写一个analyzer,并且该分词器分词虽然对人名和机构名称识别较好,却会缺失细粒度。而且,在识别身份证,邮箱等功能上还没有实现,在这方面并不如IKanalyzer和Jcseg分词器。
ansj分词器源码github链接: https://github.com/NLPchina/ansj_seg
总结:这三个分词器各有各的好处,但是哪一款最好用就得看场景,每一个分词器都有各自的优势和缺点。当然,要是想整合这些分词器,就得自己写一个了。