lucene的默认评分算法-向量空间模型(Vector Space Model)

2024-06-16 09:18

本文主要是介绍lucene的默认评分算法-向量空间模型(Vector Space Model),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在lucene4以前,一直都是使用经典的向量空间模型作为其检索模型,这种方式虽然统一了评分算法,简化了计算,但是带来的问题是很难去调整,一旦向量空间模型不适合,也很难去替换一种更好的算法。

  而lucene4则将检索模型与事实上的搜索做了解耦和抽象,并且加入了另外几种检索模型的实现,其中就有经典的BM25。

  经典的向量空间模型的理论基础及其在lucene中的应用

  向量空间模型是信息检索领域中一种成熟和基础的检索模型。这种方法以3维空间中的向量作为类比,维度就是做好索引的term,比如这里以3个主要的关键词奥巴马,叙利亚和战争为三个维度,通过文档在各个维度上的权重,每个文档以及查询都会在空间中有一个向量,直观的看起来,两个向量越相似,则他们的夹角越小,所以,用起反比的cos,则可以得到,cos值越大,则两个向量越相似。同理便可以将3维空间推广到多维空间去。  

  用向量空间模型,便将相关性转化为相似性,根据点积和模的定义,可以得到下式:

  

  现在的问题就变成,如何求得每个维度上的term在文档中的权重,在向量空间模型中,特征权重的计算框架是TF*IDF框架,这里TF就是term在文档中的词频,TF值越大,说明该篇文档相对于这个term来说更加重要,因此,权重应该更高;而IDF则是term在整个文档集中占的比重,即n/N,其中n是含该term的文档数,N是总文档数,但是,实际使用中往往习惯用

  

  即所包含的该term的文档数越少说明该term越重要。可以举个例子,有100篇文档,其中80篇都在说红楼梦,其中只有几篇讲到计算机,当你在这个文档集中搜索到计算机时,可以肯定这几篇讲计算机的比较重要,而搜索红楼梦时,则很难区分哪篇更加重要,换句话说,在这个文档集合中,计算机比红楼梦更有区分度,相对来说,计算机比红楼梦更有信息量,所以IDF就是评判所含信息量大小的一个值。

  一般情况,使用TF*IDF作为这里的权重w,从而计算出dj,q的相似度sim(dj,q)。

  那么,在lucene中,是如何应用这个模型的呢?根据向量空间模型的的数学推导(见参考文档3),可以看到,在lucene中实际上是将sim(dj,q)变形和调整后应用了如下一个打分公式

  

  该公式各项参数解释如下,在DefaultSimilarity中都有每一项参数的基本定义:

  coord(q,d): 协调因子,它的计算是基于文档d中所包含的所有可供查询的词条数量

  queryNorm: 在给出每个查询条目的方差和后,计算某查询的标准化值,即(关于valueForNormalization,见后面分析第a步)


  tf: 单词t在文档d中出现的词频,对词频开根号是希望对一篇出现太多相同关键词的文章进行相应的惩罚,即

  idf: 单词t在文档集中的比重。注意这个公式,首先为什么要加1,假设不加1,设想极端情况后面的log为0时(numDocs/docFreq+1 = 1), 带入打分公式,则该文档打分为0,也就是说该关键词分布得广反而一点分都没有了,事实上我们在这里只需要稍作惩罚,加1之后保证任何情况下这里都是有值的。其次,docFreq后为什么要加1呢,当然是为了防止docFreq为0作为除数的情况。所以原始的公式其实是idf(t) = log(numDocs/docFreq),与上面的分析一致


  t.getBoost(): 在搜索过程中影响评分的参数

  norm(t,d): 字段的标准化值,表明在字段中存储了多少词条,这个数值是在索引过程中计算出来的,并且也存储在索引中,可以在TFIDFSimScorer中的norms找到,其中一个参数LengthNorm是在DefaultSimilarity中定义的,另一个参数则是每次索引过程中每次处理一个field时累乘上去的。


    在3.0以前还有另一个参数用来提升Document的加权,可以在Document中找到setBoost,但是4.0以后取缔了,如需要模拟文档的加权,在IndexableField中建议应当自行加权多个Field。


  lucene中如何组织这个公式

  在TFIDFSimScorer中,可以找到

[java]  view plain copy

 print?




  1. public float score(int doc, float freq) {  

  2.   final float raw = tf(freq) * weightValue; // compute tf(f)*weight  

  3.     

  4.   return norms == null ? raw : raw * decodeNormValue(norms.get(doc));  // normalize for field  

  5. }  

注意到weightValue其实是stats.value,即IDFStats中的value,该value的计算其实是IndexSearcher中createNormalizedWeight产生的,如下
[java]  view plain copy

 print?




  1. float v = weight.getValueForNormalization();            a)  

  2. float norm = getSimilarity().queryNorm(v);              b)  

  3. weight.normalize(norm, 1.0f);                           c)  

其中,a)的计算其实就是

  b)的计算就是


  通过这两步计算得出打分公式中的queryNorm。

  c)步的计算可以得到,可以看出来,这是打分公式的一部分


  从score()中可以看出来,score的结果其实是,其实已经基本是打分公式了。

  到这里,已经基本上解释了打分公式在代码中的组织。接下来,我们最关心的就是。


  打分公式能够如何去影响我们的文档打分和排序

  下面是彩色的打分公式,接下来打分公式如何去影响文档的打分和排序时的文字色彩就对应了该彩色打分公式的色彩:


  1. 搜索时加权,即上式中t.getBoost(),在搜索时加权,即在搜索关键字后带^和权值


  2. 索引时加权,即上式中的norm(t, d)部分中的所有field的boost之积

  如下例,将文档1的加权设置为2之后,同样的搜索条件,文档1的评分增加了


  在索引过程中可以通过下面的语句设置字段加权,这也是影响评分最常见的方式

[java]  view plain copy

 print?




  1. Field.setBoost(boost)  

  3. 继承TFIDFSimilarity或DefaultSimilarity,对整个公式的控制。

   coord:当你键入搜索关键词“奥巴马 叙利亚”的时候,你一定希望同时出现两个词的文档排在只出现”奥巴马”的文档之前,某种程度上讲,同时出现两个词意味着更加精确。请看例子,第1篇文档只命中一个词,而第二篇文档同时命中2个词,因而得分较高(此处还有tf的因素,即lucene出现了两次,但是在这里影响不大)


   coord的计算是在DefaultSimilarity中定义的,因而可以修改它,maxOverlap其实就是搜索的总词数,而overlap则是该文档中实际出现了多少搜索词数

[java]  view plain copy
print ?
  1. public float coord(int overlap, int maxOverlap) {  
  2.   return overlap / (float)maxOverlap;  
  3. }  

    queryNorm:queryNorm并不能影响不同文档的得分顺序,但是可以影响整体的评分大小,比如,可以修改实现,让其变为1/sumOfSquaredWeights以便减小所有文档的得分或者增大文档得分。

[java]  view plain copy

 print?




  1. public float queryNorm(float sumOfSquaredWeights) {  

  2.   return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));  

  3. }  

    tf:tf的在DefaultSimilarity中的定义不能影响文档得分排序,但是它的参数freq,即词频是会影响得分的,可以看以下例子


  我们会发现它的得分提升并不是线性的,跟下式吻合

[java]  view plain copy

 print?




  1. public float tf(float freq) {  

  2.   return (float)Math.sqrt(freq);  

  3. }  

   idf:idf主要跟单词在文档中的个数有关系,如下,同样搜索关键词“过程 算法”,第一个例子中由于第2篇文档长度较长,因而得分较低;但是如果加入一篇新的文档,由于第1,3篇文档都含有关键字”过程”,因而增加了文档频率docFreq,故根据程序,评分会下降,而只含有”算法”的文档2评分就相对高了


[java]  view plain copy

 print?




  1. public float idf(long docFreq, long numDocs) {  

  2.   return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);  

  3. }  

   lengthNorm: 同等的搜索条件下,文档长度较长者得分较低

   请看如下文档长度对得分和顺序影响的例子,从中可以看出来,对“索引 算法”这组关键词,文档1中有前者,文档2中有后者 ,同样搜索这组关键词,当文档2长度较长时得分较低,而当文档2长度较短时得分较高

  

   在DefaultSimilarity中程序如下

[java]  view plain copy

 print?




  1. public float lengthNorm(FieldInvertState state) {  

  2.   final int numTerms;  

  3.   if (discountOverlaps)  

  4.     numTerms = state.getLength() - state.getNumOverlap();  

  5.   else  

  6.     numTerms = state.getLength();  

  7.  return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));  

  8. }  


这篇关于lucene的默认评分算法-向量空间模型(Vector Space Model)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066052

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo