1. 项目简介
query下拉推荐或query自动补全,是在搜索引擎场景中广泛应用的一个功能;当搜索栏中有任意输入时,搜索栏下方立刻根据输入推荐/提示出以输入为前缀的相关词,如图1所示。
良好的推荐效果不仅能够节省用户输入提高用户搜索,同时对用户体验也有极大的提升。接下来的章节中,将围绕这个主题进行 详细讨论其中的问题和挑战,及在实际业务中所采用的方案。
2. 相关工作
2.1 问题
- 如何鉴别输入是一个前缀
- 前缀和候选词之间如何建立联系
- 候选关键词列表排序规则
以上是该项目需要解决的主要方面。
对于问题1,在query suggestion项目中把任意用户的输入都作为一个前缀,不管当前输入是仅有一个字母还是一个词组。
项目中通过在prefixes和候选关键词之间建立倒排索引将二者联系起来,倒排索引的建立在离线状态下完成(可定期更新),在线情况实则只是一个通过key查找value的过程,而有很多人会怀疑,按这种方式,这个效率会不会很低,经过实测,在prefix集为150w的情况下,整个服务的返回时间在10ms左右,那么这个在通用场景下效率完全可以胜任。
最后一点就是候选关键词列表rank 模型,即如何从候选中选择合适的关键词,本项目采用关键词搜索次数及其对应结果数,加权求和作为每个keyword的 rank score。
3. 模型和算法
在这个项目中主要用到的算法和模型相对较简单,主要应用在prefix生成、prefix和关键词倒排索引,及候选关键词排序。用到的模型包括:
- 1 . 拼音->汉字模型
用于通过汉字(拼音)获取拼音(汉字),在这个模型中如果汉字是多音字,则会将其所有拼音一同返回。 - 2 . prefix生成模型
根据关键词、关键词对应拼音等生成对应的prefix列表。 - 3 . 关键词排序模型
对候选关键词列表进行排序,返回最合适的关键词列表。
4. 策略设计
项目整体设计思路如下所示:
这是一个完备的系统设计方案,包括数据输入、模型创建、数据更新等。项目首先根据历史搜索日志或者某种结构化文档提取出关键词(这个过程会涉及到文本分词,文本分词器会在另一篇文档中进行介绍),并记录下其对应的检索次数和所对应的结果数或者是词频,作为整个数据模型的输入,然后用到前术的算法和模型build data model,这个过程分为增量更新和全量更新,增量更新就是把送来的数据build之后加入到之前的内存结构中;全量索引即是用新生成的数据模型替换旧的数据模型。之所以设计数据更新这一部分的原因是我们所用数据的属性是在不停的变动中,所以要保持数据新颖度。之后通过已经创建好的数据模型就可以获取每个prefix下的推荐关键词了。
5. 评估方案
对于query suggestion的评估最主要指标是,比较推荐关键词是否是用户真实想要输入的词,而本文的设计方案只能通过上线后从日志中统计用户真实输入及推荐结果的数据然后进行分析。目前从实际情况来看,因为是对搜索日志数据进行挖掘进行推荐,换句话说,推荐的词一般都是全网热搜的词,效果相对较好。
6. 其他方式及优化方向
本文只是描述了一种实现query suggestion的简单方案,在实际应用中,还需要考虑用户搜索上下文场景进行信息以便准确预测用户想要的真是输入。总体来说,未来优化方向为:
- 考虑用户上下文信息进行准确推荐
- 排序模型优化,采用ML方法去自动学习每个部分的权重
- 考虑是否有其他方式来实现这个功能。
项目地址: https://github.com/syw2014/query-suggestion
转载请注明出处:http://www.jianshu.com/p/aa074cc6a7b3