$ TermWeight单词权重算法
$ TermWeight是一个自动计算用户查询中每个$ term的相对重要性的模块。通过区分不同$ term在查询中的重要性,并给出相应的分数,可以召回与用户意图最相关的结果,进而改善用户的搜索体验。
方法:以查询和文档的文档集作为$ term的词权重,计算tf-idf并归一化
优点:简单易实现。
缺点:每个$ term的单词权重是静态的,不能根据上下文变化,效果不好
基于点击词共现和基于偏序关系的$ term权重训练方法主要分为两类:(1)。
基于点击词共现方法,将$ term权重视为一个回归任务,用$ term召回率来表示查询中每个$ term的重要性关系。
单词共现:基于uclog的查询标题点击数据,构建训练集,即以$ term召回率为指标计算单词权重。
$ term召回率的计算公式如下:
如果冷启动阶段或词共现阶段的$ term召回率较低,可以通过分层回归得分进行人工数据标注。例子如下:
注意:层级和分数的数量可以根据具体的业务场景进行调整。
基于偏序关系的方法将$ term权重视为一个排序任务,在标记数据时使用偏序关系来表示查询中每个$ term的重要关系,例如:
这种方法适合于那些查询比较短的用户,在doc上的大多数点击都会包含查询中的所有$ term,从而使得单词共现方法无效。
不同的应用场景会对应不同的选型方案:
(1) DeepCT/DeepRT
基于深层上下文语义的词权重。(a)通过深度模型生成上层和下层文化的单词嵌入;(二)线性回归预测单词权重。
优点:使用上下文语义,效果不错。
缺点:模型略复杂,需要控制模型的复杂度以满足实时推理。
(2)特征+ML
基于特征设计和机器学习回归模型的词权值预测。
优点:高效计算,实时推理。
缺点:需要手动细化设计特征。
下面详细介绍两种类型的选型。
DeepCT/DeepRT的整体框架是:(a)通过深度模型生成上下层文化的单词嵌入;(b)线性回归以预测单词权重。
如果数据集是基于词共现的分值,可以直接使用MSE等损失函数,如果训练集是基于偏序关系,可以使用成对铰链损失。
本文中提取上下文语义用的是BERT,我自己实践中用的是BiLSTM+Attention。无论哪种方法,其核心本质都是通过结合NMT和上下文语义来动态判断$ term在当前上下文中的重要性。
国际惯例,一张图盖一下。
如果系统的RT要求很高,建议使用BiLSTM。如果追求效果,预训练语言模型更有优势,那么就要结合自己的业务场景进行选择。
Feature+ML的整体思路是人工设计有效的特征,然后利用机器学习中的GBDT/LR等模型进行回归预测或排名。常用的型号有Xgboost,LightGBM等。
显然,这种方式的效果取决于功能设计的好坏,不同业务场景的具体功能会有所不同。以下是一些常见的特征。
$ term的静态特征:idf值,词频,$ term长度,$ term词性,词的位置,是否是停用词,是否是语气词,是否是专有名词(人名/地名)等等。
$ term交互的特征:$ term长度与查询长度的比值,文本排名值,$ term在查询中的相对位置,$ term对查询的贡献等等。
Ngram特征:包括$ term的统计特征,以$ term开头的ngram的统计特征,以$ term结尾的ngram的统计特征,等等(通常使用二元模型和三元模型)。
经过特征设计后,可以用ML模型进行回归预测或排序,相对简单,此处不再赘述。