logo资料库

BM25算法介绍.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
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 代码 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)); }               } 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评分的搜索算法应该是更实用 的。
分享到:
收藏