CMU 11642 的课程笔记。怎样产生更好的 query 来得到更多的相关文档?从用户角度看,用户一开始会用 short query 来进行检索,在看到结果文档后通过增加或减少 term 以及调整 term weight 的方式进一步优化 query。而对系统而言,能自动产生更好的 query 的方式莫过于机器学习算法。
relevance feedback 其实是一个有监督的机器学习的问题,理想中我们要学习的是 f(document)–>{relevant, not relevant},然而一般我们学习的是 f(document)–>score。训练集的大小一般来说 10-20 页是 good, 100-200 页就 great 了。
relevance feedback 并不经常被使用。一方面是因为用户不喜欢给评价(因训练数据会很少,准确度也不一定高),另一方面是这种评价有风险,如果评估的文档很少,结果是 highly variable 的,stability 和 consistency 可能会受到影响。所以一般我们用的是 Pseudo-relevance feedback,一种无监督的机器学习方法。
Pseudo-relevance feedback
基本逻辑是把原始查询当做分类起,用它来给部分数据打标签,得到 top-ranked documents,然后用 labeled data 来产生更优的 classifier。基本过程:
- 用原始 query 检索文档
- 取结果的前 N 篇文档作为训练集,这些文档相关度可能不高,然而我们的目的是学习 vocabulary pattern。
- 应用 relevance feedback algorithm 选取 term 和 term weight
- 组成新的 query 来检索文档
Okapi BM25
过程:
- 用原始 query 检索文档
- 取前 N 篇文档的 term 作为 potential expansion terms
- 为每个 potential expansion term 计算分数
- 用前 m 个 term 创建新的 $query_{learned}$
- 用新的 query 检索文档
Inference networks (Indri)
过程:
- 用原始 query 检索文档
- 取前 N 篇文档的 term 作为 potential expansion terms
- 为每个 potential expansion term 计算分数
- 用前 m 个 term 创建新的 $Q_{learned}$
- 合并 $Q_{original}$ 和 $Q_{learned}$ 创建 $Q_{expanded}$
- 用新的 query 检索文档
对每个 expansion term,计算 p(t|I)
并没有对文档集合里的常见词做出惩罚,所以加上一个类似 idf 对 weight
最后的 expanded query 是
$$Q_{expanded} = \#wand(wQ_{original}, (1-w)Q_{learned})$$
需要的参数:
- fbdocs: number of judged documents
- fbterms: number of terms to add to the query, indri’s default is 10
- $\mu$: smoothing weight to use for new terms, indri’s default is 0
- $w$: weight of the original query, indri’s default is 0.5
How many terms is enough
标准答案来了: It depends! 因 query 而异。
Corpus
其实原始查询和最终的查询语句可以在不同的语料上跑,比如说原始查询在 wikipedia 上跑,产生高质量的 expansion term,然后用扩充的 query 在 web 上跑,这能够显著提高 MAP 和 P@10。
直接上代码:
处理 query file。
如果有 initial ranking file。
Effectiveness
- Query expansion 平均能使 MAP 提高 20%
- 但同时也有可能让 1/3 的用户感到 annoy
所以通常来说,query expansion 会用在召回率很重要的场景,或者 average performance 很重要的场景,比如 legal retrieval, TREC, research paper 等。