什么是相关搜索

在使用搜索引擎的时候,输入一个关键词之后经常在页面底部或者右侧会出现相关搜索提示。例如搜索”万达”会提示“万达广场”,“万达影院”等。
相关搜索的作用是帮助用户更加快速的找到想要的东西,提升用户体验。当你通过一个关键词找不到想要的结果时相关搜索会帮到你,它会推荐你换一个关键词试试,所以它更像是搜索引擎中的一个推荐系统。搜索与推荐是不分家的,在搜索引擎中相关搜索的点击量还是很可观的。

如何实现相关搜索

数据思考

相关搜索要做的事情是根据用户输入的query理解其搜索意图,为用户推荐更多与其意图相近的query。
那么如何来找到其他意图相近的query呢?首先我们要收集用户行为数据:搜索日志,展现日志,点击日志等。有了数据之后考虑以下情况:

  1. 在我们使用搜索引擎的时候,输入一个关键词后发现没有我们想要的内容,这个时候我们一般会尝试再换一个关键词来搜索,例如,搜索“spark教程”之后发现不能满足你的需求,又输入“spark视频教程”来搜索,这个动作叫做query变换,后面出现的query就有可能是与前面query的语义相近词。
  2. 不同的用户有不同的搜索习惯,同一件事情,不同的用户也会用不同的词语来描述,如果不同query搜出来的结果相似,那么这些query也是相近的。
  3. 如果同一条结果出现在不同的query的搜索结果集中,那么这些query之间也是有联系的。尤其在不同query的结果集中,同一条结果都被点击了,那么更能表明这两个query是相近的了。
  4. 搜索了A query的多数用户也搜索了B query,那么A跟B存在一定的相似度。
  5. 根据query返回的网页内容相似度来推荐其他query。
  6. ……

算法实现

有了以上的思考之后,接下来看一下如何利用用户行为数据实现相关搜索。

1. 根据query变换

根据之前的分析,在一次搜索行为中一个query之后的其他query可能是我们要找的词。那么首先如何定义一次搜索行为呢。通常在一定的时间跨度内,例如5分钟,用户的搜索行为定义为一次搜索行为,即一个session。搜索日志格式为:
UA querytime userID IP query result:A B C D E...
从搜索日志中将用户行为按照session进行分割合并,得到如下结果:

1
2
userID:1 query:A afterwords:[B,C,D...]
userID:2 query:C afterwords:[E,G,Q...]

假如一个用户思维比较天马行空,上一秒搜索词为成龙,下一秒换成了人大代表(成龙做过人大代表),但并不能说明二者有很大的联系,所以要统计多个用户的搜索日志,并加入置信度等阈值过滤掉噪音。可得到如下结果:

spark教程:spark入门|spark基础教程|spark教程pdf

2. 协同过滤

通过日志我们可以得到如下的数据:

1
2
3
user1 query:A,B,C,D
user2 query:B,D,H,K
...

基于UserCF可以给搜索A query的用户推荐H query。

另外,我们还可以得到如下日志:

1
2
3
query:A result:url1 url2 url3 ...
query:B result:url2 url3 url4 ...
...

假设我们只取每个query结果的前十条,根据以上数据每个query可由一个由URL组成的向量来表示,每一维的向量值为URL的点展比,通过引入用户的点击行为数据,可以使得结果更加可靠。接下来就可以计算向量的相似度来进行相关推荐。
该方法本质也是一种CF:将query看做user,URL看做item,点击行为看做user like item的行为。可以用LFM等机器学习算法来得到相似度。

3. 词向量

有了上述的query得应的URL向量后可以用K-means方法来进行聚类,然后在同一个簇内进行相关搜索推荐。

另外可以根据词向量来进行相似度计算,首先从日志中得到如下数据:

1
2
3
URL1: query1 query2 query3 ...
URL2: query2 query4 query4 ...
...

每个URL可以由多个不同的query来召回,将其合并,一条记录可以看做是一个doc,每个doc由多个词(query)组成,用word2vec计算每个词的词向量,然后根据向量来计算相似度,进行相关搜索推荐。这个word2vec就比较厉害了,在得到的结果里,你搜范冰冰他会推荐给你李晨,你搜李晨除了给你推荐范冰冰之外还会推荐给你大黑牛、跑男等,有意思吧。

其他

相关搜索承担着扩展搜索,召回更多结果和帮助用户找到更准确的结果等责任。上述的算法部分算作是离线数据处理部分,处理完后可以将结果推到数据库中供在线部分查询使用。在线部分对用户输入的query进行分词,针对某些长尾词进行词干提取,然后去离线产生的数据中查询获取相关推荐。所以类似的系统设计一般都是重离线,轻在线,使得在线部分能够快速响应用户请求。另外,在线部分要记录用户的行为数据,将其给离线部分使用,形成一个闭环。

总结

相关搜索是搜索引擎中的一小部分,通过相关搜索可以提升用户搜索体验,并能够反馈给搜索引擎,提升搜索效果。所以,搜索和推荐是分不开的,当然啦,还有广告。上述只是写了一些思路,实际上做起来还有好多需要注意的地方。