热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LuceneSimilarity

Lucene系列介绍Similarity类实现打分(scoring)的API,它的子类实现了检索打分的算法。DefaultSimilari

Lucene系列介绍

Similarity类实现打分(scoring)的API,它的子类实现了检索打分的算法。DefaultSimilarity类是缺省的打分的实现,SimilarityDelegator类是用于委托打分(delegating scoring)的实现,在Query.getSimilarity(Searcher)}的实现里起作用,以便覆盖(override)一个Searcher中Similarity实现类的仅有的确定方法(certain methods)。 

 

查询q相对于文档d的分数与在文档和查询向量(query vectors)之间的余弦距离(cosing-distance)或者点乘积(dot-product)有关系(correlates to),文档和查询向量存于一个信息检索(Information Retrieval,IR)的向量空间模型(Vector Space Model,VSM)之中。一篇文档的向量与查询向量越接近(closer to),它的得分也越高(scored higher),这个分数按如下公式计算: 

 

其中:

1. tf(t in d) 与term的出现次数有关系,定义为term t在当前打分的文档d中出现的次数。对一个给定的term,那些出现此term的次数越多的文档将获得越高的分数。缺省的tf(t in d)算法实现在DefaultSimilarity类中,公式如下:

  

 

2. idf(t) 代表逆文档频率(Inverse Document Frequency)。这个分数与逆的docFreq(出现过term t的文档数目)有关系,numDocs是总的文档数目。这个分数的意义是越不常出现的term将为最后的总分贡献更多的分数。缺省idf(t in d)算法实现在DefaultSimilarity类中,公式如下:

  

3. coord(q,d) 是一个评分因子,基于有多少个查询terms在特定的文档中被找到。通常一篇包含了越多的查询terms的文档将比另一篇包含更少查询terms的文档获得更高的分数。这是一个搜索时因子,是在搜索的时候起作用,它在Similarity对象的coord(q,d)函数中计算。

 

4. queryNorm(q) 是一个修正因子(normalizing factor),用来使不同查询间的分数更具有可比较性(comparable)。这个因子不影响文档的排名(ranking)(因为搜索排好序的文档(ranked document)会增加相同的因数),更确切地说只是为了尝试使得不同查询条件(甚至不同索引(different indexes))之间更可比较性。这是一个搜索时因子是在搜索的时候起作用,由Similarity对象计算。缺省queryNorm(q)算法实现在DefaultSimilarity类中,公式如下:

  

sumOfSquaredWeights(查询的terms)是由查询Weight对象计算的,例如一个布尔(boolean)条件查询的计算公式为:

  

5. t.getBoost() 是一个搜索时的代表查询q中的term t的boost数值,具体指定在查询的文本中(参见查询语法),或者由应用程序调用setBoost()来指定。需要注意的是实际上没有一个直接的API来访问一个多个term的查询中的一个term 的boost值,更确切地说,多个terms在一个查询里的表示形式是多个TermQuery对象,所以查询里的一个term的boost值的访问是通过调用子查询的getBoost()方法实现的。

 

6. norm(t,d) 是提炼取得(encapsulate)一小部分boost值(在索引时间)和长度因子(length factor):

document boost – 在添加文档到索引之前通过调用doc.setBoost()来设置。

Field boost – 在添加Field到文档之前通过调用field.setBoost()来设置。

lengthNorm(field) – 在文档添加到索引的时候,根据文档中该field的tokens数目计算得出,所以更短的field会贡献更多的分数。lengthNorm是在索引的时候起作用,由Similarity类计算得出。

当一篇文档被添加到索引的时候,所有上面计算出的因子将相乘起来。如果文档拥有多个相同名字的fields,所有这些fields的boost值也会被一起相乘起来:

  

然而norm数值的结果在被存储之前被编码成一个单独的字节。在检索的时候,这个norm字节值从索引目录中读取出来,并解码回一个norm浮点数值。这个编/解码(encoding/decoding)行为,会缩减索引的大小,这得自于(come with)精度损耗的代价(price of precision loss)- 它不保证decode(encode(x))=x,举例来说decode(encode(0.89))=0.75。还有需要注意的是,检索的时候再修改评分(scoring)的这个norm部分已近太迟了,例如,为检索使用不同的Similarity。

 

参考文献:

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

 

转:https://www.cnblogs.com/bluepoint2009/archive/2012/11/02/lucene-similarity.html



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
author-avatar
拍友2502878393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有