在前面我们讨论的都是布尔查询,因此得出的结果要么匹配,要么不匹配,当匹配的结果很多时,就会发现我们需要对文档进行排序;
文档除了文本外还有元数据,比如创建时间、文档标题等,因此我们也可以对他进行限制;比如限制查询文档结果必须是2010年发表的;
参数化索引(parametric index):某个字段取值存在一定限制,如取值范围的限制,日期,则为参数化索引;
域索引:某个字段取值没有任何限制,比如标题,可以是任意文本;
一篇文档有域f1,f2,f3,而每个域都有不同的权重;
每个域都有一个权值w1,w2,w3;权值的确定是通过机器学习(训练集)所得;
S(q,d)=w1*s(q,f1)+w2*s(q,f2)+w3*s(q,f3);
因此S(q,d)只是计算出一篇文档和查询的域得分;
一般给定查询,我们对于每个词项迭代,分别计算他与每篇文档的得分;然后把查询词项在某篇文档的得分相加就得到查询与文档的匹配情况;
词项在文档中的权重就是词项在文档中出现的次数;
词袋模型(bag of word model):词项在文档中的次序被忽略,只关心出现的次数;
相比布尔检索模型,有了很大的改进;
tf:一个词项在某一篇文档中出现的次数;
tf表示的是词项的权重仅仅依靠出现次数而定,这样会出现问题,比如the,在文档中出现次数很多,tf很高,但是这个词一点也不重要;
为了方便,一般我们都把tf值存在倒排索引的posting中,而idf值存在dictionary中;
如果只依靠tf作为权值,则认为每个单词在文档中的重要性是一样的;
因此我们需要引入其他权重表示;
df:一个词项在多少个文档中出现过;
idf:df的倒数,当一个词项在越多的文档中出现过,idf值越低;
cf:一个词项在文档集中出现过几次;
,N表示文档数目;
因此我们需要结合tf-idf进行权重计算;
每篇文档的得分是通过查询的每个词对于这篇文档的得分之和求得;
已知query,collections,需要在文档集中寻找与query相关的文档;
我们通过将query分割成一组词,然后对于每个词,在文档集中计算tf-idf值,最后把全部的tf-idf的值加起来即是针对一篇文档的得分;
主要思想:把文档看成是词项的序列,即向量;
构成词项-文档矩阵,里面的每个值都是特定词项对应特定文档的权重,表示词项在文档中的重要性;
欧式归一化:给定(n1,n2,n3,n4);对于这个向量进行归一化,则为(n1/n,n2/n,n3/n,n4/n);其中n为欧几里德长度;
0.将每篇文档构造成向量;
1.两篇文档分别归一化;
2.向量点积;
用户可以通过这个方法查找与某个网页类似的网页;
查询为一个向量,文档集组成了文档向量;
对于查询向量来说,每个值表示词项在查询中的重要性(权重),可以通过tf或者df或者tf-idf作为权重;
比如:
查询的权重是tf-idf并归一化;
而文档向量的权重是tf值并归一化;
最后将两个向量乘积就是(q,d)的得分;
上图中,查询向量通过计算权重得到(0,1.3,2.0,3.0);
注意:比如查询向量为auto car,但是不一定会使得最后的查询权重为(1,0,1,0);因为如果不用tf,只使用df,则查询向量的权重为(2.3,1.3,2.0,3.0);