鸟语天空
Python BM25 (Best Match 25)
post by:追风剑情 2026-5-18 15:16

BM25 (Best Match 25) 是一种用于信息检索的排名函数,用于评估文档与查询的相关性。它基于词袋模型,核心思想是:

安装依赖
pip install rank_bm25

import jieba
import numpy as np
from rank_bm25 import BM25Okapi

# 中文文档库
documents = [
    "猫坐在垫子上。",
    "狗对着猫叫。",
    "敏捷的棕色狐狸跳过了懒狗。",
    "人工智能正在改变科技行业。",
    "机器学习和深度学习是人工智能的子集。",
    "由于经济不确定性,今年股市一直波动。",
    "人工智能以多种方式影响科技。",
    "机器学习算法正在快速改进。",
    "人工智能在科技领域的未来看起来很有希望。",
    "科技、工业和社会正在被人工智能改变。",
    "人工智能如何影响科技?"
]

# 使用jieba进行中文分词和预处理
def preprocess_chinese(text):
    """中文文本预处理:分词、小写(中文不需要,但保持格式统一)"""
    words = jieba.lcut(text)  # 精确模式分词
    return [word.lower() for word in words if word.strip()]  # 去除空字符

# 预处理所有文档
tokenized_docs = [preprocess_chinese(doc) for doc in documents]
print("分词后的文档示例:")
print(f"原始文档: {documents[0]}")
print(f"分词结果: {tokenized_docs[0]}")
print()

# 创建BM25模型
bm25 = BM25Okapi(tokenized_docs)

# 用户查询
query = "人工智能如何影响科技?"
print(f"用户查询: {query}")

# 预处理查询
tokenized_query = preprocess_chinese(query)
print(f"查询分词: {tokenized_query}")
print()

# 计算BM25得分
scores = bm25.get_scores(tokenized_query)

# 打印每个文档的得分
print("=" * 60)
print("文档相关性得分:")
print("=" * 60)
for i, score in enumerate(scores):
    print(f"文档 {i} 得分: {score:.4f}")
    print(f"文档 {i}: {documents[i]}")
    print()

# 找到最相关的文档
top_doc_index = np.argmax(scores)
print("=" * 60)
print(f"最相关的文档是文档 {top_doc_index}")
print(f"内容: {documents[top_doc_index]}")
print(f"BM25得分: {scores[top_doc_index]:.4f}")

运行测试
111111.png

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容