spseg-基于词库的高召回索引型分词器

spseg是碎片分词的缩写,是一个基于词库的,能保证召回率的索引型分词器;增加了词之间的单字碎片,保证分词一致性,适合对召回率有要求的场景


通常进行索引的分词器都是基于词库的,目前主流的分词器ik, ansj, mmseg, jieba等等都是。这些分词器都提供了智能分词效果,是把句子切成不产生交集的词与字,也就是消除了歧义。虽然各家算法不一样,但基本都要枚举出所有词,再选择保留哪些。既然是算法消歧,就不能保证非常准,例如"ABCDEFG"可以分成"A BCD EF G",BCDEF五个字分成了两个词,但有可能在"XBCDEFZ"上下文环境下被分成"X BC DE F Z"这样,不同的上下文产生不同的消歧结果本来没什么,但是人的理解通常比算法强,就会造成我们认为的效果不佳。在不同的分词条件下,例如index和query时候,便会造成查不到对应文档,损失召回率,俗称分词不一致。


在索引和查询的这个问题上,一种对应方法是在index时候增加分出的可能性,query时候依然使用智能分词。例如index时候ik使用全切分,ansj jieba也有索引型分词。如果知道它们的分词算法的话,仔细分析这样的组合依然有问题。


ansj jieba的索引型分词是基于智能分词的结果上合并的(不知道是否改了),很明显在不同上下文智能分词结果就可能不一样了,这样就不能保证一致性ik的全枚举不包含单字,如果自己把单字算进去,会导致索引倒排链很长,降低查询性能;


spseg就是借鉴了上述问题而开发的,原理也很简单,就是在全枚举词库之后只补上需要的单字,什么是需要的单字,除了词之间空缺的,最主要的是词有交集时候该词周边的字。有单字还是因此spseg只是对应需要高查全率的检索。

举个例子”中华人民共和国“ 一般词库里能分出 中华、华人、人民、共和、共和国、中华人民共和国。那么”中华人民“正好出来三个词中华和华人交集在华,华人和人民交集在人,中华和人民不交集,需要补的是华人两边的 中 民 ;共和 共和国 需要补国字。

另一个例子:”一直不明白“ 词库分出 一直、 不明、 明白、 不明白 ,那么补的是 "不" 和 "白"。

相比ik补所有字,spseg只补需要的,会少很多字,而补什么字其实也是根据词库来的。


spseg代码已经放到github上了,里面直接使用ansj分词中的tree_split代码做词典树,目前还比较简单,除了补字功能,取数字字母也是基本分词所需,以及lucene4.6的接口,但还没加上ik这种数量词组合词,也没有加智能算法(可能不会加入),测试也是简单测了一下。未来还会继续完善。






你可能感兴趣的:(分词,spseg,分词一致性)