bm25_search.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import jieba
  2. from rank_bm25 import BM25L
  3. import logging
  4. # 配置日志
  5. logging.basicConfig(
  6. level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
  7. )
  8. logger = logging.getLogger(__name__)
  9. class BM25Search:
  10. def __init__(self, documents):
  11. # 初始化文档集合
  12. self.documents = documents
  13. # 分词后的文档
  14. self.tokenized_docs = [jieba.lcut(doc) for doc in documents]
  15. # 初始化 BM25 模型
  16. self.bm25 = BM25L(self.tokenized_docs)
  17. logger.info("BM25模型初始化完成")
  18. def search(self, query):
  19. # 分词查询
  20. tokenized_query = jieba.lcut(query)
  21. try:
  22. # 计算每个文档的 BM25 得分
  23. scores = self.bm25.get_scores(tokenized_query)
  24. print(f"scores--》{scores}")
  25. # 获取最高得分的文档索引
  26. best_idx = scores.argmax()
  27. best_score = scores[best_idx]
  28. best_doc = self.documents[best_idx]
  29. logger.info(
  30. f"查询: {query}, 最佳匹配: {best_doc}, 得分: {best_score}"
  31. )
  32. return best_doc, best_score
  33. except Exception as exc:
  34. logger.error(f"检索失败: {exc}")
  35. return None, 0.0