zoukankan      html  css  js  c++  java
  • Lucene TFIDF打分公式

    还没读TFIDFSimilarity的代码,读了一下lucene的文档,没有特复杂,感觉还是非常严谨的。

    对于查询q和文档d,如果查询为纯token查询,套用向量空间模型(VSM),相似度度量使用余弦,另外再加一个coord(q,d)即d中满足q中must和should查询条件个数的度量(预计通常是m / n了)。cos直接用向量点积除以两个向量的模(euclidean norm)。

    cos = v(q) * v(d) / (|v(q)|  * |v(d)|)

    sim = coord(q,d) * cos

    当中:

    v(q) = (idf(t),...)

    v(d) = (tf,...)

    当中tf并不是简单的term freq,而是其平方根,这非常可能是为了让其模刚好是doclen。

    idf = 1 + log(numDocs / (1 + docFreq),因此这个公式里面,tf的数值被弱化了。

    在文档的lucene practical scoring formula,当中对于|v(q)|的计算被归到queryNorm上(queryNorm = 1 / |v(q)|) ,对于|v(d)|的计算被归到norm(t, d)中(norm(t,d) = 1 / |v(d)|)。

    queryNorm中有个query bootst值,偶认为对于纯tf idf计算(无论query多长总是能够展开成一级)没什么意义,并且对最后总分没影响,仅仅是能够对不同query的结果进行比較。

    queryNorm中另一个t.getBoost(),这个事实上非常重要,能够是一个主要调參的地方,由于term boost能够包括field boost的信息,所以能够在search时进行设置,有了term boost,v(q)变为:

    v(q) = (idf(t) * t.getBoost(),...)

    |v(d)|的计算归结到norm(t,d)中,当中引入field.getBoost另整个公式不严谨,由于点积中没有乘以这个数字,模也不是正常计算的了,再加上t.getBoost()就能够包括field boost信息,还有每一个field保存的norm值仅仅用一个字节表示,精度非常差,我认为这个norm值不有用,倒不如直接用lengthNorm(我倒是非常好奇没有norm值,lucene怎么处理的)。


    參考文献:

    http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html

  • 相关阅读:
    基于Hadoop的改进Apriori算法
    iOS 访问URL转码
    第一次进入应用图片轮播效果
    购物篮模型&Apriori算法
    Ionicons的使用
    如何在 Eclipse 中使用命令行
    Eclipse输入命令行参数
    CHAR,TCHAR,WCHAR 三者的区别与转换
    函数名、变量前后的_(一个下划线)、__(两个下划线)分别有什么用
    java爬虫简单实现
  • 原文地址:https://www.cnblogs.com/blfshiye/p/3761311.html
Copyright © 2011-2022 走看看