机器阅读理解很有可能成为人机问答中的主力技术,目前FAQ大多使用的是语义匹配模型,该模型需要进行很多的人工标注,成本较高。与语义匹配模型相比,机器阅读理解可以减少人工标注的数量,降低成本。同时可以对未知问题自动寻找QA对。减少人工寻找答案的困难。

本文的机器阅读理解模型主要包含以下5个步骤:

1、根据F1-score寻找相关段落:

通过计算query和候选段落的F1-score的匹配程度。在一篇文档中找出最相关的三个段落。

2、根据F1-score寻找答案模块:

根据F1-score在最相关的三个段落中寻找F1-score最大的答案,作为fake_answer。供下一步模型进行训练。

3、特征预计算模块:

加载bert模型和词典,将query和候选段落,通过词典转换为[cls]query[sep]候选段落[sep]的格式,供下一步输入到模型中。

4、深度模型训练模块:

使用bert模型在阅读理解任务上,进行训练,池化层后接一个线性模型,预测答案的起始位置,和结束位置,使用交叉熵作为损失函数。

5、答案生成模块:

使用上一步预测出来的起始位置和结束位置的概率,根据当前候选段落,找到概率最大位置对应的文字片段,截取作为答案。

(1)、根据F1-score寻找相关段落:

该模块,主要包含6个方法,find_fake_answer,find_best_question_match,matrix_max_over_ground_truth,f1_score,recall,presicion_recall_f1.寻找fake_answer作为要预测的答案,供下一步进行训练.

计算两段文本的精确率,召回率和f1.

精确率:两段文本相同的部分,占预测文本的百分比.

召回率:两段文本相同的部分,占原始文本的百分比.

F1: (2*精确率*召回率)/(精确率+召回率)

find_fake_answer: 输入参数,sample,即dureader格式的问题和文章合集。

                              在候选段落种寻找和问题的f1值最高的作为fake_answer。

find_best_question_match: 输入参数doc,dureader格式的问题和文章集合

                                            输入参数question, string 格式用户问的问题

                                            在候选段落中找到和问题最相关的段落。

maxtrix_max_over_ground_truth:输入。metric_fn:  数据类型 函数句柄

                                                                prediction: 数据类型。string段落文本。

                                                                ground_truths: 数据类型  string用户问的问题。

f1_score: prediction 数据类型。string段落文本

                ground_truths 数据类型  string用户问的问题

recall:   param prediction:数据类型 string段落文本

             param ground_truths: 数据类型 string 用户问的问题

(2) 根据F1-score寻找答案模块:

根据F1-score在最相关的三个段落中寻找F1-score最大的答案,作为fake_answer。供下一步模型进行训练。

包含了三个方法,compute_paragraph_score, dup_remove , paragraph_selection 用例计算候选段落和问题的F1-score . 去除段落中的重复内容,并且增加paragraphs字段 , 将和问题最相关的 (F1-score 最高的)前5个段落 通过“.”句号拼接在一起,成为一个字符串. 供下一步深度模型进行训练.

compute_paragraph_socre: 输入param sample:数据类型 dureader格式的问题和文章集合

                                             步骤:根据F1-score寻找相关段落模块

dup_remove:  输入: param doc: 数据类型 dureader格式的问题和文章集合

                       输出: 是否有文本片段被删除

                       步骤:去除段落中的重复内容

paragraph_selection:

                       输入: param sample : 数据类型 dureader 格式的问题和文章集合

                       输出: 增加paragraphs 字段,将和问题最相关的(F1-score最高的) 前5个段落,通过“.”                                     句号拼接在一起,成为一个字符串.

(3) 特征预计算模块:

加载bert模型和词典,将query和候选段落,通过词典转换为[cls]query[sep]候选段落[sep]的格式,供下一步输入到模型中。

该模块包含了两个方法,convert_examples_to_features, read_squad_examples

读取dureader 格式的训练和验证数据, 对于每一个用户问题, 找到最相关文档的,最相关段落的fake_answer, 当F1-score 大于0.8的时候,将这条问题和fake_answer 作为训练数据.

加载预训练的bert模型和词典,将上面读取好的文本和答案,还有最相关的段落通过词典,转变为[cls]query[sep]候选段落[sep]的格式.

convert_examples_to_features:

输入

param examples :数据类型 dureader格式的问题和文章集合.

param tokenizer: 数据类型 bert 预训练模型提供的词典

param max_seq_length : 数据类型 段落的最大长度

param max_query_length: 数据类型 问题的最大长度

输出:

文本和段落的编码,文本和段落的位置编码,答案在段落中的开始位置和结束位置.

read_squad_examples

输入:

param zhidao_input_file 数据类型  string dureader 格式的问题和文章集合

param search_imput_file 数据类型 string dureader 格式的问题和文章集合

param is_training : 数据类型 boolean 是否是训练过程

输出:问题id, 问题的文本,问题的类型,段落文本,答案开始位置,答案结束位置

train: 训练模块,加载预训练bert,准备优化器,准备数据,计算loss, 更新梯度, 在验证集上进行验证,将模型保存到model_dir 文件夹下

训练完后到结果如下所示:

bert 阅读理解的信息抽取 bert机器阅读理解_bert 阅读理解的信息抽取

最后附上链接地址:

🔗 https://github.com/weizhenzhao/bert-mrc-server.git

bert 阅读理解的信息抽取 bert机器阅读理解_bert_02

https://github.com/weizhenzhao/bert-mrc-server.git