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}")