TermWeight 词权重算法

1、背景

在用户的搜索Query中,有些词在用户的核心语义诉求中占据主导地位,在召回排序时需要重点关注,而有些词则重要性较低,即使丢掉也不影响用户的核心语义表达。
TermWeight是自动计算用户查询query中各term之间相对重要性关系的模块。通过区分用户查询query中不同term的重要程度并赋予相应的得分,从而召回与用户意图最为相关的结果,继而提高搜索的用户体验。

2、静态词权重

方法:利用query和doc的文档集合计算tf-idf并归一化,作为term的词权重
优势:简单,易实现
劣势:每个term的词权重是静态的,无法根据上下文变化,效果差

3、动态词权重

3.1 训练数据获取

term weight训练,方法主要分为两种:(1) 基于点击词共现 和 (2) 基于偏序关系

3.1.1 基于点击词共现

基于点击词共现法将term weight看做是回归任务来解,标注数据计算时采用term recall得分来表示query中各term的重要性关系。
词共现:基于uclog的query-title点击数据构建训练集,即通过计算指标 term recall 作为词权重。
term recall 计算公式如下:

其中,
Dq :与query相关的doc集合
Dq,tDq包含query中term t的doc集合
(1) 词共现计算时需要考虑 同义词;(2) 如果query的topK点击doc量比较少,可以考虑用topN语义召回doc补充

如果是冷启动阶段或词共现计算的 term recall 准确率低,可通过分层回归得分做人工数据标注,示例如下:

query:ABCD
标注:B(1挡:1.0)> A(2挡:0.7)> C(3挡:0.4) > D(4挡:0.1) 

注:分层数和得分可根据具体业务场景来调整

3.1.2 基于偏序关系

基于偏序关系的方法将term weight看做是排序任务来解,标注数据时采用偏序关系来表示query中各term的重要性关系,如:

query:ABCD
标注:B > A > C > D

该方法适用于 用户query短,多数点击doc都会包含query中所有term,从而使得 词共现 方法失效。

3.2 模型选型

应用场景的不同,会对应不同的模型选型方案:
(1) DeepCT/DeepRT
基于深度上下文语义的词权重。(a) 通过深度模型生成上下文化的词embedding + (b) 线性回归预测词权重。
优势:利用上下文语义,效果好。
劣势:模型略复杂,需要控制模型复杂程度,满足实时推理。
(2) Feature+ML
基于特征设计+机器学习回归模型预测词权重得分。
优势:计算高效,满足实时推理。
劣势:需要人工精细化设计特征。

下面就两类模型选型详细展开介绍。

3.2.1 DeepCT / DeepRT

DeepCT/DeepRT框架中整体使用的是:(a) 通过深度模型生成上下文化的词embedding + (b) 线性回归预测词权重。
如果数据集是基于词共现的得分,则可直接用MSE等损失函数,如果是基于偏序关系构建的训练集,则可以使用Pairwise Hinge Loss。
论文中使用的是BERT做上下文语义提取,我自己的实践中用的是BiLSTM+Attention,无论哪种方法,其核心本质是希望利用NMT结合上下文语义来动态判断term在当前语境的重要程度。
国际惯例,一图以蔽之


如果系统RT要求较高,则推荐使用BiLSTM,如果追求效果,预训练语言模型的更有优势,需要结合自己的业务场景做选型。

3.2.2 Feature + ML

Feature+ML的整体思路是:通过人工设计有效特征,再利用机器学习中的GBDT/LR等模型来做回归预测或排序。常用的模型有Xgboost,LightGBM等。
很明显,该类方法的效果取决于特征设计的好坏,不同业务场景具体特征会有差别,下面总结一些常用特征。
term静态特征:idf值、词频、term长度、term词性、词位置、是否停用词、是否语气词、是否专有名词(人名/地名)等等。
term交互特征:term长度占query长度比值、text-rank值、term在query中相对位置、term对query的ppl贡献度等等。
ngram特征:包含该term的ngram统计特征、以该term开始的ngram统计特征、以该term结尾的ngram统计特征等等(通常用bigram和trigram)。
特征设计后,再用ML模型做回归预测或排序即可,比较简单,不再赘述。

参考文献

  • DeepCT论文:Context-Aware Sentence/Passage Term Importance Estimation For First Stage Retrieval
  • DeepCT代码:https://github.com/AdeDZY/DeepCT
  • DeepRT论文:Learning to Reweight Terms with Distributed Representations
  • TRW论文:Term Necessity Prediction
  • Pairwise Hinge Loss代码:https://github.com/tensorflow/ranking/blob/master/tensorflow_ranking/python/losses.py
  • qtAnalyzer工具:Query Term Analyzer

你可能感兴趣的:(TermWeight 词权重算法)