2019独角兽企业重金招聘Python工程师标准>>>

原文: http://summerbell.iteye.com/blog/420084

1 什么是BM25

摘录一段wiki

BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document, regardless of the inter-relationship between the query terms within a document (e.g., their relative proximity). It is not a single function, but actually a whole family of scoring functions, with slightly different components and parameters. One of the most prominent instantiations of the function is as follows.

文档搜索中,并没有例如pr(google)这样的权威的评分作为排序的依据,所以有各种各样评分标准来评价我们搜索的相关度,而BM25就是其中比较著名的一种。

 

2 怎么用BM25

到底BM25评分还是个数学方法,我们先来看看它的数学表达式


 

大概解释一下公式的意思
对于公式1
score(D,Q):就是我们所要计算的评分,即为【给定搜索内容】Q在【给定文档】D中的相关程度,分数越高表示相关度越高。
q:【给定搜索内容】Q中的语素,英文的话就是单词,中文的话需要先进行简单的切词操作。
f(qi,D):在【给定文档】D中,某一个语素qi出现的频率。
|D|:【给定文档】D长度。
avgdl:索引中所有文档长度。
另外两个参数K1和b用来调整精准度,一般情况下我们取K1=2,b=0.75。

公式2是用来计算公式1中IDF(qi)的值
N:索引中文档的总数目。
n(qi):索引中包含语素qi的文档的总书目。

至此,公式所有变量、常量意义明确,我们就可以开始计算了。
--------------------------------------------------------------
由于公式并不难以理解,纯计算部分coder的事就没必要列出来了,这里我想说的是如何把这套评分体系和lucene结合起来。

众所皆知,lucene有score的功能,详见以下链接
http://lucene.apache.org/java/2_4_0/scoring.html
就不细说了。

现在我们做一个简单的demo,加入附件中的jar包

Java代码

  1. public static void main(String[] args) throws ParseException, IOException {
  2. //建立索引
  3. IndexSearcher searcher = new IndexSearcher("/doc");
  4. //计算平均长度avgdl
  5. BM25Parameters.load("avgLengthPath");
  6. BM25BooleanQuery query = new BM25BooleanQuery("This is my Query",
  7. "Search-Field", new MMAnalyzer());
  8. //开始进行检索
  9. Hits hits = searcher.search(query);
  10. //输出结果
  11. for (int i = 0; i < 10; i++) {
  12. System.out.println(hits.id(i) + ":" + hits.score(i));
  13. }
  14. }

public static void main(String[] args) throws ParseException, IOException {

//建立索引

IndexSearcher searcher = new IndexSearcher("/doc");

//计算平均长度avgdl

BM25Parameters.load("avgLengthPath");

BM25BooleanQuery query = new BM25BooleanQuery("This is my Query",

"Search-Field", new MMAnalyzer());

//开始进行检索

Hits hits = searcher.search(query);

//输出结果

for (int i = 0; i < 10; i++) {

System.out.println(hits.id(i) + ":" + hits.score(i));

}

}

我们即可计算BM25,模仿baidu硬盘搜索做一个简单的玩意也可以很快上手了。

补充:除了lucene以外,mg4j也可以进行bm25的计算,甚至于比lucene更优秀的在于利用mg4j可以直接计算bm25。不过在中文分词方面,利用mg4j就远没有lucene方便,所以略去不谈。

3 BM25怎么样
简单分析一下bm25的算法我们可以知道这套评分方法还是基于在文档中出现频率,也就是说给定查询语句中的词素至少要有一个在给定文档中出现,不然计算结果会为0。

而由不愿意透露身份的王博士所介绍的基于以下两个公式的转移概率模型的评分则不需要有如此硬性的要求,譬如你在搜索“中国首都”时,会得到一篇含有“北京”字样的文档。


 

我们衡量一套搜索方法的原则无外乎准确度和量:
基于转移概率的搜索方法虽然得到的量会更多一些,的那是我们认为准确度会有所不足,并不是每组高转移概率的词汇对都会如“中国首都”和“北京”这样同义,可能会有很多无意义的转移词汇对或者根本不相关的词汇对,这将大大降低搜索的效率。

基于BM25的搜索方法在准确度上会更胜一筹,它的结果至少保证了是含有【给定搜索语句】的语素,事实上大部分实用的全文搜索也保证了这一原则。

由此对比,我们认为虽然基于转移概率模型的评分在理论上是一套更好的评分方法,但是实际操作用问题很多,在没有一个相对而言准确且大量的转移词汇对数据库前,基于BM25评分的搜索算法应该是更实用的。

转载于:https://my.oschina.net/letiantian/blog/323930

转载:谈谈BM25评分相关推荐

  1. [转]搜索引擎的文档相关性计算和检索模型(BM25/TF-IDF)

    搜索引擎的检索模型-查询与文档的相关度计算 1. 检索模型概述 搜索结果排序时搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度.实际搜索结果排序的因子有很多,但最主要的两个因素是 ...

  2. Lucece评分公式OKapi BM25原理解析(中)

    背景: 延续上篇写了TF/IDF的公式解析,本篇为BM25解析简单介绍. BM25起源于 概率相关性模型,而不是矢量空间模型,但是该算法与Lucene的实际评分功能有很多共同点. 两者都使用Term词 ...

  3. 写代码、搜问题,全部都在「终端」完成!如此编程神器,是时候入手了

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 无论你是编程小白还是老司机,coding过程中总会遇到不懂的问题. 最常见的方法是去论坛询问.谷歌搜索,需要反复在网页和编译器页面切换,即 ...

  4. Elasticsearch 5.4 Mapping详解

    为什么80%的码农都做不了架构师?>>>    前言 一Field datatype字段数据类型 1string类型 2 text类型 3 keyword类型 4 数字类型 5 Ob ...

  5. GitHub 又一开源神器!写代码、搜问题,全部都在「终端」完成!

    来自量子位 无论你是编程小白还是老司机,coding过程中总会遇到不懂的问题. 最常见的方法是去论坛询问.谷歌搜索,需要反复在网页和编译器页面切换,即使有两个很大的分屏,生产力也会受到影响. 但是现在 ...

  6. 厉害了!写代码、搜问题,全部都在「终端」完成!如此编程神器,是时候入手了...

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 无论你是编程小白还是老司机,coding过程中总会遇到不懂的问题. 最常见的方法是去论坛询问.谷歌搜索,需要反复在网页和编译器页面切换,即 ...

  7. 滴滴千万级ElasticSearch平台发展之路!

    来自:滴滴技术 导读:滴滴 ElasticSearch 团队经过 7 个月的奋斗,将维护国内的 30 多个 ES 集群,2000 多个 ES 节点,4PB 的数据,从 2.3.3 跨大版本无缝升级到 ...

  8. 滴滴ElasticSearch平台跨版本升级以及平台重构之路

    来自:滴滴技术 导读:滴滴 ElasticSearch 团队经过 7 个月的奋斗,将维护国内的 30 多个 ES 集群,2000 多个 ES 节点,4PB 的数据,从 2.3.3 跨大版本无缝升级到 ...

  9. sdk版本过低怎么办_滴滴ElasticSearch平台跨版本升级以及平台重构之路

    导读:滴滴 ElasticSearch 团队经过 7 个月的奋斗,将维护国内的 30 多个 ES 集群,2000 多个 ES 节点,4PB 的数据,从 2.3.3 跨大版本无缝升级到 6.6.1.完成 ...

  10. Apache Lucene 7.0即将发布!

    Apache Lucene项目可能会在几个月后发布其下一个主要版本7.0! 请记住,Lucene开发人员通常会努力为下一个非主要(功能)发行版移植新功能,而即将发布的6.5已经有了很多重大更改 ,因此 ...

最新文章

  1. startprocessinstancebykey()里面填写的参数_3种方法,快速学会在Word文档里面如何插入表格...
  2. java中jquery怎么学,jQuery动画+实例
  3. NXT节点搭建(二)环境搭建
  4. Linux crontab定时任务示例
  5. 黄斑裂孔Macular Hole
  6. 在浏览器里使用SAPGUI里的SE80
  7. cadence allegro - 焊盘命名规则 -unfinished -unfinished-unfinished
  8. 烧烤摊如何走O2O之路 微博微信运营案例分享
  9. VisualC++6.0如何打开之前的程序
  10. Goldendict 崩溃退出问题
  11. php伪装请求ip,php搞定ip伪装的两种方式
  12. 正则表达式,分组,捕获组,反向引用,重复数字正则表达式 ,python 实现
  13. 舆情监控系统java_java舆情监测系统
  14. 再说Mdx的字典文件处理
  15. 体积渲染(3)——3D值噪声+光线步进实现体积云
  16. CVE-2014-0321漏洞成因分析
  17. EBS开发_收款核销API
  18. Sublime Text 4.0 4084 汉化版 — 代码编辑器
  19. string复制部分内容
  20. 嫁我是你一生的赌注,我怎么忍心让你输

热门文章

  1. Matlab函数——randn
  2. LINUX下载编译wabt(反编译wasm)
  3. jogbuild-common.xml:17: Cannot find /home/tsit/tio-software/jogamp/gluegen/make/gluegen-cpptasks.xml
  4. configure:3855: gcc -V 5 gcc: error: unrecognized command line option '-V'
  5. 编译OpenJDK12:Target CPU mismatch. We are building for x86_64 but CL is for ; expected x64
  6. C中使用errno查看函数调用的错误
  7. python使用CV2剪切图片
  8. 只能用光盘启动怎么办?
  9. 对象复制语意学(Object Copy Semantics)
  10. 免费文件分发服务器,文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research...