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

简介:   很多网友在使用 Lucene.net (Lucene java 版本也是一样)后会感觉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 排第二位,这个显然不是我们希望的结果。

image

  再看HubbleDotNet的结果

image

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

  记录2 排第二位,得分 85937

  原因分析

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

  Lucene 的基础得分算法

image

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

image

  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 的基础得分算法公式如下:

image

  这个算法其实是以 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)在文档中的出现的次数除以文档所有单词分量出现的次数。

公式如下:

image

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

公式如下:

image

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

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

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

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

公式如下:

image

  • 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 海量数据测试报告

目录
相关文章
|
7天前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
7天前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
2月前
|
自然语言处理 物联网 图形学
.NET 技术凭借其独特的优势和特性,为开发者们提供了一种高效、可靠且富有创造力的开发体验
本文深入探讨了.NET技术的独特优势及其在多个领域的应用,包括企业级应用、Web应用、桌面应用、移动应用和游戏开发。通过强大的工具集、高效的代码管理、跨平台支持及稳定的性能,.NET为开发者提供了高效、可靠的开发体验,并面对技术更新和竞争压力,不断创新发展。
79 7
|
2月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
35 5
|
2月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
46 4
|
2月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
36 4
|
2月前
|
机器学习/深度学习 人工智能 物联网
.NET 技术:引领未来开发潮流
.NET 技术以其跨平台兼容性、高效的开发体验、强大的性能表现和安全可靠的架构,成为引领未来开发潮流的重要力量。本文深入探讨了 .NET 的核心优势与特点,及其在企业级应用、移动开发、云计算、人工智能等领域的广泛应用,展示了其卓越的应用价值和未来发展前景。
65 5
|
2月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
45 3
|
2月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
40 3
|
2月前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
37 3