搜索引擎进行信息检索的优化策略方法(阿里飞猪在旅行场景下搜索技术的应用与创新(上))
优采云 发布时间: 2022-01-02 10:25搜索引擎进行信息检索的优化策略方法(阿里飞猪在旅行场景下搜索技术的应用与创新(上))
Guide:搜索旅游场景最初出现是为了满足用户特定的强烈需求,比如搜索机票、优采云机票、酒店等,这些需求都有自己不同的特点,与传统的旅游搜索通常为不同的业务定制搜索策略。随着人工智能技术的不断发展,用户对产品的易用性提出了更高的要求。旅游场景搜索逐渐发展成为具有定制化旅游搜索策略的全文搜索引擎。本文将向您介绍阿里巴巴飞猪搜索技术在出行场景中的应用与创新。主要内容包括:
01 猪猪背景
1. 飞猪搜索
飞猪的搜索业务分为两部分:一是全球搜索,二是行业搜索。右边飞猪界面的全局搜索是最上面的输入框。可以从全局搜索中获取与飞猪内部所有内容直接对应的搜索条目。右图中间部分是行业搜索的垂直入口。比如搜索酒店机票和旅游度假产品,一般用户会使用行业小搜索和垂直搜索需求。随着飞猪业务的发展和用户需求的变化,流量将逐渐从行业小搜索向飞猪全球搜索迁移。主要是因为:
2. 竹搜框架
竹搜框架如图所示。首先通过调用QP获取当前的Query理解并生成需要召回的Query,然后通过SP分页服务调用HA3倒排索引获得召回结果。通过LTP服务对结果进行粗排序和加权排序,最终将结果展示给用户。这里主要介绍QP的工作。
3. QP
QP 是查询理解和召回生成服务。在这项服务中,我们面临的主要挑战是:
02 基础设施建设
接下来介绍一下飞猪在具体基础设施建设方面的一些工作。
1. 查询标记
标记是 QP 中的一项基本任务。负责的功能是输入查询的目的地和意图。例如,“北京自由行”中的“北京”是用户的目的地,“自由行”是用户的意图和需求。可以看出,用户想要的是免费旅游产品,而不是跟团游。产品,你可能想在不购物的情况下获得一些机票+酒店或产品。
这里的工作主要分为以下几层:
由于在线性能限制,我们主要依靠离线挖矿。这里以我们内部重要的产品POI挖掘为例,介绍我们的离线挖掘标注工作。
2.商品POI挖掘
① QueryTagging
除了POI挖掘,产品标题中可能会有一些景点信息,但详细信息中也会收录很多信息。因此,我们需要从这些内容中挖掘出有价值的信息来扩大词汇量。比如图片中景点的POI可以作为索引参与召回,但是细节是非结构化的HTML文本,POI实体挖掘起来会比较困难。
②建模方法
图片上传失败
再试一次
我们用一个典型的序列标注问题来解决这个问题。我们过滤一些特征,例如词特征、数字特征和类别特征,并通过手动注释来训练我们的 CRF++ 模型。后来我们也升级到Template下的一个模型来训练NER模型,这样我们就可以离线连接大量的文本数据,进行序列标注。最终,我们实现了超过 99% 的准确率和超过 95% 的召回率。扩展了大量未挖掘出POI产品/POI特征的度假产品,使其具备POI特征,可以更好地服务后续POI和检索。
3. 同义词挖掘
在旅游行业,有四种同义词:
我们希望可以使用一个通用模型来解决这种同义词关系。
我们的方法是基于用户点击行为,拼接query和product title,让query和title中的词形成上下文,然后基于word2vec的skip-gram模型得到每个词的词向量,并基于在语义相似度上,为每个词生成前20个候选,同时将问题转化为二分类问题。
另外,在特征工程中,我们会使用中英文的编辑距离、共现次数、是否收录关系、余弦相似度等来构建特征。
然后,我们通过人工标注构建正样本,根据编辑距离随机抽取负样本,使用LR模型和XGBoost将标注样本分为两类。
最后还要经过一层人工审核,因为同义词的影响范围比较大,如果直接通过算法挖矿,线上效果可能不会特别好。所以我们没有使用复杂的模型,就足够了。这样,我们在万级人工标注上的准确率可以达到94%。
4.纠错
① 背景
为了纠错,我刚刚提到了词级错误。其实整个Query都存在一些错误。仅字级纠错无法满足用户需求,需要完整的查询纠错逻辑。
由于QP阶段的性能要求很高,现在业界常用的seq2seq方法效果不错,但整体性能达不到标准。我们可以离线使用 seq2seq 来挖掘高频信息,但是在线应用 seq2seq 进行纠错是很困难的。
②计划
我们的计划是使用传统的基于统计的隐马尔可夫模型来实现在线性能要求。将错误分为同音字和形似字,可以提供比较强的可解释性。
③ 基于图像
说到基于图像的方法,最直接的方法就是匹配基于CNN图像网络的算法。但是由于性能上的考虑,这种方法的效果往往不能满足我们的性能要求,所以我们采用了一种比较简单有效的方法,即我们直接计算两个可能的相似字符的图像。对于相似的字符,我们在标准字体库中发现它有两个特点:
对于bird和乌这两个字,直接对比字体库中的图片,重叠度非常高。由于字库中的字符,其标准化程度非常高。这可以通过这种方式来执行计算。我们这里基于图像的方法是使用我们在字体库中的两个字符对每个点进行特定的计算。
另外,对于单词“Niao”和“Wu”,在单词“Wu”上找到单词“Niao”的每个点,以找到最接近它的点。由于两点之间的相似性,我们可以为每个点找到一个。距离,然后通过计算总和的均值,就可以得到两个字符距离的相似度。
通过将两个字符与各自的图像进行离线计算,可以得到一些相似的字符。
④ 基于字体结构
另外,我们也会通过字体结构来计算。仓颉、郑码、四角数等码都是以这个字的情况为基础的。对于两个相似的字符,它们的仓颉码、郑码、四角数字往往是相似的。因此,我们可以通过序列的相似度计算得到这两个相似字符的相似度,然后通过相似度计算阈值,得到相似字符的集合。
03 召回策略
接下来介绍一下飞猪在召回策略中的一些技术:
航空公司旅行召回与常用的搜索召回相似但又不同。主要挑战是:
针对这种情况,我们将用户召回分为以下四种召回方式:经典召回(同义词挖掘、相似查询重写、产品POI挖掘)、LBS召回、向量召回、个性化召回(I2I&U2I和向量模型)满足用户的需求。
1.经典回忆
同义词挖掘和商品POI挖掘刚刚介绍过,这里主要介绍类似的查询重写。以“上海迪士尼乐园门票”为例。其实标准品是“上海迪士尼度假区”,而“黄山景区”的标准品其实是“黄山”。这种情况下,如果我们直接创建搜索,recall的效果可能会比较差。因此,我们将进行一些类似的查询挖掘,以满足这种查询和标题 GAP 的情况。
学习重写:
我们的想法是使用多次重写生成候选集,然后使用学习进行Rank选择前K个结果。
首先假设用户在过滤器中输入了一个查询,这个查询是比较相似的。因为用户想在筛选中得到他想要的结果。如果用户在第一次查询中没有得到想要的结果,用户会进行一些重写。相当于用户帮我们完成了一次重写,从中我们可以了解到用户重写的信息。这里我们用一个类似于 word2vec 的模型来实现。
另外,从查询相似度,我还可以从文本中得到一个相似的查询文本。这里我们使用doc2vec模型来获取文本相似度。
最后,通过点击query和title,可以训练出双塔结构的语义相似度模型,得到query和title的相似度特征。
通过这三种方法,我们可以获得相似查询重写所需的候选。
对于候选,通过一些人工标注和网上的埋点信息,原创查询和候选查询与标注相似。这样,我们就可以训练一个模型来对相似的查询进行排序。
最后,我们在网上使用的模型是PS-SMART模型。添加规则过滤后,准确率可达99%。可影响36%的在线PV,UV的无结果率可相对降低18%。
2. 航空旅行的精选召回:LBS 召回
用户既然是在旅游场景中搜索,自然会需要LBS相关的信息。如果您是旅游用户,可以选择阿里巴巴园区附近的酒店,如果您是游客,可以选择黄山风景区附近的酒店。这就需要确定用户想要的产品是什么样的LBS,大概在这个范围内。解决方案是通过在查询中识别用户的POI来获取用户的经纬度,并限制召回。
建模过程:
首先对查询进行例行切分,然后在POI专用倒排索引库中进行搜索,得到候选POI。接下来,对候选POI查询进行特征计算,计算文本相似度、embedding相似度距离、用户当前位置输入与历史点击产品位置的距离作为特征。然后使用特征构建模型计算一个分数,通过一定的阈值得到结果。
最终,我们的准确率可以达到 95%,并且 GMV 和交易量都得到了提升。
3. 深度召回:向量召回
① 背景
上面提到的是一些简单的文本召回和传统的方法如LBS召回。前面提到过,我们的产品按照目的地切换后,还是非常稀少的,不会有召回的。针对这种情况,我们考虑引入一种向量召回方法来进行补充召回。不存在的情况可以覆盖改写,之前不能召回的部分产品可以召回。
②向量召回的整体架构
向量召回架构如上图所示。在线嵌入查询。通过 HA3 引擎将所有 item embeddings 离线存储在 HA3 引擎中。最后,SP从QP中获取query embedding并进行HA3搜索,获得所需产品。
③ 模型结构
模型结构,如上图:
对于这三个特征,我们没有使用简单的concat,而是使用了张量融合来进行三个向量的外积,可以让特征更好的融合。
最后通过全链路层进行特征提取,计算向量内积。
对于损失函数,我们使用大边际损失。对于已经充分学习的案例,丢弃它们不再学习,这样模型可以更快地达到预期的效果。
④ 样本选择
在样本选择上,我们也对正负样本做了一些探索。
组内通用方法:
这种方法更适合排序,但不适合召回。以左图为例。用户点击“上海迪士尼度假区”,未点击下方产品。虽然可能是因为产品标题标准化程度低,用户没有点击,但不能说是无关产品。
我们的方法:
使用随机选择有两个方面:一是在所有产品中进行随机选择;另一种是在类别或目的地下进行随机选择。这样可以增加训练难度,达到我们想要的效果。
⑤模型输出及使用方式
最终的输出分数也用于排序。作为排序的特色,取得了不错的成绩,可以排到第四位。此外,在线召回可以将非结果率降低32.7%。同时扩展了1.7次的相似查询。
4. 个性化回忆
为什么要进行个性化召回?
因为在旅游场景中,会有一些一般的需求搜索。例如,如果您搜索杭州,我们将召回杭州的所有产品和酒店。如此大量的recall,会给后续的排序带来很大的压力,也没有办法根据用户的查询,排出一个用户想要的item。
另外,还有一种情况是用户的搜索意图不是很明确,可能会出现一些非结果的情况。在这种情况下,当传统的文本相似度和深度召回无法回忆时,您可以尝试以个性化的方式向用户推荐一些产品,并直接在搜索结果中展示,提供补充,提升用户体验。实践证明,用户也会点击购买此类产品。
我们的计划有两种方式:
整体的做法是将recall pool分为两种方式:个性化recall和textrecall:
个性化回忆模型:
模型优化:
在深度向量召回上,使用卷积模型提取文本的特征。这里没有使用卷积,而是使用了一种简单的词向量concat方法。这是因为通过实验验证,使用卷积学习的文本特征比较强,整体的个性化效果比较弱,这不是我们想要看到的。因此,我们通过限制来弱化文本特征,突出个性化特征带来的额外检索效果。
04总结思路
最后,总结一下我们对工作的看法:
1. 查询和用户平面
现在我们还是叫QP。未来我们希望升级到Query & User Planer,可以整合更多的用户特征,增加更多的个性化搜索能力。
2.可解释的升级
我们希望提升搜索的可解释性,而不是简单地使用文本或深度向量直接回忆。我们希望对用户意图的更维度和更详细的理解可以直接理解为人类可读的意图。
此外,我们希望对用户行为进行预测。因为在用户搜索杭州时,根据历史点击量推出的产品可能无法满足用户需求。我们希望对于这种类型的查询,我们可以预测用户想要去的景点。用户搜索酒店时,可以预测自己想去的目的地,更好地满足用户需求。