全文搜索怎么给查询语句与文档相关性打分
Posted 超人汪小建(seaboat)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全文搜索怎么给查询语句与文档相关性打分相关的知识,希望对你有一定的参考价值。
朴素想法
用户输入一个查询query,query由若干词(term)组成,文档也由若干词(term)组成。那么怎么评判查询和文档的相关性的高低。
很朴素简单的想法就是文档中包含的term与查询query中包含的term,两者越多相同的则说明越相关。比如query为”animal cat”,文档一内容为”cat dog bird animal”,文档二内容为”cat dog bird tiger”,则认为query与文档二的相关性比文档一的高。
词权重
现在缺少词权重,比如一个文档中cat出现次数为2,而dog次数为1,那么cat的权重应该高一些。比如cat在10个文档出现和在1个文档出现也有不同的权重。
一般来说,可以由两方面来影响某文档某term的权重:
1. 该文档词频(term frequency):该文档出现该term的次数,tf越大说明越重要。
2. 文档词频(document frequency):包含该term的文档数,df越大说明越不重要,说明它更大众。
于是某个term的权重可定为:
wt=tf∗log(totalDocdf)
VSM
向量空间模型(VSM)是一个计算俩文本相似性的经典算法。
- 将文档和query中term的并集看成是n维空间,每个term是一维。
- 将文档中term的权重看成一个n维向量,不存在的term看成权重为0。
- 同样将query看成是n维空间,每个term是一维。
- 同样将query的term的权重看成一个n维向量,不存在的term看成权重为0。
文档权重向量和query权重向量之间的夹角越小则认为相关性越大。于是,
sim(q,d)=q⋅d∥q∥×∥d∥=∑ni=1wi,qwi,d∑ni=1w2i,q√∑ni=1w2i,d√
干扰项
- 表单符号,一般标点符号没有价值,去掉。
- 停词,停词没有特别的意义,一般不能成为搜索的关键词,比如”the”,”that”,”this”等。
去掉这些干扰项可以让VSM降维,提升计算效率和准确度。
文档权重
对于某些文档可能相对重要点,有些文档没这么重要,这时需要额外的权重来表示。于是相关性得分,
score(q,d)=∑ni=1wi,qwi,d∑ni=1w2i,q√∑ni=1w2i,d√×boost
比如文档一的权重设为1.1,文档二的权重设为1.0,则通过这个权重系数可以向整体分数表达出来。
标准化
前面计算词权重时存在一个问题,文档出现某term次数越多则说明它的权重越大,那么是不是可以说一个包含了1000个term的文档出现了2次cat,就比一个包含了10个term的文档出现了1次cat权重大?于是需要引入标准化来解决这个问题,
wt=tf∗log(totalDocdf)∗1totalTerm√
通过标准化后减少了文档长度的影响。
========广告时间========
公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。
=========================
欢迎关注:
以上是关于全文搜索怎么给查询语句与文档相关性打分的主要内容,如果未能解决你的问题,请参考以下文章