搜索中query扩展方法汇总
1、背景
搜索系统是一个复杂的系统,当用户在输入框中输入想要的问题,或者输入想要的商品后,点击"确定"按钮,搜索系统会经历一系列的操作,query理解和分析,召回结果,相关性打分,排序等,所有的这些操作都在毫秒级别内完成。
而本文所讲述的query扩展是在query理解和分析阶段的操作。query扩展,顾名思义就是对当前输入的query进行一定的改写,经过扩充,得到其扩充的词汇。
在不同的地方,可能叫法不同,有的叫query改写,有的叫同义词等等。
2、用途
query扩展的用途主要用于召回阶段的扩召回。当用户的输入不明确的时候,我们可以将当前的query进行扩展,得到用户想要的结果。例如当用户输入'西红柿炒鸡蛋'的时候,我们可以将query扩展为'番茄炒鸡蛋'、'番茄炒蛋',这样在召回阶段就可以召回更多的结果,给用户更好的体验。
西红柿炒鸡蛋----番茄炒蛋
马铃薯----土豆
3、方法
query扩展方法大体可以分为如下几类:字面匹配方式、基于用户日志的挖掘、基于外部数据的挖掘方式、语义相似度、基于seq2seq的改写、基于强化学习的改写等。
3.1、字面匹配
字面匹配方式是通过各种规则,拼音匹配,编辑距离等方式,得到字面上的匹配结果。
- 中文数字改写
一千零一夜---1001夜
客二代---客2代
- 中文拼音匹配
凯德茂---凯德mall
la尚瘾---辣尚瘾
- 编辑距离
编辑距离即通过计算两个文本串的编辑距离来进行相似度的计算 - 优缺点
字面匹配方法简单,一般在系统刚开始的时候,使用这种方式可以挖掘出很多这种的词汇,但是缺点也比较明显,无法适配语义相关的query,比如治脚气和达克宁就没有办法进行匹配。
3.2、基于用户日志的挖掘
- 基于用户session日志
一般情况下,若用户搜索一个query,但是没有想要的结果,用户会继续改变输入,直到搜索到想要的结果为止。基于用户的这种行为,我们可以挖掘出相应的query对。
例如:用户搜索“比萨”,但是没有想要的结果,那么用户会改变其输入,比如“披萨”,那么这时,可以将“比萨”和“披萨”作为同义词。 - 基于用户点击日志
基于用户点击行为日志是指若用户通过两个不同的搜索词点击了同一个doc,那么我们认为这两个query是有联系的,共点击次数越多,相似性也越大。所以一些基于推荐的方法都可以用于这里的query改写,常用的一些算法有simrank,simrank++等。 - 优缺点
基于用户行为日志可以一定程度上解决语义的问题,同时也可以挖掘出较多的相似query,不过生成的badcase也可能较多,所以需要进行甄别。除此之外,对于一些冷启动的系统来说,由于没有较多的用户行为信息,所以就没有办法利用当前方法。
3.3、基于外部数据的挖掘
基于外部数据是指直接通过挖掘好的数据来扩充同义词,例如中文的同义词词林,百度百科中的XX又名XX等。可以直接扩充改写词。
这种方法少了一些挖掘的工作,但是也需要对原始数据进行处理。同时,对于LBS的场景,也许这种外部数据并不适配。
3.4、语义相似度
若是我们训练好了一个语言模型,通过该模型我们可以得到query的向量的话,那我们可以计算候选query对相似性信息,最常见的就是双塔模型,同于两个query,分别得到其向量,进而通过cosin的方式计算相似性分数。这种方法会用到预训练的语言模型,同时,我们也需要得到有标记的query对作为训练数据。
3.5、基于seq2seq的改写
基于seq2seq的方法类似于翻译,首先我们要有一批同义词数据集合,进而我们可以用NMT的方法来进行求解。当然这种方法会引起语义飘移的现象。