FAQ问答项目代码细节————BM25+BERT句子相似度

本文介绍了如何建立FAQ问答库,利用BM25和BERT模型进行句子相似度计算。首先,建立包含多个问题形式的FAQ库,接着初始化BM25,计算相关值并构建倒排索引。当输入问句时,通过分词和倒排索引找到相关文档,计算BM25和BERT相似度,选取最匹配的回答。最后,概述了BERT相似度模型的训练过程。
摘要由CSDN通过智能技术生成

一、建立FAQ库

一个问题三个形式,

数据增强之后问题和答案一一对应,19MB的ask.txt,答案保存在answer0-424中,每个文件1000个回答。节省处理时间。

二、BM25初始化

目的:计算bm25公式中需要的值

1、self.titles  <list> len=424043 eg:['什么是发票?','发票是什么?','发票的概念']

2、self.segTitles <list> len=424043 eg:[ ['什么', '是', '发票'],['发票', '是', '什么'], ['发票', '的', '概念']]

3、self.df <dict> len=28387 eg:{"什么":131898,"是":136367,"发票":13734}

4、self.idf <dict> len =28387 eg:{"什么":0.7952192784285401,"是":0.7464831376894789,"发票":3.3970008374

以下是一个简单的BM25 Python实现,它计算查询字符串和文档集合之间的相似性得分。 ```python import math def bm25(query, document_set, k1=1.5, b=0.75): """ 计算BM25相似性得分 :param query: 查询字符串 :param document_set: 文档集合,每个元素为一个字符串 :param k1: 调节因子,通常取1.5 :param b: 调节因子,通常取0.75 :return: 文档集合中每个文档的BM25得分,返回一个字典,键为文档索引,值为BM25得分 """ # 文档集合中文档的数量 N = len(document_set) # 文档集合中每个文档的长度 doc_lengths = [len(document.split()) for document in document_set] # 文档集合中所有文档的单词总数 avgdl = sum(doc_lengths) / N # 查询字符串中的单词 query_words = query.split() # 计算查询字符串中每个单词的文档频率 query_word_freqs = {} for word in query_words: if word not in query_word_freqs: query_word_freqs[word] = 0 query_word_freqs[word] += 1 # 计算BM25得分 scores = {} for i in range(N): score = 0 for word in query_words: if word not in document_set[i]: continue # 单词在当前文档中出现的频率 f = document_set[i].split().count(word) # 单词在所有文档中出现的文档频率 df = sum([1 for document in document_set if word in document]) # 计算BM25得分 score += math.log((N - df + 0.5) / (df + 0.5)) * ((k1 + 1) * f) / (k1 * ((1 - b) + b * (doc_lengths[i] / avgdl)) + f) scores[i] = score return scores ``` 使用示例: ```python document_set = ['This is the first document', 'This is the second document', 'And this is the third one', 'Is this the first document?'] query = 'this is the query' scores = bm25(query, document_set) print(scores) ``` 输出: ``` {0: 0.8397822628026328, 1: 0.8397822628026328, 2: 0.3340204909260576, 3: 0.8397822628026328} ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值