综述
在进行搜索的时候,文档中的同一个词往往有多种表达方法,这种现象叫做同义词。比如用户输入"充电宝",而文档里有"移动电源",这时如果搜索系统没有做查询优化的话用户是不能找到相关文档的。由此我们引出查询优化的概念。
查询优化方法大体可以分为两类:
- 全局方法:在不考虑原始查询初始返回文档的情况下对查询进行扩展和重构。
- 局部方法:根据原始查询匹配的初始文档对查询进行修改。
这两个分类下又有一些常用的具体优化方法:
全局方法主要包括:
- 基于同义词的优化
- 基于拼写纠正的优化
局部方法主要包括:
- 相关反馈
- 伪相关反馈(也称为盲相关反馈)
- 间接相关反馈
1.1 基于同义词的优化
基于同义词的优化核心思路是使用同义词词典。
在同义词词典中定义了一些词的同义词(集合),如"充电宝"的同义词集合是["移动电源","移动充电器"],那么当用户搜索"充电宝"时,查询将会自动扩展为"充电宝 移动电源 移动充电器"。
同义词方案的难点在于词典的维护,如果词典使用已经构建好的静态的词典,那么词典不需要维护。如果要动态维护词典,采用人工维护的方案显然会带来较大的成本,一种取代的思路是用过分析文档集来自动构造同义词词典。
一种简单的思路是认为在文档中共现频率高的词是同义词的可能性大。使用这种思路,首先我们给出词项-文档矩阵A,矩阵中的每个元素At,d代表词项t在d中出现的频率。要求归一化后每行元素相加为1。然后计算:
此时Cu,v就是词项u和v的相似度得分。
1.2 基于拼写纠正的优化
一般使用编辑距离算法。
2.1 相关反馈
相关反馈是通过与用户的交互来优化查询,一般是通过用户的原始查询词给出初始查询结果,然后让用户对查询结果进行反馈,根据用户的反馈得出优化查询。
相关反馈的过程一般是:
- 用户提交原始查询
- 系统根据原始查询返回初始查询结果
- 用户对初始查询结果进行反馈,标记出相关文档与不相关文档
- 系统根据反馈结果构造出更好的查询来表示用户的信息需求
- 利用优化的查询返回新的查询结果
可以看出,反馈系统的核心在于如何根据用户的反馈结果构造出更好的查询。
Rocchio算法是相关反馈的一个经典算法:
假设我们的原始查询是向量q0,则我们要寻找的优化后的查询向量qm应该更接近于用户标注的相关文档,更远离用户标注的不相关文档,则有:
其中q0是原始查询向量,Dr和Dnr分别是已知的相关和不相关的文档集合。\alpha、\beta、\gamma分别是上述三者的权重。这个公式的本质就是让原始查询靠近所有已知的相关文档的质心向量,远离所有已知的不相关文档的质心向量。
2.2 伪相关反馈
伪相关反馈和相关反馈十分类似,只是它不需要用户的交互。伪相关反馈的过程如下:
- 用户提交原始查询
- 系统根据原始查询返回初始查询结果
- 由系统将初始查询结果排名靠前的k篇文档标记为相关文档,其余文档标记为不相关文档
- 系统根据上边的标记结果作为反馈结果构造出更好的查询来表示用户的信息需求
- 利用优化的查询返回新的查询结果
2.3 间接相关反馈
间接相关反馈也和相关反馈类似,只是它不需要用户显式地标记相关文档和不相关文档,而是收集用户的隐式反馈。常见的就是web系统中对用户浏览搜索结果进行收集,同一搜索结果中,用户进行点击浏览的结果被认为是相关的。这实际上是点击流挖掘这个通用领域的一种形式。