分词器进阶
在实现了.Net版分词器之后,一直想进一步提升搜索速度和体验。最近又学习全切分分词以及IK分词原理,在理解其理念再加上结合本公司业务需求,决定改进分词器算法,宗旨为提升性能,提高体验。
对比原有分词:
基于词典的最长匹配:
基于词典分词的一种方法是将词典构建成一个Trie搜索树,每个节点放一个字,同时将词的信息放在Node中,如词性,权重等。Trie树可以是一种多层散列表,在每一层上查找的速度是O(1),所以匹配速度非常快。
如下图所示的是一个由词组集<一万,一万多,一万元,一上午,一下午,一下子>生成的Tire树的子树

新分词算法:
首先通过Trie树获取最长匹配,依旧是通过正、反向匹配中选取最长项(词数最少项),然后在基础上,进一步按照正、反向最短切分(词数最多项)。
如上示例:一下午花了一万元(【下午】,【花了】也放入词典)
最长匹配为:【一下午】,【花了】,【一万元】
在最长匹配上切分:【一】,【下午】,【花了】(小于三个字的词不需要进一步切分),【一万】,【元】
将上述两种切分方法都一起建入索引库:【一下午】,【花了】,【一万元】,【一】,【下午】,【一万】,【元】
这样一来,搜索其中任何一个词都能搜索到,避免了只有最长匹配时候的通配搜索(wildcard search)需求。效果上接近IK分词器,同时按照业务需求跟IK中的二元分词区别开来,更好的满足搜索体验:提升速度。
到目前为止,该分词器主要特点为:
1. 机械分词:同时支持最长匹配(正、反向)——索引、搜索; 最短匹配(正、反向)——索引 两者结合使用鉴于词典中词的长度相对短(一般不超过4个字),具体算法上跟IK分词器、全切分词有区别。
2. 对数字进行特殊处理(短切,如不超过4位长数字),同时支持小数;拉丁文单词分切为基础,不处理stemming(词干抽取)和lemmatisation(词形还原)。
3. 直接支持部分wildcard分词,目前对?,*等直接支持。其他符号(语法)鉴于业务需要后续添加。
影响:由于分词数量更多,导致索引库在原有基础上增大,但极端情况下不会超过两倍(词典中的词很少超过4个字),较之搜索从很多通配查询(wildcard query)变为更为快速的词条查询(term query),这个副作用完全能接受!
浙公网安备 33010602011771号