制作年轻人的第一个python包【fastbm25】

2022-11-29 16:31:45 浏览数 (1)

最近做题的时候用到了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

0 人点赞