Santer0101 2024-04-16 20:48 采纳率: 42.9%
浏览 13

bm25文本相似度搜索结果与提问不想干

如下图是我用python写的实现BM25文本相似度搜索的类

img


下图是实例化这个类。其中bm25 = BM25(words)中的words是一个分词之后的列表。列表元素是分词后的句子。

img


问题是:为什么在words中存在与提问更相关的段落,但是bm25计算的得分确很低,最后匹配出的都是不相关的句子??

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 20:48
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的信息,您的代码看起来没有明显的错误。然而,可能的原因有几个,这可能导致计算出的BM25分数偏低,使得相关性较高的段落得分不高。以下是可能的问题及相应的解决建议:

    1. 稀疏性问题: 如果您的文档集合非常大且词汇表也很大,那么某些查询项可能会在所有文档中都很少出现,导致IDF值接近于零。这会降低TF-IDF模型的区分度。为了解决这个问题,您可以考虑增加k1参数,以便提高TF部分的影响。

      class BM25:
          ...
          def __init__(self, documents, k1=1.5, b=0.75):
              ...
      
    2. 文档长度惩罚: 您的文档长度惩罚因子(b)设置为0.75,这意味着较长的文档会被稍微惩罚。如果您认为较长的文档可能包含更多相关信息,可以尝试减小b的值,使其对文档长度的影响变小。

      class BM25:
          ...
          def __init__(self, documents, k1=1.5, b=0.5):
              ...
      
    3. 停用词处理: 在分词过程中,您是否移除了常见的停用词?停用词(例如“的”、“是”等)通常不会提供太多信息,但它们频繁出现,可能会影响得分。确保在计算TF-IDF之前移除停用词。

    4. 同义词扩展: 考虑到语言的多义性和同义词的存在,您可以尝试将查询扩展为包括同义词。这可以通过使用词典或其他自然语言处理技术实现。

    5. 查询优化: 确保查询已经被正确地进行了分词。例如,如果查询中有未被正确识别的短语或实体,这可能会影响匹配效果。考虑使用更高级的分词工具或实体识别方法。

    6. 评估指标: 使用交叉验证或独立的数据集来评估您的模型性能。这可以帮助您确定模型是否真的过拟合了训练数据,或者是否存在其他问题。

    7. 调整参数: 不同的文档集合和查询可能需要不同的参数组合。您可以尝试调整k1b的值,看看是否能改善结果。

    8. 实验与对比: 尝试使用其他的文本相似度算法,比如余弦相似度,然后比较不同方法的结果。这样可以帮助您理解问题所在,并找到更适合您应用场景的方法。

    尽管我已经给出了这些潜在的改进措施,但最重要的是要对每个步骤进行详细的调试和分析,以找出具体原因。您可以打印中间结果,比如TF、IDF以及最终的得分,来观察哪些地方出现了异常。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月16日

悬赏问题

  • ¥15 没输出运行不了什么问题
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享
  • ¥15 C#i编程中so-ir-192编码的字符集转码UTF8问题
  • ¥15 51嵌入式入门按键小项目
  • ¥30 海外项目,如何降低Google Map接口费用?
  • ¥15 fluentmeshing
  • ¥15 手机/平板的浏览器里如何实现类似荧光笔的效果
  • ¥15 盘古气象大模型调用(python)