关于中文分词的一元分词讨论(优缺点)

一元分词:指语句中每个字都成词,按字切分,不去组合,类似英文单词。

回合1:

支持一元分词的观点:

其实solr自带的跨语言自然一元分词就很好了,怎么测效果也不比国内搞的分词差,也许大多数情况下不需要国产的中文分词。下面列举原因,欢迎拍砖。 

1、不可能有一种中文分词算法能完全准确地分词,完全按中文分词进行的搜索不能保证搜索的全覆盖,而按字分词的结果是可以保证的。

2、中文分词带来额外的开销,比如查字典,智能算法等,而一元按字分词开销最小。有人说按字分词造成索引变大,造成开销大,其实英文单词比中文字还多,这方面不是问题。

3、按中文分词搜索,首先对要搜索的内容要先分词,这就有可能造成了第一步最主要的误差, 中文分词引擎分出的词很可能不能代表用户的意思,而luncene基于slop的匹配误差更小。

4、随着中文分词算法的改进,有可能在索引中形成词信息孤岛,要么随它占用资源,要么付出成本去维护;而基于一元字分词的算法就没有这个问题。


遗憾的是让外国人搞出了这个通用算法在中文分词方面居然比我们自己做的还好。


反对一元分词的观点:

我们先把话题缩小到“搜索”这个小范畴内,不然放到NLP领域,不做分词就什么都不是了。


1、不可能有一种中文分词算法能完全准确地分词,完全按中文分词进行的搜索不能保证搜索的全覆盖,而按字分词的结果是可以保证的。 分词的准确率方面,目前基本常用的分词技术都有99%左右的准确率(准确率是指不分错,不包括未登录词)。按字切分当然不会错,但是在搜索时同样召回了大量“不相关”的结果,给做Rank带来了巨大的难度。同时还丢失了众多“词”一级的属性。

2、中文分词带来额外的开销,比如查字典,智能算法等,而一元按字分词开销最小。有人说按字分词造成索引变大,造成开销大,其实英文单词比中文字还多,这方面不是问题 。

中分分词目前的主流算法,都是低开销型的。中科院那个都能达到500KB/s的分词速度,各家企业应用的分词也完全不是性能瓶颈。切词性能说是不存在的。

3、按中文分词搜索,首先对要搜索的内容要先分词,这就有可能造成了第一步最主要的误差,中文分词引擎分出的词很可能不能代表用户的意思,而luncene基于slop的匹配误差更小。

用户表述的多样性,可以通过多粒度切词来达到同样的效果,魔兽世界可以切出魔兽,也可以切出魔兽世界,这个不存在切词的劣势一说。

4、随着中文分词算法的改进,有可能在索引中形成词信息孤岛,要么随它占用资源,要么付出成本去维护。而基于一元字分词的算法就没有这个问题 。这个没什么好说的。


按字切分的一元分词,就是石器时代的东西。词一级的信息被完全丢失,最基本的idf信息都失效了,term重要性分析基本不可能进行,更不要说加入词性,做同义词变换,做句法树等等应用。这里就不继续展开了。


现代搜索技术发展了这么多年,按字切分这种甚至不如二元切分的技术(也就是二元分词技术),实在是不敢苟同。这不是一个技术人员应该有的视野,如果继续坚持这种原始野性的世界观,只有被淘汰没有什么其他的。

回合2:

支持方:

1、其实一元分词这种说法就不规范,按理解就是一个字一分。而多元的多个字连起来分,无论在任何情况下,一元分词能保证全覆盖。针对某些句子,用多元分很可能有多种分法,不结合语义不能自动确定哪个是对的,比如”登上海南公司的航班”不保证不切出”上海”、”上海南”来,这就造成多元分词的不稳定,不同软件,针对不同句子,有不同的结果,而且不能保证信息的全覆盖,有可能搜不到的情况(在mmseg4j复杂模式下,切出一个长词”海南航空公司”,搜局部就可能搜不到),甚至直接切出垃圾(如前面的”上海”,又占资源,有影响结果)。

2、其次,不能说多元分词比一元分词准确,准确和词的上下文的推导算法有关,多元的可以按前后词推导,一元的照样可以按前后字推导。只不过solr自带的跨语言自然一元分词是按照基于slop的匹配,没有推导,slop是指匹配结果字直接的间距,最小的结果排最前。如果搜“中华人民共和国”七个字,每个字都匹配上了,而且他们的slop都等于0(最高优先级),这个没用字典哦。这种算法并不算多好,但至少现在在solr的一般站内搜索应用中并不比国产的差。


反对方:

1、“海南航空公司”的case,广泛应用的多粒度切词已经可以解决你说的问题,即会切出长串,也会切出基本词。和你说的效果上没有差别。

2、你说的间距,就是在信息检索时用到的offset。任何切词方法在rank时都会用到这个技术。 我给你举个例子,搜索“新浪”,你出“浪新”,是不是offset也是0……..

3、你说的“不差”,代表的也是石器时代的“不差”,这种东西没法深化,没法改进,跟时代脱节。term召回率固然重要,前提是召回的term都是从相关性上准确的,为了召回率提升0.01%换来召回结果准确率下降10%,这个是傻,不是先进。更何况上面说到的多粒度切词这类简单的做法,完全可以达到同样的召回率提升。

4、换句话说,如果你举出任意一个中文搜索引擎用的是你说的方法,并且取得了对应较好的效果来,也算是个旁证。

5、不客气的说,对于term召回率的问题,用最小粒度切分的方法来解决,是懒。如果在我的team里面,有任何一个人提出这样的解决方案,肯定被我劈头盖脸打回去。

回合3:

支持方:

不同的分词方法分出来的也不一样,用IKAnalyzer就分出来 “登上 上海 海南 南航 航空公司 航空 公司 班机”, 几乎和单字一样多。 

你说的多粒度切词有的用,有的不用,中科院的和mmseg4j好像就不用,用粒度越多,垃圾越多。


我们是准备在站内那里用solr, 测试结果国产的分词不一定好,不过我们要求覆盖要全,找不到就属于大问题了。


专做搜索引擎公司的内部机制肯定比我们讨论的这些开源的复杂,但我还是觉得分词还是最细分,但结果交给rank、filter等算法去就好,这也是原本Lucene设计的机制,全世界大多数语言在google上肯定也是这种机制,关于东亚语言的分词方面好像就是国内叫得比较欢,甚至韩国、日本在solr中好像没有专门自己搞的的分词插件,相比依赖国内某个老师、某个个人的东西,我更倾向于某些西方的技术,如果想搞个好的,不如在lucene上搞一个基于动态自动维护字典的的filter。


反对方:

xxx某团队成员: 

“粒度越多垃圾越多”: 不知是怎么得到这个结论的 

“google肯定也是这种机制”:胡扯 

“分词还是最细分,但结果交给rank、filter等算法去就好”: rank算法都是和分词粒度相匹配的

反正这个答案已经被反对到了最低的位置,贻害其他人的概率不大

回合4:

支持方: 

最好实际测一下再说,搜出结果里面含风马牛不相及的内容很正常,只要不排在合理内容的前面,搜偏一点的内容很容易就能得到(各大搜索引擎都是这样)。而且搜偏的反而用一元最好。就搜“上海今天天气如何”,如果不结合语义搜的话,按照一元基于slop和优先序的算法可能效果比分词的还好。


就算按国产组件分词,也不代表不一元切了,就算用国产组件分词去创建索引,里面的javascript:;单字量照样和所用到的汉字容量差不多。“有限公司”rank可能是很高,但不代表“有”、”限”、”公”、”司”四个字的rank不高(词也是由字组成的),一元的效果并不差。


上面说的全是最近我实际中测得效果,也欢迎大家拿实例说话。


虽然我说一元的不差,但不代表分词不好,只是国内做的不好(同义词,语义分析,权重等都需要再词的基础上进行),还有我认为他们方向不对。


反对方: 

我不知道你最后的遗憾从何而来。。按字分这是小学二年级的水平吧,何来外国人发明?

如果你们真用字为单位做搜索。。那只能说后面排序的时候掉进的坑就是分词的时候挖的,然而你还不自知。。


从另外的角度,由于中文词语表述多样,以及用户输入的不可预测性和新词等,有时候按字来更好点,但是做了分词也不代表就不用字特征来啊,只是优先词特征而已。


感谢夜色




本文转载自(本篇博文对本文描述略有改动):https://blog.csdn.net/mingzai624/article/details/51695310


可参考以下链接:

https://www.zhihu.com/question/19578687/answer/14000293



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与