信息检索笔记-文档平分,词项权重计算
给定一个布尔查询,返回的结果要么满足条件,要么不满足条件,结果很多的时候就不太对了,应该按照文档的重要性排序后呈现给用户。
本文引入简单的几种权重计算。
域索引权重计算
我们知道一篇文章除了内容外,还有作者、题目,写作时间等,这就是域。我们可以对文档建立域索引。
建立好域索引后,我们就可以通过域加权。考虑这样的例子,一个文档集包含3个域-author、title和body,考虑查询shakespeare,对于每个域出现则得1分,不出现则得0分。对于该文档集,我们假设三个域的权重分别为g1 = 0.2,g2=0.3,g3=0.5,同时我们可以看出g1+g2+g3=1。如果shakespeare同时出现在title和body域,则该篇文档的得分:
score = g2*0.3 + g3*0.5 = 0.8。根据这个例子,我们就可以通过如下公式计算文档得分:
score = sum(gi * si),gi表示域的权重,si表示文档在该域的得分。
(1)那么如何利用倒排索引求域呢?如下图中,我们首先定义一个scores[100],则 score[1]+=0.5,score[3]+=0.5....
(2)如何利用倒排索引求and操作的得分呢?当我们在执行Title and Body查询时,我们首先顶一个Scores[100],存储每篇文档的分从上面的倒排表我们可以看出只有ID为7和11的两篇文档同时有Titile and Body两个域。
那么我应该执行:Scores[7] += 0.8,Scores[11] += 0.8,其余为0
(3)那么我们怎么确定g1,g2,g3....呢,通过机器学习的方法。给定一个训练集如下(当然这里,我们只是画了一个示意图,可能训练个数不只这么点):
假设Ci表示第i个查询,这时,我们可以利用上面的公式计算出第i次查询的得分。我们假设Title的权重gt,而Body的权重gb,则有gt+gb=1的约束关系。st表示文档是否包含Title域,包含为1,不包含为0。sb表示文档是否包含body域,包含为1,不包含为0
Ci = st * gt + sb*gb
假设Ri表示真实的结果,则我么的学习的权重要满足:
err = sum(sqr(Ci - Ri))
使上面的值达到最小。这是一个典型的最小二乘拟合。这里还让我想到神经网络的学习算法,但这里只是学习一个线程网络的分类器,不是多层网络,通过误差对gi求导来做。一般的处理方式用误差作为反馈就不断得学习各权重知道能够正确分类各训练样本。
【注】我将学习方法总结2种:(1)基于误差最小的学习方法,这种沿着梯度方向下降,但是这种方法有个缺点就是容易陷入局部最小值,可以通过随机梯度算法来改善,比如神经网络反向传播方法;(2)基于统计学习方法,例如最大似然估计。后来当误差满足高斯分布的时候,两者的模型居然是相等。证明请看:http://blog.csdn.net/lsjseu/article/details/12280433
词项、文档频率与权重计算
词项频率:单词在某一文档中出现的次数。
文档频率:单词在多少篇文档中出现。
对于某种搜索来说,词项频率过高会影响结果的正确性,例如搜索汽车工业的时候,所有页面都含有auto关键字。我们提供一种降低这些次数过多的词项相关性计算的重要性。一个很直接的想法就是给文档频率较高的词汇赋予较低的权重。我们定义如下逆文档频率作为权重:
idf = log(N/df),df表示文档频率。(可以看到当df很小时,这个公式会出现一些问题,于是就有人改进此公式)
同时我们也可以将词项频率和文档频率结合在一起定义:
tf-idf = tf*log(N/df),//tf表示词项频率
意思就是说如果一个单词在某几篇文章出现的比较多,则权重最高。还有一种情况是一个单词在一篇文章中出现次数少,但是在多篇文章中出现了,权重也较高。
向量空间模型
我们将文档看作向量,那么每个分量代表每个词项的权重。那么在查询的时候,我们将对应的权重取出来,加起来就是所查询文档的最后得分。
文档 = [词项1的tf-idf,词项2的tf-idf,词项3的tf-idf.........]
有了向量空间模型后,我们可以通过计算两篇文档的余弦相似度来比较两篇文章的相似度:
那么查找与d最相似的文档就是计算d的余弦相似度计算。有了词项文档矩阵就好计算这个东西了,例如下图(数据表示逆文档频率):
同样,查询的时候我们可以计算查询向量和文档向量的相似度,最后将结果通过相似度进行排名,最后利用TopK算法将前k个查询结果给用户看。
其他权重计算方法
(1)tf的亚线性尺度方法
后记
下一篇是关于完整搜索系统的构建向量空间模型与其他查询方式如何兼容。请看:http://blog.csdn.net/lsjseu/article/details/12273023