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

一、建立FAQ库

一个问题三个形式,

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

二、BM25初始化

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

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

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

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

4、self.idf len =28387 eg:{"什么":0.7952192784285401,"是":0.7464831376894789,"发票":3.3970008374344935}

5、self.D = 424043,self.b=0.75 ,self.k1=1.5 (人为设定一般值)

        for seg_title in self.segTitles:
            tmp = {}
            for word in seg_title:
                if not word in tmp:
                    tmp[word] = 0
                tmp[word] += 1
            self.f.append(tmp)
            for k, v in tmp.items():
                if k not in self.df:
                    self.df[k] = 0
                self.df[k] += 1
        for k, v in self.df.items():
            self.idf[k] = math.log(self.D - v + 0.5) - math.log(v + 0.5)

6、建立倒排索引表self.inverted_word_dic 字典键为词,值为文档索引。

{"什么":{0,1,55,63,67...}表示“什么”这个词在424043个文档中的第0、1、55、63、67个文档中出现过。

三、当问句输入时

input_sentence = '能不能私自印制发票来报销?'

1、分词seg_query = ['能', '不能', '私自', '印制', '制发', '发票', '来', '报销', '', '']

2、倒排索引,对分词结果在倒排索引的字典self.inverted_word_dic中去找文档,然后统计文档数目并排序取前十个文档。

3、分别计算input_sentence与2中的十个句子BM25的相似值和BERT相似度模型得到的得分,得到10个得分后排序取第一的文档索引;

4、按照文档索引,如input_sentence得分最高的相思句子id为345923,先令345923/1000取整为345,即答案在answer345.txt中,然后345923%1000,即取余得到923,也就是答案所对用索引,得到回答,完成任务。

四、BERT相似度模型训练

参考https://blog.csdn.net/weixin_37947156/article/details/84877254

用自己的训练集训练出相似度模型。

 

 

你可能感兴趣的:(学习笔记)