各种BM25算法用于文档排名
项目描述
Rank-BM25:一个两行搜索引擎
这些算法集合用于查询文档集并返回与查询最相关的文档。这些算法最常见的用例,正如你可能猜到的,是创建搜索引擎。
到目前为止,已实现的算法有
- Okapi BM25
- BM25L
- BM25+
- BM25-Adpt
- BM25T
这些算法来自这篇论文,其中对每种方法进行了很好的概述,并相互进行了基准测试。一个很好的包括点是,它们比较了不同的预处理方式,如词干化与非词干化、停用词去除或不去除等。如果你对这个主题不太熟悉,这是一篇很好的读物。
安装
安装此包的最简单方法是使用pip
,通过
pip install rank_bm25
如果您想确保您获得的是最新版本,您可以直接通过github安装它
pip install git+ssh://git@github.com/dorianbrown/rank_bm25.git
使用方法
在这个例子中,我们将使用BM25Okapi
算法,但其他算法的使用方式基本上相同。
初始化
首先需要创建BM25类的实例,它读取文本语料库并进行一些索引
from rank_bm25 import BM25Okapi
corpus = [
"Hello there good man!",
"It is quite windy in London",
"How is the weather today?"
]
tokenized_corpus = [doc.split(" ") for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus)
# <rank_bm25.BM25Okapi at 0x1047881d0>
请注意,此包不执行任何文本预处理。如果您想进行诸如小写化、停用词去除、词干化等操作,您需要自己完成。
唯一的要求是,该类接收字符串的列表的列表,这些字符串是文档标记。
文档排名
现在我们已经创建了文档索引,可以提交查询并查看哪些文档与查询最相关
query = "windy London"
tokenized_query = query.split(" ")
doc_scores = bm25.get_scores(tokenized_query)
# array([0. , 0.93729472, 0. ])
值得注意的是,我们还需要对查询进行分词,并应用与文档相同的预处理步骤,以便进行苹果对苹果的比较
除了获取文档得分外,您还可以使用以下方法检索最佳文档
bm25.get_top_n(tokenized_query, corpus, n=1)
# ['It is quite windy in London']
就是这样!