首页 > 编程语言 >BM25算法评估文本检索结果

BM25算法评估文本检索结果

时间:2023-12-16 21:04:03浏览次数:30  
标签:term 文本检索 BM25 doc self len 算法 文档 docs

BM25算法评估文本检索结果的详细步骤如下:

  1. 数据准备:收集文本数据集,包括标题、作者和内容等信息。
  2. 文本预处理:对文本进行预处理操作以便进行后续计算。常见的预处理包括分词、去除停用词(如一些常见的虚词、标点符号等)、词干化(将词汇还原为其原始形式)等。可以使用自然语言处理(NLP)库如NLTK、spaCy等进行预处理操作。
  3. 构建倒排索引:将预处理后的文本构建成倒排索引,以加速检索。倒排索引是一个词项到文档的映射,每个词项对应一个包含该词项的文档列表。
  4. 计算文档权重:使用BM25算法计算每个文档的权重。BM25算法考虑了词项的出现频率、文档长度和文档集合中的文档频率等因素。可以根据文本的标题、作者、内容等信息计算每个文本的得分,得分越高表示与查询的相关性越高。
  5. 查询处理:对用户的查询进行与步骤2相同的预处理操作,将查询文本转化为查询词项。
  6. 计算查询权重:根据BM25算法计算查询的权重。与步骤4类似,考虑词项在查询中的出现频率、查询长度和文档集合中的文档频率等因素。
  7. 检索与排序:使用查询的权重与步骤4中计算的文档权重进行匹配,得到每个文本与查询的相关性得分。根据得分对文档进行排序,得分越高的排在前面,表示与查询相关性更高。
  8. 结果展示与评估:将排序后的检索结果展示给用户,并进行相关性评估。常见的评估指标包括精确度、召回率、F1值等。

代码

from math import log

class BM25:
    def __init__(self, docs):
        self.docs = docs
        self.doc_freq = {}
        self.avg_doc_len = 0
        self.k1 = 1.5
        self.b = 0.75
        self.calc_doc_freq()
        
    def calc_doc_freq(self):
        doc_len_sum = 0
        for doc in self.docs:
            doc_len_sum += len(doc)
            term_set = set(doc)
            for term in term_set:
                if term in self.doc_freq:
                    self.doc_freq[term] += 1
                else:
                    self.doc_freq[term] = 1
        self.avg_doc_len = doc_len_sum / len(self.docs)
        
    def calc_score(self, query):
        scores = []
        query_terms = set(query)
        for doc in self.docs:
            doc_len = len(doc)
            score = 0
            for term in query_terms:
                if term in doc:
                    tf = doc.count(term)
                    idf = log((len(self.docs) - self.doc_freq.get(term, 0) + 0.5) / (self.doc_freq.get(term, 0) + 0.5))
                    score += idf * (tf * (self.k1 + 1)) / (tf + self.k1 * (1 - self.b + self.b * doc_len / self.avg_doc_len))
            scores.append(score)
        return scores

# 示例数据
docs = [
    ["诗歌1", "作者1", "诗歌1内容"],
    ["诗歌2", "作者2", "诗歌2内容"],
    ["诗歌3", "作者3", "诗歌3内容"],
    # ...
]

# 初始化BM25模型
bm25_model = BM25(docs)

# 查询
query = ["关键词1", "关键词2", "关键词3"]
scores = bm25_model.calc_score(query)

# 结果排序
result = sorted(zip(docs, scores), key=lambda x: x[1], reverse=True)
for doc, score in result:
    print(f"相关性得分:{score},诗歌:{doc[0]},作者:{doc[1]},内容:{doc[2]}")

标签:term,文本检索,BM25,doc,self,len,算法,文档,docs
From: https://blog.51cto.com/u_15655475/8853715

相关文章

  • 机器学习中的算法——K最邻近算法(KNN)
    1.KNN算法的定位KNN算法属于分类算法,所以它是有监督学习里面的一部分,且属于有监督学习里的分类问题KNN的计算量很大KNN理论上比较成熟且算法简单易懂,易实现2.KNN算法的核心简单地说---“近朱者赤,近墨者黑”进行分类的时候,即将被分类的这个样本的附近(特征空间中最邻近......
  • 算法学习Day4两两交换,链表相交,环形链表
    Day4两两交换,链表相交,环形链表ByHQWQF2023/12/16笔记24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。解法:迭代法迭代法使用了虚拟头节点的技巧,迭代法代码class......
  • Kafka日志压实算法
    概念介绍我们有时候可以把Kafka当作key、value数据库用(当然kafka中的消息可以不指定key)。__consumer_offsets这个topic的数据,就是典型的key、value数据。/usr/local/kafka2.8/bin/kafka-run-class.shkafka.tools.DumpLogSegments--deep-iteration--print-data-log--files......
  • 【教3妹学编程-算法题】反转二叉树的奇数层
    3妹:“你不是真正的快乐,你的笑只是你穿的保护色”2哥 :3妹还在唱五月天的歌啊,你不知道五月天假唱,现在全网都在骂呢。3妹:知道啊,可是关我什么事,这个歌的确好听啊。2哥 :嗯嗯,不错,还以为你是脑残粉,无论黑白都只管追星呢。3妹:我是只管追歌的,歌好听就行啦。2哥 :追哥?追哪个哥,难......
  • 机器学习的方法主要可以分为以下几类¹²³: 1. **监督学习**:在监督学习中,我们有一个
    机器学习的方法主要可以分为以下几类¹²³:1.**监督学习**:在监督学习中,我们有一个标记的数据集,我们的目标是训练一个模型,使其能够预测新数据的标签。常见的监督学习算法包括:  -线性回归  -逻辑回归  -支持向量机(SVM)  -最近邻居(KNN)  -决策树......
  • KMP算法和Manacher算法
    KMP算法KMP算法解决的问题KMP算法用来解决字符串匹配问题:找到长串中短串出现的位置.KMP算法思路暴力比较与KMP的区别暴力匹配:对长串的每个位,都从头开始匹配短串的所有位.KMP算法:将短字符串前后相同的部分存储在\(next\)数组里,让之前匹配过的信息指导之后的匹配.......
  • 算法学习笔记四一插入排序
    目录什么是插入排序算法原理示例代码什么是插入排序插入排序可理解为扑克牌摸牌的过程,手中的牌为有序序列,然后随机摸一张牌,根据牌的大小插入到有序序列对应的位置。算法时间复杂度为O(n^2)算法原理默认列表第一个元素为基准,从第二个元素和第一个元素进行比较,并放入到相应位置......
  • 【教3妹学编程-算法题】用邮票贴满网格图
    3妹:“你不是真正的快乐,你的笑只是你穿的保护色”2哥 :3妹还在唱五月天的歌啊,你不知道五月天假唱,现在全网都在骂呢。3妹:知道啊,可是关我什么事,这个歌的确好听啊。2哥 :嗯嗯,不错,还以为你是脑残粉,无论黑白都只管追星呢。3妹:我是只管追歌的,歌好听就行啦。2哥 :追哥?追哪个哥,难......
  • 代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表
    LeetCode 203.移除链表元素题目链接:203.移除链表元素原链表删除元素(需要区分头节点和非头结点)使用虚拟头节点,统一链表操作(注意:新链表头结点是虚拟头节点的下一节点) LetCode707.设计链表题目链接:707.设计链表注意:头节点采用虚拟头节点,使得链表操作具有一致性!!!单链......
  • 算法学习笔记三一选择排序
    目录什么是选择排序算法原理示例代码什么是选择排序选择排序的主要思想是(升序为例):第一次从待排序的数据元素中选出最小的一个元素,和数组的起始位置元素进行交换,然后再从剩余的未排序元素中寻找到最小元素,然后和未排序的序列的第一个元素进行交换。每次在未排序序列中选择一个最......