首页 > 其他分享 >ES相关性(_score)

ES相关性(_score)

时间:2024-07-21 10:30:15浏览次数:8  
标签:检索 TF score 词频 相关性 IDF 文档 ES

什么是相关性

相关度是指两个事物间相互关联的程度,在检索领域特指检索请求与检索结果之间的相关程度。默认情况下,返回结果是按相关性倒序排列的。 但什么是相关性? 相关性如何计算?

每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 。 _score 的评分越高,相关性越高

查询语句会为每个文档生成一个 _score 字段。评分的计算方式取决于查询类型 不同的查询语句用于不同的目的: fuzzy 查询会计算与关键词的拼写相似程度,terms 查询会计算 找到的内容与关键词组成部分匹配的百分比,但是通常 relevance 是用来计算全文本字段的值相对于全文本检索词相似程度的算法。

Elasticsearch 的相似度算法被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容:

  • 检索词频率

检索词在该字段出现的频率?出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。

  • 反向文档频率

每个检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。

  • 字段长度准则

字段的长度是多少?长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。
相关性并不只是全文本检索的专利。也适用于 yes|no 的子句,匹配的子句越多,相关性评分越高。

如果多条查询子句被合并为一条复合查询语句,比如 bool 查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。

相关性算法

ES 5.0 之前,默认的相关性算分采用的是 TF-IDF,而之后则默认采用 BM25。

1)TF-IDF算法

 

TF-IDF 是ES5.0之前使用的,相关性算法。考虑词频,逆文档率,和词的长度影响。综合得到一个分数。

  • TF 是词频,比如某个关键词在文章A中出现了10次,在文章B中出现了20次。理想情况下,出现的次数越多。相关性就越大一点。实际计算是,对关键词在文章中出现的次数开平方。
  • IDF 是逆文档率。关键词在越多的文章中出现,该词的得分影响就越小。比如你我他这种关键词,可能在每篇文章中都出现了。那么实际上对文档的得分没有什么意义。
  • 字段长度影响。例如,“联合利剑”在标题字段出现了,在正文也出现了。理想情况下,命中标题,相关性可能会更大一些。标题和正文,一般区别就是,标题比正文短很多。在评分中,字段的长度也会作为相关性分数中的一项去计算。

TF-IDF算法的思想就是,关键词在给定文档中出现的次数越高、全体文档中出现的次数越低时,该关键词在给定文档的评分就越高:

  • 局部常见:该单词在文档中多次出现
  • 全局罕见:该单词在语料库中出现的次数并不多

2)BM25算法

是在TF-IDF之上的补充,TF-IDF的缺陷:

  • 未考虑词频饱和度(词频上限问题):词频饱和度指的是当词频超过一定数量之后,它对相关度的影响将趋于饱和。换句话说,词频10次的相关度比词频1次的分值要大很多,但100次与10次之间差距就不会那么明显了
  • 未考虑文档长度影响(字段长短问题):1000个词的文档含有10个关键词,比10个词的文档含有1个词,相似度并不一定更高,因为文档越长所含的关键字也会更多

ES的应用

ES中相关性评分的应用很广泛,最常见的应用就是搜索引擎中,将最相关的链接展示在最前面,其次还有一些应用:

  • 推荐系统中的用户最爱:每个用户的喜好不一致,对喜好字段设置更高权重,由ES打分并推荐最相关商品文档
  • 风控系统中的团伙挖掘:对团伙各相关字段(手机号相同、地址相同等)设置权重,并由ES打分获取最相关的团伙文档
  • 实时日志检索:基于ELK架构,以关键字作为评分依据,搜索最相关日志文档

标签:检索,TF,score,词频,相关性,IDF,文档,ES
From: https://www.cnblogs.com/beatle-go/p/18314219

相关文章

  • Spring Resources 入门
    1.介绍Resources是Spring框架中的一个核心模块,用于处理资源文件的访问。它提供了一种方便的方式来访问不同类型的资源,如文件、类路径下的资源、网络上的资源等。Spring提供了统一的资源访问机制,使得开发者可以更加方便地操作各种资源。接下来让我们来学习关于Resource......
  • 使用.loc切片时Series为空
    我想获取Q1到Q9之间的项目。我使用.loc对系列对象进行切片:s.loc['Q1':'Q2']但是它返回一个空系列。Series([],dtype:object)通常,我应该返回['Q1','Q2','Q3','Q4','Q5','Q6','Q7'......
  • Codeforces Round 960 (Div. 2) 补题记录(A~D)
    打的稀烂,但是还是上分了(A考虑对值域做一个后缀和。若某一个后缀和的值是奇数那么先手就可以获胜。否则就不可以获胜。(我才不会告诉你我这题吃了一次罚时的)#pragmaGCCoptimize(3)#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intmysqrt(intx){......
  • 使用 pyodbc 将数据插入 MS Access 时无法在 Excel 文件中找到“Sheet1”
    我正在尝试使用pyodbc将Excel文件中的数据插入到MSAccess数据库中,但我不断遇到错误,指出在Excel文件中找不到“Sheet1”。这是我的代码:importpyodbcfilename='ALC_2022068_06282024-testingcopy.xlsx'sql=r"""INSERTINTOtblALC_test([dateofnotice],[pro......
  • 我的 RandomForestRegressor 上的 MAE 和 MSE 非常高
    我得到了一个航班预测数据集,我想尝试一下我的机器学习技能。我清理了数据并修复了一些新功能并删除了其他功能我还得到了一些有价值的数据。但是当我尝试做出预测并评估我的模型时这就是我得到的答案!那是在我用SearchGridCV调整我的模型之后Regressionmetricsonthe......
  • 除了curses之外,是否有一个python包可以轻松控制终端的输出?
    我现在正在处理一些小项目,我对GUI的偏好是终端中漂亮的文本界面。我宁愿不强迫用户处理Windowscurses二进制文件,所以我正在寻找不同的选项。我已经发现了asciimatics,但我想考虑所有可能的选择。如果有人有任何经验或知道解决此用例的包,我将不胜感激。谢谢你说的没错......
  • Django makemessages 重复翻译
    我有现有的.po文件,但我仍在构建我的项目,因此添加了新的翻译字符串,并且一些已添加的翻译字符串正在更改位置。要更新我正在运行的.po文件django-adminmakemessages-len当我打开文件时我发现相同的翻译重复了很多次:#:_templates/admin-users/base/partials/sid......
  • 如何修改conftest中的参数化值并将它们传递给pytest中的多个测试用例
    问题:假设一个流程需要10个步骤才能完成。我一一开始该过程的步骤,在这些步骤之间,我想做出不同的断言。每次断言后,我都会继续执行其余步骤。我希望每个断言都作为测试用例发生。所以如果有5个断言,我需要5个测试用例。如果有2组参数化值,那么我需要每组进行5次断言,因此将......
  • 当值来自函数 python unittest 时,如何模拟全局变量
    我必须在python中模拟全局变量,但变量值来自另一个函数。当我导入文件时,这个函数正在运行,但我想要那里的模拟值。secrets.pyimporttracebackimportloggingimportboto3importosimportjsonlogger=logging.getLogger()logger.setLevel(logging.INFO)secret_......
  • 使用 requests 包 python 时打开文件太多
    我正在使用Pythonrequests包向API发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确关闭我的会话时,我真的不知道这是怎么回事。我使用以下代码:importrequestsimportmultiprocessingimportnumpyasnps=requests.session()s.keep......