HubbleDotNet 和 Lucene.Net 匹配相关度的比较

  很多网友在使用 Lucene.net (Lucene java 版本也是一样)后会感觉Lucene.net 的匹配相关度存在问题,搜索得到的结果往往不是希望的结果,不完全匹配的记录往往比完全匹配的记录排序还要靠前,很多人试图通过分词来解决,中文环境搜索,分词确实能解决一些问题,但不能根本解决问题,而英文环境下,分词根本无法解决任何问题。

  问题的本质是由于Lucene的得分算法缺陷造成的,不改进得分算法根本不能根本解决问题。HubbleDotNet的得分算法参考了Lucene的得分算法并做了重大改进,匹配相关度比Lucene.net 有了显著提高。本文结合一个极端的例子来分析两者得分算法的异同,并从原理上讲解为什么HubbleDotNet 的匹配相关度要比Lucene.net 的高。

  先看例子

  我们对下面两条记录分别用 Lucene.net 2.9.1 和 HubbleDotNet 0.9.7.1 进行索引。

  记录1

  教育问题一直是国家最关心的,我们要长抓不懈

  记录2

  教育独生子女问题,这是很多家长要关心的问题

分词采用盘古分词,分词参数中关闭多元分词。

两个句子的分词结果分别为:

教育/问题/一直/是/国家/最/关心/的/我们/要/长抓/不懈/

教育/独生子女/问题/这/是/很多/家长/要/关心/的/问题/

要搜索的句子是:教育问题

其分词结果为:教育/问题/

从直观上看,记录1 是完全匹配,应该得分比记录2高,这也是我们希望的排序结果,即记录1排在第一个,记录2排第二个。

  下面看看实际的排序结果:

  Lucene.net 的排序结果:(这是盘古分词带的Lucene.net 的例子稍作改动后(将得分输出了)的输出结果) 从结果我们可以看出记录2被排在了第一位,得分为 0.042 而记录1 的得分为 0.034 排第二位,这个显然不是我们希望的结果。

  再看HubbleDotNet的结果

  这里我们看到记录1被排在第一位,得分为 390218522

  记录2 排第二位,得分 85937

  原因分析

要分析两者匹配相关度的差异,我们需要比较两者的基础得分算法

  Lucene 的基础得分算法

coord(q,d): 文档d中,q中命中的项数除以查询q的项总数

queryNorm(q): 只在不同query比较时影响score的normalizing因素

tf(t in d):单文本词汇频率,t在文档d中出现的次数除以d中所有的项总数的平方根

idf(t):逆文本频率指数,log(numDocs/docFreq+1)+1.0

  If the document has multiple fields with the same name, all their boosts are multiplied together

  从Lucene的得分算法公式我们可以看出,得分算法和单词在文档中的位置没有任何关系,也就是说Lucene 的得分算法只关心单词分量的出现频率,不关心出现位置。这就不难理解为什么文档2的得分比文档1高了,因为文档2中 “教育”分量出现了1次,“问题”分量出现了2次,而文档1中这两个分量各出现了一次,另外idf 和 norm(t,d) 在当前环境中又几乎相等,于是文档2的得分就超过了文档1。这是Lucene得分算法的重大缺陷,因为文档的匹配相关度不仅与频率有关还与位置有关。

  HubbleDotNet 的基础得分算法

  HubbleDotNet 在设计得分算法时充分考虑到了Lucene 的这个缺陷,在得分算法中加入了位置函数 fp(t,d,q) ,这个位置函数的加入使HubbleDotNet 的匹配相关度比Lucene有了大幅的提高。

HubbleDotNet 的基础得分算法公式如下:

  这个算法其实是以 TF-IDF 算法为基础并增加了位置函数 fp(t,d,q)

其中

FieldRank 为字段权值 Rank(t,q) 为单词分量(term)的在查询字符串中的权值,即 教育^1^0 中的 1 Rank(t,d) 为单词分量(term)所在文档的权值,默
认为1,如果要指定文档权值,需要在表中增加一个 rank int untokenized 字段。 TF(t,d) : 为单文本词汇频率,要查询的单词分量(term)在文档中的出现的次数除以文档所有单词分量出现的次数。

公式如下:

IDF(t) 为逆文本频率指数。

公式如下:

|D|: 文本集合的文档总数

: 为含有单词分类(term)的文档总数

HubbleDotNet 的 tf idf 算法是根据标准算法来写的,和Lucene 的算法有不同。参考 tf-idf

Sum(t) = 单词分量(term) 在所有文档中出现的总数的平方根。

公式如下:

fp(t,d,q) 是单词分量在文档中的位置与在查询字符串中的位置关系函数,位置越接近,则返回值越大。

  除去 fp(t,d,q) 以外的部分和 Lucene 的得分算法是近似的,都是基于余弦定理来做的,只是在实现上有点区别而已。

  而 fp(t,d,q) 则是Lucene 得分算法所没有的,这个函数是单词分量在文档中的位置与在查询字符串中的位置关系函数,位置越接近,则返回值越大。

  就拿上面的例子来说,教育 和 问题 这两个单词分量在文档1 中的位置关系和查询字符串 “教育问题” 的位置关系是一致的,这时 fp(t,d,q) 函数的返回值就会很大,而文档2中,两个单词分量的位置关系和查询字符串“教育问题” 的位置关系不一致,这时返回值就比较小。这也就是我们看到文档1的得分要比文档2大几个数量级的原因。

  关于fp(t,d,q)这个函数的实现原理我将在另外的文章中阐述,主要思路就是计算相同向量在文档中和查询字符串中的向量夹角然后求积,不过说起来简单,这里面要考虑的问题还是比较多,比如如何控制返回值不能太大,查询字符串中有多个相同单词分量怎么处理等等。

  相关文章:

  HubbleDotNet 和 Lucene.net 性能对比测试

  HubbleDotNet 海量数据测试报告

时间: 2024-09-27 18:52:14

HubbleDotNet 和 Lucene.Net 匹配相关度的比较的相关文章

一起谈.NET技术,HubbleDotNet 和 Lucene.Net 匹配相关度的比较

很多网友在使用 Lucene.net (Lucene java 版本也是一样)后会感觉Lucene.net 的匹配相关度存在问题,搜索得到的结果往往不是希望的结果,不完全匹配的记录往往比完全匹配的记录排序还要靠前,很多人试图通过分词来解决,中文环境搜索,分词确实能解决一些问题,但不能根本解决问题,而英文环境下,分词根本无法解决任何问题. 问题的本质是由于Lucene的得分算法缺陷造成的,不改进得分算法根本不能根本解决问题.HubbleDotNet的得分算法参考了Lucene的得分算法并做了重大改

Lucene全文检索基础

---------------------------------------------------------------------------------------------------------------[版权申明:本文系作者原创,转载请注明出处]文章出处:http://blog.csdn.net/sdksdk0/article/details/51873672作者:朱培     ID:sdksdk0 --------------------------------------

如何写好一篇让搜索引擎跟用户都喜欢的原创文章

都知道百度喜欢原创的文章,一篇原创且质量很高的文章不仅会得到百度的青睐,也会得到用户的喜欢.很多编辑在写文章的时候都会想怎么能写出一篇好的原创文章呢,特别是一些专业性很强的行业,没有一些专业性的知识是没有办法写出一篇高质量的原创文章的,下面具体的说说怎么能写出一篇高质量的原创文章. 一.标题 都说眼睛是心灵的窗口,你文章的标题也是你整篇文章的窗口,通过这个窗口你首先需要的是能吸引别人,然后告诉别人通过这个窗口你可以知道什么.正因为标题的重要性,于是出现了一大堆的标题党,利用标题来吸引用户阅读.文

有图有真相 智能配图让CNZZ云推荐更聪明

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在信息爆炸的快餐时代,图片展示的作用和价值不言而喻,"图文混排的推荐内容显然是更能吸引用户注意力的,但是我们这些中长尾的站点没有太多匹配的图片展示,所以经常出现图片与文字信息相差甚远,甚至风马牛不相及,反而会影响用户体验",这个问题曾经困扰知音网运营总监张威很长时间,这个声音代表了一批网站的需求,这也是CNZZ云推荐推出&

如何更新有价值的内容

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网站是否需要更新之前写过一篇<案例说明网站不需要每天更新>,就不在谈论这个话题了.纵观我们的网站文章成百上千,那么这些内容都是有价值的吗?今天易科seo和大家分享一下自己对于网站更新的一些心得和体会. 如何更新有价值的内容换言之就是研究用户需求,今天就用手上一个网站给大家做案例吧.这是一个干洗加盟的网站,而小生对于干洗行业属于门外

网盟推广相关名词释义

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网盟推广根据网站内容匹配相关度高的推广信息,并与网站主分享由此带来的点击分成.无论在联盟系统的FAQ中还是在与网站主的日常沟通邮件中,我们经常提到一些专有名词.本次优化文章将对这些名词进行解释,方便网站主与我们之间的沟通. 联盟产品相关的名词: 主题描述:可以展现文字和多媒体的推广信息,网民点击后形成可计费点击.主题描述共含有28个尺寸,可以

全文检索-lucene 的中文精确匹配问题

问题描述 lucene 的中文精确匹配问题 遇到了个麻烦想了很久 Lucene做全文检索的时候 对句子用IKAnalyzer 分词 然后需求是 能做到比如类似 word 中 ctrl +f 那种 精确匹配的 比如句子 "大家好"IKAnalyzer分词结果 为 大家|好 但是希望 "大家" . "家好" 这种 也能搜到结果 该怎么进行查询 就有点像 在 word中 一段文章 搜 文字内容一样 再比如句子 "百度公司" &quo

Lucene.Net 如何让完全匹配的居前?

问题描述 我要查的字段是做过分词的,在搜索一句话时,例如:"在金融领域有着良好的合作",查询出来的结果,包含这句话的内容的数据被排在了后面,有没有办法可以让完全匹配的数据放到最前面?

在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介

全文检索|索引 内容摘要: Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 从Lucene我们还可以学到什么 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全