数据增强之后问题和答案一一对应,19MB的ask.txt,答案保存在answer0-424中,每个文件1000个回答。节省处理时间。
1、self.titles len=424043 eg:['什么是发票?','发票是什么?','发票的概念']
2、self.segTitles len=424043 eg:[ ['什么', '是', '发票'],['发票', '是', '什么'], ['发票', '的', '概念']]
3、self.df
4、self.idf
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,也就是答案所对用索引,得到回答,完成任务。
参考https://blog.csdn.net/weixin_37947156/article/details/84877254
用自己的训练集训练出相似度模型。