信息检索之BM25算法

BM25算法参考文档,搜索引擎中的相关应用

import math
import jieba


class BM25(object):

    def __init__(self, docs):
        self.D = len(docs)  # 训练集的文本数量
        self.avgdl = sum([len(doc)+0.0 for doc in docs])/self.D # 平均每个文本的长度
        self.docs = docs
        self.f = []  # 一个文档中每个词的出现次数
        self.df = {} # 存储每个词及出现了该词的文档数量
        self.idf = {} # 存储每个词的idf值
        self.k1 = 1.5
        self.b = 0.75
        self.init()

    def init(self):
        for doc in self.docs:
            tmp = {}
            for word in doc:
                tmp[word] = tmp.get(word, 0) + 1  # 存储每个文档中每个词的出现次数
            self.f.append(tmp)
            for k in tmp.keys():
                self.df[k] = self.df.get(k, 0) + 1
        for k, v in self.df.items():
            self.idf[k] = math.log(self.D-v+0.5)-math.log(v+0.5)

        for key, value in self.__dict__.items():
            print(key, value)

    def sim(self, doc, index):
        score = 0
        for word in doc:
            if word not in self.f[index]:
                continue
            d = len(self.docs[index])
            score += (self.idf[word]*self.f[index][word]*(self.k1+1)/(self.f[index][word]+self.k1*(1-self.b+self.b*d/self.avgdl)))
        return score

    def simall(self, query_list):
        sim_dict = {}

        # 遍历所有的候选文章,计算每个文章与querey的score
        for index in range(self.D):
            # 查询的每个语素,计算每个语素与该句子的score
            score = 0
            for query in query_list:
                # 每个语素的idf
                if query in self.idf:
                    quer_idf = self.idf[query]
                else:
                    quer_idf = 0
                # 计算R
                if query in self.f[index]:
                    f_i = self.f[index][query]
                else:
                    f_i = 0
                R = (f_i*(self.k1+1))/(f_i+self.k1*(1-self.b+self.b*len(self.docs[index])/self.avgdl))
                # 计算idf*R
                sim = quer_idf * R
                score += sim
            if score != 0:
                sim_dict[score] = index

        sim_dict = sorted(sim_dict.items(),key=lambda item:item[0], reverse=True)
        return sim_dict

if __name__ == '__main__':

    sents = []
    sents.append("自然语言自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。")
    sents.append("它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。")
    sents.append("自然语言处理是一门融语言学、计算机科学、数学于一体的科学。")
    sents.append("因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,")
    sents.append("所以它与语言学的研究有着密切的联系,但又有重要的区别。")
    sents.append("自然语言处理并不是一般地研究自然语言,")
    sents.append("而在于研制能有效地实现自然语言通信的计算机系统,")
    sents.append("特别是其中的软件系统。因而它是计算机科学的一部分。")

    # 分词并剔除停用词
    docs = []
    for sent in sents:
        words = list(jieba.cut(sent))
        new_words = []
        for word in words:
            if word not in [",", "。", "的", "而", "是", "与", "中", "它", "能"]:
                new_words.append(word)
        docs.append(new_words)
    s = BM25(docs)

    print()
    list1 = ['自然语言', '计算机科学', '人工智能', '领域']   # 分词之后的list
    sim_dict = s.simall(list1)
    for score, index in sim_dict:
        print(score, sents[index])

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BM25算法是一种用于文本检索和文档排序的算法。在Python中,可以使用gensim库中的bm25模块来实现BM25算法。下面是一个示例代码,用于展示如何使用BM25算法进行文本分类: ```python from gensim.summarization import bm25 import jieba def gensim_bm25_word_classification(test_word): corpus = [ ['高', '血', '压', '高血', '血压'], ['糖', '尿', '病'], ['精', '神', '病'] ] corpus_dic = { '高血压': ['高', '血', '压', '高血', '血压'], '糖尿病': ['糖', '尿', '病'], '精神病': ['精', '神', '病'] } bm25Model = bm25.BM25(corpus) # 构建BM25模型 test_word = list(test_word) # 将测试文本转为列表 scores = bm25Model.get_scores(test_word) # 计算相关性分数 print('测试短文本:', test_word) for i, j in zip(scores, corpus): for m in corpus_dic.keys(): if j == corpus_dic[m]: word_name = m print('分值:{},原词:{}'.format(i, word_name)) test_word = '高血压的症状是什么' # 设置测试文本 gensim_bm25_word_classification(test_word) ``` 以上代码演示了如何使用BM25算法对文本进行分类,根据测试文本的相关性分数来判断其属于哪个类别。在这个例子中,我们使用了一个简单的文本分类任务,将测试文本与预定义的文本集进行匹配,得到相关性分数并输出对应的类别名称。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python bm25短文本分类,相似度识别,BM25算法相似度匹配,疾病相似度匹配gensim实现,bm25算法原理和实现...](https://blog.csdn.net/L_goodboy/article/details/124415418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值