有哪些比较好的中文分词方案?

本题已收录至知乎圆桌:机器之能 X 语言之美,更多「人工智能」相关话题欢迎关注讨论。
关注者
3,373
被浏览
272,916

38 个回答

最近正好在做搜索,主动答

首先整理一下我们在做分词的时候一些思考吧:

中文分词算法大概分为两大类

a.第一类是基于字符串匹配,即扫描字符串,如果发现字符串的子串和词相同,就算匹配。

这类分词通常会加入一些启发式规则,比如“正向/反向最大匹配”, “长词优先” 等策略

这类算法优点是速度块,都是O(n)时间复杂度,实现简单,效果尚可。
也有缺点,就是对歧义和未登录词处理不好。

歧义的例子很简单"长春市/长春/药店" "长春/市长/春药/店".
未登录词即词典中没有出现的词,当然也就处理不好。

ikanalyzer,paoding 等就是基于字符串匹配的分词。

b.第二类是基于统计以及机器学习的分词方式

这类分词基于人工标注的词性和统计特征,对中文进行建模,即根据观测到的数据(标注好的语料)对模型参数进行估计,即训练。 在分词阶段再通过模型计算各种分词出现的概率,将概率最大的分词结果作为最终结果。常见的序列标注模型有HMM和CRF。

这类分词算法能很好处理歧义和未登录词问题,效果比前一类效果好,但是需要大量的人工标注数据,以及较慢的分词速度。

ICTCLAS是基于HMM的分词库。

我们在重构知乎搜索的时候,权衡标注工作量和性能,以及代码实现的复杂程度,我们考虑采用基于字符串匹配的分词方法

B. 除了标注量,准确率和效果的考量,分词粒度也是一个需要考虑的指标,


这里有一个真实的例子,即
"团购网站的本质是什么?"
这是一个知乎的问题,如果使用单一粒度的分词,如果我们有


团购
团购网
网站
团购网站
本质

什么

这些词在词典中,按最大匹配分词结果是
“团购网站/的/本质/是/什么”


当用户输入
团购网的本质
分词结果是
团购网/的/本质
团购网这个词显然是没有匹配的。

同样,如果按最小匹配分词,会有类似的问题。

因此,我们考虑基于字符串匹配的分词方法最好能够匹配出多粒度的结果,即
能分出
“团购网站/团购/团购网/网站/的/本质/是/什么”
这样多粒度的结果。

最终我们采用了ikanalyzer,
基于文本匹配,不需要投入大量人力进行训练和标注
可以自定词典,方便加入domain specific的词语
能分出多粒度的结果。
written in java.
中文分词是个基础问题,研究成果已有不少,我拣几个我自己觉得好的吧。
  1. @张磊 提到的mmseg是我自己最喜欢的分词方法,简单、高效、实用、效果还不错。technology.chtsai.org/m
    我给它起了个名字,叫做“3段回溯式方法”,即每次从一个完整的句子里,按照从左向右的顺序,识别出多种不同的3个词的组合;然后根据下面的4条消歧规则,确定最佳的备选词组合;选择备选词组合中的第1个词,作为1次迭代的分词结果;剩余的2个词继续进行下一轮的分词运算。采用这种办法的好处是,为传统的前向最大匹配算法加入了上下文信息,解决了其每次选词只考虑词本身,而忽视上下文相关词的问题。4条消歧规则包括,
    1)备选词组合的长度之和最大。
    2)备选词组合的平均词长最大;
    3)备选词组合的词长变化最小;
    4)备选词组合中,单字词的出现频率统计值最高。
  2. CRF方法是目前公认的效果最好的分词算法。但,具体效果是否好,也依赖于你使用的训练模型。nlp.stanford.edu/softwa
  3. 我认识一个做搜索解决方案的朋友,他们公司提供了CRF和mmseg的开源实现 coreseek.cn/opensource/
  4. 其实还可以使用专业公司的解决方案,比如海量和中科院分词的收费版本,也花不了多少钱。集中精力找到你自己产品独特的价值所在。