文档章节

lucene学习6 之评分策略

明舞
 明舞
发布于 2014/11/16 19:32
字数 2098
阅读 32
收藏 0
点赞 0
评论 0

评分功能,在全文检索中也算是一个非常重要的模块,因为评分的好坏,直接决定着用户搜索匹配的相关性,试想一下假如用户输入了一个搜索词,搜索引擎返回了一大堆不相关的信息,或者没有层次性,重点性的结果,那么看起来将是一件多么糟糕的事情。 

lucene默认的评分机制,用的VSM(Vector  Space Model)空间向量模型,基于TF-IDF的评选方式,TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。 

TF-IDF模型,作为一种加权策略,在信息检索,搜索引擎,数据挖掘方面被广泛应用,这种模型在lucene中也得到了很好的实现。 


我们先来看下,一般常用的方法加权,在索引时给某个 
Field加权
 
<pre name="code" class="java"> Field field=   new Field("title", "过程", type); 
   field.setBoost(10.0f);</pre> 
这种方式在lucene4.x之前可以给文档和域分别进行加权,但是在4.x之后,只能给域加权,废弃了文档加权的方式,如果想给文档加权,就需要对每个域分别加权,来提升这个文档的权重。 

对比索引时的加权,我们在检索时也可以设置加权boost,代码示例如下: 

<pre name="code" class="java">Query q=parser.parse(term); 
q.setBoost(8f);//检索时加权 

</pre> 
或者也可以用,queryparse的解析表达式表示: 
<pre name="code" class="java">Query q=parser.parse("lucene^10 solr^5");</pre> 

除了,上面的几种方式外,我们还可以自定义评分在源码级别改变一些打分策略: 

1,coord(int overlap, int maxOverlap),协调因子,这个因素起什么作用呢, 

举个例子现在我索引里面有2条数据: 

(1)中国一个多民族国家 
(2)中国是世界人口大国 

当我们检索“中国”的时候,会发现这两个文档的评分一样,因为他们的长度也相等, 
而当我们检索“中国   民族”的时候会发现第一个文档会排在前面而且得分要高,为什么呢? 

overlap的个数,代表我们在文档中命中的个数 
maxOverlap的个数,代表着检索条件里面的个数==&gt;“中国   民族”2个 

由此我们假设其他的条件一样的情况下可以推算出1的得分=2/2=1 
而第二个的评分是=1/2=0.5 
所以文档1的评分会更好,因为它命中了更多的term。 

在源码里方法如下: 

<pre name="code" class="java"> public float coord(int overlap, int maxOverlap) { 
    return overlap / (float)maxOverlap; 
  }</pre> 

2,影响评分的第二个因素queryNorm,这个因素,影响评分,但不影响排序的结果,举个例子,如果我们想要把lucene的所有的记录得分的结果,给整体变大,或变小一些,那么我们就可以调整个参数,来控制整体的得分比率。 
在lucene的源码里表示如下方法: 

<pre name="code" class="java"> public float queryNorm(float sumOfSquaredWeights) { 
    return (float)(1.0 / Math.sqrt(sumOfSquaredWeights)); 
  }</pre> 

3,影响评分的第三个因素,TF,这个因素代表着一个term在某一篇文档中,如果它出现的频次越大,那么对应的评分就越高,我们假设,其他的评分因子都一样,有如下2篇文档: 

(1)中国人的一天是怎么度过的呀? 
(2)我们是中国人,他们也是中国人 


我们检索“中国人”,会发现文档2的得分会比文档1的高,因为中国人的这个term,在文档2中出现了2次,在文档1中,只出现了一次。由此计算评分得: 

假设基数都一样是10,那么文档1的得分=10*1=10 
而文档二的得分则是=10*2=20,假设其他因子都一样,那么此时 
文档2的总体评分就会高于文档1,在显示结果时,会优先排在命中结果集的上方。 
lucene源码里的方法如下: 

<pre name="code" class="java"> public float tf(float freq) { 
    return (float)Math.sqrt(freq); 
  }</pre> 

4,影响评分的第四个因素IDF,这个参数代表的含义是,在所有的文档中,如果某个term频繁出现,那么这个term就被认为是普遍词,所以它的得分就要被减免。 

举例如下3个文档: 
(1)狗是一种聪明的动物。 
(2)猫和狗你更喜欢那个。 
(3)狗的种类也有许多种。 

现在我们检索“狗  猫”,结果呢,我们会发现文档2排在结果集的首位,为什么呢? 
这其实就是IDF的思想,因为狗这个term在所有的文档中出现的次数大于猫,所以在IDF进行评分时,会降低其的评分。 

在lucene源码里,idf的方法如下: 
注意加1的二个作用第一个是为了避免除数的为0的情况,第二个是为了这个文档在整个文档中不存在的时候,避免其的评分为0的情况存在。 

<pre name="code" class="java"> public float idf(long docFreq, long numDocs) { 
    return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0); 
  }</pre> 
5,影响评分的第五个因素lengthNorm,这个因素是基于文档内容的长度计算的。举例如下: 

有2个文档: 
(1)中国 
(2)中国人 

这个时候我们在检索“中国”的时候,文档1就会排在文档2的前面,为什么会这样呢,明明中国一词在他们中间都出现了一次,造成这样情况出现,恰恰是由于lucene在计算评分,会将文档的长度计算在里面,因为根据常识,较短文本里,出现命中的词,说明这个词更加重要。 

lucene源码里的代码如下: 

<pre name="code" class="java">public float lengthNorm(FieldInvertState state) { 
    final int numTerms; 
    if (discountOverlaps)//代表对同义词不出理 
      numTerms = state.getLength() - state.getNumOverlap(); 
    else 
      numTerms = state.getLength(); 
   return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms))); 
  }</pre> 


6,lucene里影响评分的第六个因素,载荷Payload,这个功能是一个高级的功能,可以存储时,存储额外的信息,从而在检索时,达到从某种类型的数据动态加权。 

举个例子,我们可能希望某个XML里面被如果含有&lt;keyword&gt;&lt;/keywrod&gt;标记的词从而拥有更高的加权,这时候我们就可以利用载荷实现了,在索引的时候,我们判断term里的标签标记,如果出现了这个特定标签的标记的term,我们就额外存储它的加权载荷信息,从而再检索时,来达到一个良好的检索结果。这时候使用载荷,是一个再好不过的选择了。 

lucene的源码里对载荷的方法描述如下: 

<pre name="code" class="java">  public float scorePayload(int doc, int start, int end, BytesRef payload) { 
    return 1; 
  } 
</pre> 

除了散仙,上文介绍的6种因素外,加上散仙在文章开始部位介绍的boost放权,目前已经介绍了7种影响打分的因素,当然到这里,并不意味着,这些就是全部的影响评分的方法了,事实上除了这些,还有一些其他的自定义评分的方式,这个散仙会在后续的文章里介绍,大部分的时候,我们了解,利用这些信息,就能解决狠多业务上的需求了,所以我们可以在我们需要的任何时候,都可以继承DefaultSimilarity类,来重写和我们业务相关的最好的打分策略。 

本文转载自:http://www.iteye.com/job/topic/1133219

共有 人打赏支持
明舞
粉丝 227
博文 424
码字总数 516555
作品 0
程序员
Lucene4.3进阶开发之礼敬如来(十三)

评分功能,在全文检索中也算是一个非常重要的模块,因为评分的好坏,直接决定着用户搜索匹配的相关性,试想一下假如用户输入了一个搜索词,搜索引擎返回了一大堆不相关的信息,或者没有层次性...

heroShane
2014/02/21
0
0
lucene 自定义评分 影响排序

前记 这段时间需要修改一个别人写的一个搜索有关的项目,恰好底层使用的是lucene搜索框架。 为什么要去修改呢,当然是搜索结果不太令人满意啦,于是去研读了项目中关于搜索的代码。。。。。。...

leemo0530
2015/07/19
0
0
Lucene知识小总结7:评分设置

使用lucene,我们通过搜索出来的信息,都是相关性最强的排在前面的,这里涉及到评分机制,在实际生产中必定是要根据具体的业务需求做出更为复杂的自定义评分机制,但这里先简单看看lucene的评...

heroShane
2014/02/23
0
0
Lucene知识小总结6:搜索

建好索引之后必定是进行搜索的节奏了,lucene关于搜索这部分内容是包含很多知识的,这里只是一个梗概,因为作为知识点的小梳理,没有探讨高级的知识点,都是先对知识有个小印象,之后慢慢学习...

heroShane
2014/02/23
0
0
lucene 的评分机制

lucene 的评分机制 elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的。评分就是我们搜索的短语和索引中每篇文档的相关度打分。 如果没有干预评分算法的时候,每次查询,lucen...

王二狗子11
01/07
0
0
Lucene4.3开发之第六步之分神中期(六)

本篇要介绍的是关于过滤方面的知识,也就是Filter,如果了解Solr的朋友,肯定都会知道Solr里面fq这个参数,这个参数的作用其实就是lucene里面的过滤,对一些q参数查询的结果集,做过滤或者限...

heroShane
2014/02/21
0
0
Lucene4.3开发之第五步之融丹筑基(五)

排序是对于全文检索来言是一个必不可少的功能,在实际运行中,排序功能在某些时候给我们带来了很大的方便,比如在淘宝、京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者...

heroShane
2014/02/21
0
0
lucene4.7 之排序(四)

排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者...

一枚Sir
2014/04/10
0
0
《深入理解Elasticsearch(原书第2版)》一第2章 查询DSL进阶

第2章 查询DSL进阶 在上一章,我们了解了什么是Apache Lucene,它的整体架构,以及文本分析过程是如何完成的。之后,我们还介绍了Lucene的查询语言及其用法。除此之外,我们也讨论了Elastic...

哲别0
2017/11/01
0
0
Apache Lucene 6.2.1 中文文档-首页

原文链接:CDCN-码上中国 Lucene 是一个基于Java的全文搜索引擎。Lucene不是要给完整的应用程序,而是 一个可以轻松地向应用程序添加搜索功能的代码库API接口。 这是Apache Lucene 6.2.1的官...

码上中国博客
2016/11/05
164
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
10分钟前
0
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
42分钟前
0
0
OSChina 周日乱弹 —— 红薯,五年间我对你不离不弃

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ andonny :分享周二珂的单曲《孤独她呀》 《孤独她呀》- 周二珂 手机党少年们想听歌,请使劲儿戳(这里) @孤星闵月 :没事干,看一遍红楼梦...

小小编辑
47分钟前
98
8
Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
今天
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
16
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
242
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部