最近做题的时候用到了bm25的文本匹配算法。我自己两年前就实现了一版。
https://github.com/zhusleep/fastbm25
我这个版本之前还没发到pypi,因此用起来比较麻烦。不能直接pip install **。而github上已有的bm25相关package都是低速版本,我的版本是有倒排索引来加速计算bm25得分的。因此今天把自己的库发到pypi了。过程相当顺利,没有审查,几分钟就制作好了。感叹国外的基础设施真是优秀!
使用方法
代码语言:javascript复制pip install fastbm25
关于如何把自己的包发到pypi,我是参考了这个帖子。
如何发布自己的 python 包?- 掘金juejin.cn/post/6844903950550827022
fastbm25做了什么?
The fast bm25 algorithm for text match optimized by reverted index. So the complexity will be no more than O(N(log N)). (利用倒排索引加速的bm25文本匹配算法,从一堆数据中寻找最相似的文本)
使用方法
1 从文档库中寻找k个最相似的文档; 如果是英文的话需要先分词
代码语言:javascript复制from fastbm25 import fastbm25
corpus = [
"How are you !",
"Hello Jack! Nice to meet you!",
"I am from China, I like math."
]
tokenized_corpus = [doc.lower().split(" ") for doc in corpus]
model = fastbm25(tokenized_corpus)
query = "where are you from".lower().split()
result = model.top_k_sentence(query,k=1)
print(result)
The result is list of tuple like [('I am from China, I like math.', 2, -0.06000000000000001)]
对于中文输入不用分词,可以使用这个方法
代码语言:javascript复制from fastbm25 import fastbm25
corpus = [
"张三考上了清华",
"李四考上了北大",
"我烤上了地瓜.",
"我们都有光明的未来."
]
model = fastbm25(corpus)
query = "我考上了大学"
result = model.top_k_sentence(query,k=1)
print(result)
[('李四考上了北大', 1, 1.21)]
2 根据已有的文档库,计算任意两个文档之间的相似度;(这两个文档不必事先出现在文档库中)
代码语言:javascript复制from fastbm25 import fastbm25
corpus = [
"How are you !",
"Hello Jack! Nice to meet you!",
"I am from China, I like math."
]
tokenized_corpus = [doc.lower().split(" ") for doc in corpus]
model = fastbm25(tokenized_corpus)
document_a = "where are you from".lower().split()
document_b = "where are you".lower().split()
result = model.similarity_bm25(document_a,document_b)
print(result)
> 1.944187075527278