Bengxy

聊一聊Query的改写

搜索系列

字数统计: 1.9k阅读时长: 6 min
2017/06/17 Share

背景

在目前的搜索环境中,最常用的是根据item文本分词,建立倒排索引。

这种方法检索速度快,逻辑实现简单灵活,同时搜索出的结果可解释性较强。但是,在这种场景下,对检索词的匹配程度要求较高,比如用户搜索“浙江大学“,那么文本中含有浙江大学的内容就会展示出来,但是像“ZJU、浙大”这样的缩写就难以捕获了。

比如
Query: 浙江大学 -> 浙江大学、ZJU、浙大、紫金港校区...

简单倒排索引下的匹配
Doc1 : 浙江大学又卖校区啦    匹配
Doc2 : 浙大又拍出了一个地王   不匹配
Doc3 : I love ZJU迎校庆活动  不匹配

更极端的例子:
Query: 老人机 -> 老年机,老人手机,老年人手机

Query和Item之间文本差异导致一些满足用户意图的文本无法被召回。

这种问题的解决思路有很多中,比如:

  • Query改写(扩充、联想) 【本文介绍】
  • 协同推荐(后台基于内容的关联)

本文主要介绍Query改写方面的一些技巧。

我有特别的Query改写技巧

汇总一下,Query改写主要有这几个方面

  • 相似Query改写
  • 意图预测改写
  • 去冗余词
  • 跨媒体Query补充

相似Query改写

要有数据

Query改写很重要的一点是获取改写数据。单靠人力标注是行不通的,机器如何知道 “浙江大学” ~ “ZJU”之间的关联呢?

其实方法和推荐系统中找近似商品的思路很像。

搜索引擎通常每日要处理百万级别以上的请求,像百度、谷歌、淘宝这类检索要处理上亿级别的检索。 但是这之中大量的搜索意图其实是相近的。
那么,就可以通过语义、行为、session log等挖掘出相似的query。

大致的流程框架如下:

  • 按照点击相似度、文本相似度、Session相似度衡量Query之间的相似度,得到候选的Pair
  • (可选)交给重排序模块,对Query pair的优先级做优化
  • 生成Top K的改写结果

相似Query的抽取

协同过滤

类似基于用户的协同过滤,我们把query的关键词当做user,把点击的doc作为item。传统协同过滤是user : item矩阵,而现在就是 query_key_word : click_doc 矩阵

通过协同过滤,获得query相似度

语义维度

从query点击的doc出发,使用Doc2Vec,可以学到query的embedding矩阵。

Session 维度

对于一次点击session,我们可以把这段session当成一个句子,然后用Word2Vec的方法,将query进行embedding,得到向量化表达

Word2Vec是非常基础word embedding的算法。
主要能够发掘序列中,item的关联:

e.g. 对于下面两个序列,可以认为w2和w4是有一定关联的
w1 -> w2 -> w3
w1 -> w4 -> w3

其他维度

除了上述维度的相似比较外,在工程和实际应用中,还可以用几个trick来提高效果。

  • 辅助tag的相似度
    • 比如百度的网站在曝光时,需要提交所属行业,可以增加这个标签,划分query的相似度
  • query文本距离
  • 意图差异
    • 谷歌中,用户是搜索图片还是新闻还是地图
    • 淘宝中,用户搜索的品牌

默认搜索 - key word : 位置

重排序

重排序最主要是需要一个label,但是我们在实际的应用中没有显式的label。通常我们是通过网页的实际点击来进行预测。

在训练时,利用实际点击的item doc作为依据,把重排序后的文本和doc的匹配度作为评分。

在线上测试时,则是通过A/B test比较不同模型下的点击率变化。

长尾query的处理

也许在baidu中,像电影、汽车、医院(笑)这一类下query搜索的比较多,但是比如“上海的IS清水离心泵厂哪家强?”这种东西,出现次数是比较少的,而上文提到的协同过滤、word2vec对长尾数据的variance偏高,一般效果不是很好

因此,这类query通常会先进行分词,接着通过短语翻译,生成替换候选集。

意图预测改写

这类改写在电商中用的较多,因为需要根据query捕获用户意图,从而生成潜在词。

举个例子

query : 牛仔裤 潮 
意图改写 : 牛仔裤,潮,14-30岁,青年,... 

query : 怎么治疗血友病
意图改写 : 治疗,血友病,治病,医院,莆田系往前排一排-.-

通常,这类改写是从网站对Doc出发。首先,构建一个粗略的意图词表和同义词list。

query : 牛仔裤 潮 -> click_doc : 青年男女时尚潮流酷炫吊炸天牛仔裤

同义词list : 
    牛仔裤 -> 青年,男,女,时尚,潮流,酷,炫,吊炸天
    潮 -> 青年,男,女,时尚,潮流,酷,炫,吊炸天,牛仔裤

在数据量充足的情况下,最终优化的结果可能就是

潮 -> 时尚,酷,青年

冗余词检索

连衣裙 女
百度 搜索引擎

这里,就是冗余词了,因为穿连衣裙的即使是男程序员,也叫女装大佬,不叫别的什么大佬,同样搜索引擎也是冗余词。

值得注意的是,这些冗余词是噪声,不仅不会优化搜索结果,可能还有反作用。 比如搜连衣裙的人,目标明确定位是连衣裙,加上女,可能把别的女装搜出来

那么如何衡量冗余词,为什么 连衣裙 和 女 是冗余,但是 牛仔裤 和 女 就不是冗余词呢?

这里其实可以联想到,我们衡量是否冗余,主要是反映了这两个word是不是强相关。衡量强相关性,信息熵是个很好的工具:

其中,$t$是主体,$s_i$是潜在冗余词,我们可以选词库中协同出现的TOP K,然后计算着K个的冗余关系,设定阈值后过滤出冗余词。

比如这里,连衣裙来说,不是冗余词,因为像衬衫 女牛仔裤 女有很多。
但是,连衣裙来说,就是冗余词,因为连衣裙 棉 女连衣裙 雪纺 女.. 等样本中,占了绝大多数。

跨媒体补充

跨媒体主要是根据query的text embedding,用相近media的embedding向量补充,提高检索在media领域,如图片、视频上的检索能力。

比如搜索图片时,我们希望搜索一副唯美的桌面壁纸,通过跨媒体,可以获得“唯美”<->“图片像素”之间的关联,更好的反馈检索结果。

跨领域搜索是比较热门的方向,现在的做法是通过vector相似度,比如word2vec <—> vgg16 embedding 之间计算关联。但是计算开销大。
-w306

此外还有很多tag based方法,速度快,是目前主流使用的方法。

比如大家喜闻乐见的 RBD-000 检索的时候被补上 torrent avi

这类算法需要先人工对图片、视频打上tag,耗人力,但是效果好,像优酷、爱奇艺、壁纸应用等通常都是用这种方法。

CATALOG
  1. 1. 背景
  2. 2. 我有特别的Query改写技巧
    1. 2.1. 相似Query改写
      1. 2.1.1. 要有数据
      2. 2.1.2. 相似Query的抽取
        1. 2.1.2.1. 协同过滤
        2. 2.1.2.2. 语义维度
        3. 2.1.2.3. Session 维度
        4. 2.1.2.4. 其他维度
      3. 2.1.3. 重排序
      4. 2.1.4. 长尾query的处理
    2. 2.2. 意图预测改写
    3. 2.3. 冗余词检索
    4. 2.4. 跨媒体补充