BM25

计算用户输入query和语料库中每条语句之间的相似度分数。

我参考了gensim中的源码,实现的挺简单的,还是包括tf和idf两部分,

tf:单词在文档中出现的频率

idf:idf = log_2(\frac{D-df+0.5}{df+0.5}),其中D是整个语料库中包含多少篇文档,df是语料库中有多少个文档包含了某个单词,0.5是用来做平滑的。现在忽略0.5,分子分母约分,就变成了log_2(\frac{D}{df}-1)。如果语料库中一半的文档都包括某个词,那这个词的idf=0,如果语料库中超过一半的文档都包括某个词,那么这个词的idf<0,这时候就用eps代替,eps是一个比较小的值,是平均每个词的idf×EPSILON,gensim里面EPSILON是0.25.

最后:sum {(idf*tf*常数)/(tf+常数*(1-常数+常数*(这篇文档的长度/语料库中文档的平均长度)))}

BM25会遍历query中的每个词,计算每个词和语料库中句子的相似程度,计算方式就是上面那个。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
## 算法原理与程序使用 BM25算法原理参见我的博文:[【NLP】非监督文本匹配算法——BM25] 测试程序: ```python bm25 = BM25() result = bm25.cal_similarity("自然语言处理并不是一般地研究自然语言") for line, score in result: print(line, score) ``` 测试结果如下: ```python 自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。 1.012567843290477 它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 2.0911221271793545 自然语言处理是一门融语言学、计算机科学、数学于一体的科学。 1.012567843290477 因此,这一领域的研究将涉及自然语言,即人们日常使用的语言, 2.2068046420905443 所以它与语言学的研究有着密切的联系,但又有重要的区别。 1.4616618736274032 自然语言处理并不是一般地研究自然语言, 3.2072055608059036 而在于研制能有效地实现自然语言通信的计算机系统, 1.201522188129132 特别是其中的软件系统。因而它是计算机科学的一部分。 0 在信息搜索中,我们做的第一步就是检索。 0 再延展一下,搜索这项功能在我们生活中也是太多太多。 0 大众一点就是搜索引擎,商品搜索等,在问题系统中可以匹配相似的问题,然后返回对应答案等。 0 文本匹配包括监督学习方法以及非监督学习方法。 0 或者分为传统方法和深度学习方法。 0 BM25 在 20 世纪 70 年代到 80 年代被提出,到目前为止已经过去二三十年了,但是这个算法依然在很多信息检索的任务中表现优异,是很多工程师首选的算法之一。 0 有时候全称是 Okapi BM25,这里的“BM”是“最佳匹配”(Best Match)的简称。 0 那么,当通过使用不同的语素分析方法,语素权重判定方法以及语素与文档的相关性判定方法,可以衍生很多不同的搜索相关性计算方法,灵活性也比较大。 0 ``` -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
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、付费专栏及课程。

余额充值