搜索引擎(2)—— 查询理解 —— 分词
分词是搜索中最基本也是非常重要的一个功能,正确的分词是好的搜索效果的必要条件。
1. 分词粒度
分词中,最主要的问题是分词粒度问题。例如“射雕英雄传”,下面的几种分词方式,哪一种最正确?
- 最细粒度分词:【射雕,英雄,传】
- 正常粒度分词:【射雕,英雄传】
- 最粗粒度分词:【射雕英雄传】
- 混合粒度分词:【射雕,射雕英雄传,英雄,英雄传,传】
上述4种都没有错,要根据具体的应用场景,来决定使用哪种分词方式。
- 构建索引
在构建索引时,为了扩大召回,一般要求粗细粒度都要有,第4种是最好的。表示索引中,【射雕,射雕英雄传,英雄,英雄传,传】这5个词都有,用户输入不全时,例如输入“射雕”,也可以把它搜出来。
如果索引中只用粗粒度分词,例如第3种【射雕英雄传】,索引中只有一个词【射雕英雄传】,用户搜索“射雕英雄”,就会与之匹配不上,搜索不到这个结果。
- 在线查询
在线检索时,分词的粗细粒度各有优劣。- 粗粒度分词:
- 召回的数量少。例如,在线查询时,分成了【射雕英雄传】,那就搜索不到《射雕英雄后传》之类的内容了。
- 搜索准确率高,只搜索出完整包含《射雕英雄传》,不会搜索出《儿女英雄传》之类的内容
- 性能快,只用一个粗粒度term搜索,倒排相对较短。只需要取一个倒排拉链,没有其它term参与打分计算。
- 细粒度分词:(与粗粒度分词的优劣正好相反)
- 召回数量多,可以搜索《射雕英雄后传》《儿女英雄传》之类(如果多个term之间是或查询,不要求所有term都命中)。
- 准确率会下降,搜索出部分相关的内容。
- 处理逻辑更复杂。分词后,多个term之间的关系如何处理,是取交集还是并集?
- 粗粒度分词:
如果是约定俗成的内容,例如成语、人名、地名等,不建议再做进一步细分词。否则,搜索出的结果会有明显偏差。
如果是可粗可细的,可以考虑一个折中办法:先用粗粒度分词去做搜索,如果搜索结果够多、质量够好,就不再用细粒度分词去做检索。否则,如果搜索结果数量偏少,或质量不佳,则再细分词,去做进一步的查询。
举个例子:人名“周杰伦”,建索引时,尽可能的各种粒度都有,例如分成【周,周杰,周杰伦,杰伦】。
-
用户搜索“周杰伦”,只用粗粒度分词【周杰伦】,搜索出准确的内容。如果再细分出【周杰】,搜索出“周杰”相关的内容,明确主违背了用户的意图。
-
用户搜索“周”或“周杰”,也可以搜索出“周杰伦”的相关内容。因为用户有可能是想搜索周杰伦,未输入全就点击了搜索按钮。输入不全,在搜索中是一种常见的问题。
2 词形还原&词干提取
在涉及英语等语言时,会涉及时态、单复数等变化问题,中文里没有这个问题。分词时如果不考虑词形还原&干提取问题中,会导致漏召回。
- 词形还原(Lemmatization)
词形还原,是将词还原成最原始的状态。例如过去式、过去分词,变成原样(running -> run)。复数变成单数等(dogs -> dog)。
也就是用户在搜索dog时,也要能搜索出dogs的内容。同样,搜索dogs,也要能搜索出dog的内容。所以分词时,需要将dogs识别出原形是dog。
词形还原一般是通过词典实现,准确率高。也可以基于规则做,但是我们知道英语里不规则的单复数、时态例子太多了,用规则解决不了。
- 词干提取(temming)
词干提取是去除词的后缀,得到词根。与词形还原一个很明显的区别是,词形还原后的仍然是一个有意义的词,但是词干提取出来的词根,可能不是一个单词,只是单词的一部分。例如electricity的词根是electr。
相比词形还原,用了词干提取后,召回更多,准确率同时也会下降。
在搜索中,如果要使用词形还原与词干提取,用户输入的原词,与还原后的词或词根,这2者之间的权重可能要做些区分。否则,会搜索出一些有偏差的结果。