stone

lucene介绍及打分公式说明
很久没有写博客了,补一下这个,主要是一个根据csdn上的一个系列文章进行的一些总结,学得不深,只是些皮毛,见笑了。...
扫描右侧二维码阅读全文
06
2017/03

lucene介绍及打分公式说明

很久没有写博客了,补一下这个,主要是一个根据csdn上的一个系列文章进行的一些总结,学得不深,只是些皮毛,见笑了。╮( ̄▽ ̄)╭

一.介绍

Lucene是一种基于java的全文检索库,通过对非结构化数据和结构化数据建立索引来达到加快搜索的速度。

反向索引,我们平时的文件系统都是通过文件映射到文件内容的过程,这种可以叫做正向索引,而反向索引则是反过来,通过文件的内容反向指向文件,下面是一个常见的倒排表:

左边的指包含该词Term的文档Document。

二. 索引建立及使用

还是对于上面这个图,我们先了解一下搜索的过程:

加入我们现在想要搜索luceme和solr,但是不想包含hadoop,大概等于(lucene+solr-hadoop),则搜索引擎会分别找到的lucene,solr,hadoop的倒排表,然后将lucene和solr的倒排进行合并操作,在和hadoop作差,就可以得到lucene和solr但不包含hadoop的文档列表。但是这里有一个小问题,通过这样的操作我们的确可以得到我们想要的文档,但是符合我们想要的文档可能有上千上万个,我们还需要对得到的结构进行打分排序,将更符合搜索要求的文档放到前面,从而更快让我们找到想要的文档。

下面看一下索引的建立过程:

  1. 对文档Document进行分词处理
  2. 去掉停用词
  3. 对词进行预处理,如将大小写统一转换为小写,去掉一些词的变形,复数形式等等操作
  4. 将得到的词转换为索引:

三. 评分公式整理

在搜索的过程由一个非常重要的步骤,就是对文档进行打分排序,下面是对打分公式的分析:

Lucene搜索是采用的经典的TF-IDF打分机制:

TF-IDF解析

用这个公式可以评价一个词对文档的价值,这个公式分为两部分看,TF指一个词在文档中出现的频率,如果一个词出现的次数越多,对文档来说这个词约重要,另一部分为IDF,可以看作一个词的信息量,如果一个词在其他文档中的出现的次数越多,则说明这个词不太重要,信息量越小。

网上看到对这个文档的一种日常应用,挺有趣的,也说一下吧。

这个公式也可以应用于评价一个人价值,如果一个人对某项技能掌握得越好,则这个人的价值越高,同时,如果他掌握的技能大家都会,则他的价值就越低,通过这个公式,也体现这样的一个规律。

在了解这个公式之后,我们看看如何评价两个文档的相似性。

评价文档相似性采用的向量模型(VSM),每一个词Term为一个维度,所有的词组成一个向量空间,然后采用余弦角公式进行计算相似对:

所以,在搜索打分的过程就可以看作搜索词和文档相似度的计算,如果越相似,则分数越高,这就是Lucene打分的核心概念,下面是Lucene的打分公式:

通过推导和化简,可以得到下面👇的公式:

看看每一个部分都是什么意思:

从原始公式讲起,核心部分就是那个向量公式,这个很容易理解。

然后看最简单的Boost项,query-boost,doc-boost,这些都是对部分词,部分文档的权重进行调整的,属于人为设置的部分。

之后是coord,这表示搜索词在文档中的命中度,如果文档含有搜索词越多,则这个分数越高,否则越低,这主要是文档相似性越高,但不一定含有搜索词。

还有一个参数是doc-len-norm,这个文档长度归一化用的,如果按照其他的参数看,一个文档越长,则他的分数会比文档比较小的高,这样是不公平的,所以需要做一个归一化。在计算的余弦角的时候是完全不考虑文档的长度,而计算coord则包含了文档长度的影响。

对于任意一个term,在长的文档中的tf要大的多,因而分数也越高,这样对小的文档不公平,举一个极端的例子,在一篇1000万个词的鸿篇巨著中,"lucene"这个词出现了11次,而在一篇12个词的短小文档中,"lucene"这个词出现了10次,如果不考虑长度在内,当然鸿篇巨著应该分数更高,然而显然这篇小文档才是真正关注"lucene"的。

如果完全进行归一化处理,则对长文档也不公平,所以这个归一化的公式和文档长度不是成正比的,这个公式甚至可以使用抛物线神马的。

👉这里是公式推导的一篇文章

Last modification:September 7th, 2018 at 08:21 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment