import math
import jiebaclass 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 = docsself.f = []  # 一个文档中每个词的出现次数self.df = {}  # 存储每个词及出现了该词的文档数量self.idf = {}  # 存储每个词的idf值self.k1 = 1.5self.b = 0.75self.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) + 1for 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 = 0for word in doc:if word not in self.f[index]:continued = 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 scoredef simall(self, query_list):sim_dict = {}# 遍历所有的候选文章,计算每个文章与querey的scorefor index in range(self.D):# 查询的每个语素,计算每个语素与该句子的scorescore = 0for query in query_list:# 每个语素的idfif query in self.idf:quer_idf = self.idf[query]else:quer_idf = 0# 计算Rif query in self.f[index]:f_i = self.f[index][query]else:f_i = 0R = (f_i * (self.k1 + 1)) / (f_i + self.k1 * (1 - self.b + self.b * len(self.docs[index]) / self.avgdl))# 计算idf*Rsim = quer_idf * Rscore += simif score != 0:sim_dict[score] = indexsim_dict = sorted(sim_dict.items(), key=lambda item: item[0], reverse=True)return sim_dictif __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 = ['自然语言', '计算机科学', '人工智能', '领域']  # 分词之后的listsim_dict = s.simall(list1)for score, index in sim_dict:print(score, sents[index])
D 8
avgdl 10.125
docs [['自然语言', '自然语言', '处理', '计算机科学', '领域', '人工智能', '领域', '一个', '重要', '方向'], ['研究', '实现', '人', '计算机', '之间', '用', '自然语言', '进行', '有效', '通信', '各种', '理论', '和', '方法'], ['自然语言', '处理', '一门', '融', '语言学', '、', '计算机科学', '、', '数学', '于', '一体', '科学'], ['因此', '这一', '领域', '研究', '将', '涉及', '自然语言', '即', '人们', '日常', '使用', '语言'], ['所以', '语言学', '研究', '有着', '密切', '联系', '但', '又', '有', '重要', '区别'], ['自然语言', '处理', '并', '不是', '一般', '地', '研究', '自然语言'], ['在于', '研制', '有效', '地', '实现', '自然语言', '通信', '计算机系统'], ['特别', '其中', '软件系统', '因而', '计算机科学', '一部分']]
f [{'自然语言': 2, '处理': 1, '计算机科学': 1, '领域': 2, '人工智能': 1, '一个': 1, '重要': 1, '方向': 1}, {'研究': 1, '实现': 1, '人': 1, '计算机': 1, '之间': 1, '用': 1, '自然语言': 1, '进行': 1, '有效': 1, '通信': 1, '各种': 1, '理论': 1, '和': 1, '方法': 1}, {'自然语言': 1, '处理': 1, '一门': 1, '融': 1, '语言学': 1, '、': 2, '计算机科学': 1, '数学': 1, '于': 1, '一体': 1, '科学': 1}, {'因此': 1, '这一': 1, '领域': 1, '研究': 1, '将': 1, '涉及': 1, '自然语言': 1, '即': 1, '人们': 1, '日常': 1, '使用': 1, '语言': 1}, {'所以': 1, '语言学': 1, '研究': 1, '有着': 1, '密切': 1, '联系': 1, '但': 1, '又': 1, '有': 1, '重要': 1, '区别': 1}, {'自然语言': 2, '处理': 1, '并': 1, '不是': 1, '一般': 1, '地': 1, '研究': 1}, {'在于': 1, '研制': 1, '有效': 1, '地': 1, '实现': 1, '自然语言': 1, '通信': 1, '计算机系统': 1}, {'特别': 1, '其中': 1, '软件系统': 1, '因而': 1, '计算机科学': 1, '一部分': 1}]
df {'自然语言': 6, '处理': 3, '计算机科学': 3, '领域': 2, '人工智能': 1, '一个': 1, '重要': 2, '方向': 1, '研究': 4, '实现': 2, '人': 1, '计算机': 1, '之间': 1, '用': 1, '进行': 1, '有效': 2, '通信': 2, '各种': 1, '理论': 1, '和': 1, '方法': 1, '一门': 1, '融': 1, '语言学': 2, '、': 1, '数学': 1, '于': 1, '一体': 1, '科学': 1, '因此': 1, '这一': 1, '将': 1, '涉及': 1, '即': 1, '人们': 1, '日常': 1, '使用': 1, '语言': 1, '所以': 1, '有着': 1, '密切': 1, '联系': 1, '但': 1, '又': 1, '有': 1, '区别': 1, '并': 1, '不是': 1, '一般': 1, '地': 2, '在于': 1, '研制': 1, '计算机系统': 1, '特别': 1, '其中': 1, '软件系统': 1, '因而': 1, '一部分': 1}
idf {'自然语言': -0.9555114450274362, '处理': 0.4519851237430572, '计算机科学': 0.4519851237430572, '领域': 0.9555114450274362, '人工智能': 1.6094379124341003, '一个': 1.6094379124341003, '重要': 0.9555114450274362, '方向': 1.6094379124341003, '研究': 0.0, '实现': 0.9555114450274362, '人': 1.6094379124341003, '计算机': 1.6094379124341003, '之间': 1.6094379124341003, '用': 1.6094379124341003, '进行': 1.6094379124341003, '有效': 0.9555114450274362, '通信': 0.9555114450274362, '各种': 1.6094379124341003, '理论': 1.6094379124341003, '和': 1.6094379124341003, '方法': 1.6094379124341003, '一门': 1.6094379124341003, '融': 1.6094379124341003, '语言学': 0.9555114450274362, '、': 1.6094379124341003, '数学': 1.6094379124341003, '于': 1.6094379124341003, '一体': 1.6094379124341003, '科学': 1.6094379124341003, '因此': 1.6094379124341003, '这一': 1.6094379124341003, '将': 1.6094379124341003, '涉及': 1.6094379124341003, '即': 1.6094379124341003, '人们': 1.6094379124341003, '日常': 1.6094379124341003, '使用': 1.6094379124341003, '语言': 1.6094379124341003, '所以': 1.6094379124341003, '有着': 1.6094379124341003, '密切': 1.6094379124341003, '联系': 1.6094379124341003, '但': 1.6094379124341003, '又': 1.6094379124341003, '有': 1.6094379124341003, '区别': 1.6094379124341003, '并': 1.6094379124341003, '不是': 1.6094379124341003, '一般': 1.6094379124341003, '地': 0.9555114450274362, '在于': 1.6094379124341003, '研制': 1.6094379124341003, '计算机系统': 1.6094379124341003, '特别': 1.6094379124341003, '其中': 1.6094379124341003, '软件系统': 1.6094379124341003, '因而': 1.6094379124341003, '一部分': 1.6094379124341003}
k1 1.5
b 0.752.072939365988203 自然语言自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
0.5534511719302742 特别是其中的软件系统。因而它是计算机科学的一部分。
-0.46479352733942675 自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
-0.8151282469428366 它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
-1.0551660129137332 而在于研制能有效地实现自然语言通信的计算机系统,
-1.4637622136590513 自然语言处理并不是一般地研究自然语言,Process finished with exit code 0

BM25算法——(他人写)相关推荐

  1. 如何使用BM25算法检索出最相关的序列

    背景 起因 博主正在进行的科研应用到了in-context learning这个范式,与传统的学习范式不同,情境中学习并不是真的学习,即不改变模型的参数,称为in-context inference ...

  2. bm25算法Java代码_搜索引擎相关度算法 -BM25 JAVA实现

    bm25 是一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法. 它的出现主要是解决TF-IDF算法中 TF的影响可无限增大的不足,本质上 BM25是基于TF-IDF并做了改 ...

  3. bm25算法Java代码_BM25算法在Lucene中的应用

    Lucene是apache软件基金会jakarta项目组的一个子项目,是一个用Java写的全文检索引擎工具包,可以方便的集成到系统中提以提供高效的检索能力,Lucene核心功能分为建索和检索两部分.而 ...

  4. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

  5. ML之SVM:基于SVM(支持向量机)之SVC算法对手写数字图片识别进行预测

    ML之SVM:基于SVM(支持向量机)之SVC算法对手写数字图片识别进行预测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 X_train = ss.fit_transform(X ...

  6. 【Elasticsearch】实用BM25 -第2部分:BM25算法及其变量

    1.概述 转载:https://www.elastic.co/cn/blog/practical-bm25-part-2-the-bm25-algorithm-and-its-variables 这是 ...

  7. 文本相似度-bm25算法原理及实现

    原理 BM25算法,通常用来作搜索相关性平分.一句话概况其主要思想:对Query进行语素解析,生成语素qi:然后,对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后,将qi相对于D的相关性得分 ...

  8. 经典检索算法:BM25算法

    bm25 是什么? bm25 是一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法,再用简单的话来描述下bm25算法:我们有一个query和一批文档Ds,现在要计算query ...

  9. 文本相似度bm25算法的原理以及Python实现(jupyter notebook)

    今天我们一起来学习一下自然语言处理中的bm25算法,bm25算法是常见的用来计算query和文章相关度的相似度的.其实这个算法的原理很简单,就是将需要计算的query分词成w1,w2,-,wn,然后求 ...

最新文章

  1. 微信小程序开发2——数据绑定、控制属性
  2. 每个程序员都必须遵守的编程原则
  3. 详解CUDA核函数及运行时参数
  4. 对特朗普获胜感到意外? 那你是被社交媒体迷惑了
  5. 老男孩教育每日一题-2017-04-25:怎样产生一个子shell?
  6. Delphi Access Violation错误的分析
  7. echarts 通过ajax实现动态数据加载
  8. 用 CrossOver 安装的 Windows 软件在哪
  9. 【跃迁之路】【586天】程序员高效学习方法论探索系列(实验阶段343-2018.09.14)...
  10. linux 字符驱动 tty,打通linux的tty驱动的数据链路
  11. JAR包的JDK版本查看与设置
  12. swfobject 2.0 使用
  13. ansys workbench 材料参数的定义
  14. 一文搞懂CAN和CAN FD总线协议
  15. python 三角形雷达图,python 画雷达图
  16. Go语言学习日记【十八】golang中context包简介与使用
  17. 【数据统计】— 峰度、偏度、点估计、区间估计、矩估计、最小二乘估计
  18. LwIP 协议栈移植教程
  19. 西安交通大学轴承公共数据集(文末附数据)
  20. 3300万IOPS、39微秒延迟、碳足迹认证,谁在认真搞事情?

热门文章

  1. Qt 添加第三方字体库
  2. 想到我爱你的绝对不正常
  3. 算例在线帮 | 某型无厚度翅片水冷板散热的Fluent仿真分析
  4. python安装hydra
  5. cad相对坐标快捷键_CAD中相对坐标绝对坐标的输入方法
  6. 原来小米手机这么好用,这4大功能,各个都是黑科技,厉害了
  7. GPS坐标间距离计算
  8. 从实例来看DAO:权力分散的伟大尝试
  9. 【论文精读】Parallax-Tolerant Image Stitching Based on Robust Elastic Warping
  10. 2020最新版前端学习路线图--让前端学习变得美如画