EasyNLP带你实现中英文机器阅读理解( 四 )


下列文件为已经完成预处理的中英文机器阅读理解的训练和验证数据,可用于模型训练与测试:
# 中文机器阅读理解数据http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/train_cmrc2018.tsvhttp://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/dev_cmrc2018.tsv# 英文机器阅读理解数据http://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/train_squad.tsvhttp://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/machine_reading_comprehension/dev_squad.tsv
中文机器阅读理解
在 3.6环境下,我们首先从刚刚安装好的中引入模型运行需要的各种库,并做初始化 。我们只需指定 =hfl/-base-zh,即可使用集成好的模型 。中集成了丰富的预训练模型库,如果想尝试其他预训练模型,如BERT、等,也可以在ers中进行相应修改,具体的模型名称可见模型列表 。当前同时支持中英文的阅读理解,只需要在ers中指定=zh,即可指定中文文本预处理的相应配置 。
import torch.cudafrom easynlp.appzoo import MachineReadingComprehensionDatasetfrom easynlp.appzoo import get_application_predictor, get_application_model, get_application_evaluator, get_application_model_for_evaluationfrom easynlp.core import Trainer, PredictorManagerfrom easynlp.utils import initialize_easynlp, get_args, get_pretrain_model_pathfrom easynlp.utils.global_vars import parse_user_defined_parametersinitialize_easynlp()args = get_args()user_defined_parameters = parse_user_defined_parameters('pretrain_model_name_or_path=bert-base-uncased language=en qas_id=qas_id answer_name=answer_text start_position_name=start_position_character max_query_length=64 max_answer_length=30 doc_stride=128 n_best_size=10 output_answer_file=dev.ans.csv')
载入数据时,可以使用内置的 。需要注意的是,由于描述文本可能过长,从而可能导致答案片段在超出后被截断的部分中 。因此机器阅读理解中通常采用“滑窗法”,当描述文本过长时,使用滑动窗口将完整的描述文本拆成几段,将一个输入case拆成多个case分别处理 。使用ers中的参数即可控制滑动窗口大小 。
train_dataset = MachineReadingComprehensionDataset(pretrained_model_name_or_path=get_pretrain_model_path("bert-base-uncased"),data_file="train_squad.tsv",sequence_length=384,input_schema="qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1",first_sequence="question_text",second_sequence="context_text",user_defined_parameters=user_defined_parameters,is_training=True)
模型训练时,使用中封装好的l函数,并指定=“”,便可进行训练时的模型构建 。由于滑动窗口机制的存在,训练时设置不宜过大,否则容易引起OOM 。
model = get_application_model(app_name="machine_reading_comprehension",pretrained_model_name_or_path=get_pretrain_model_path("bert-base-uncased"),user_defined_parameters=user_defined_parameters)
模型评估与预测时,我们同样可以使用中封装好的和ictor函数,并分别指定=“”,即可进行模型的评估与预测 。
evaluator = get_application_evaluator(app_name="machine_reading_comprehension", valid_dataset=valid_dataset,eval_batch_size=32, user_defined_parameters=user_defined_parameters)
模型预测时,结果将输出至指定文件中,文件格式可以定制,一般分为\t分隔的4列,依次为:样例ID、答案文本、问句、篇章文本 。除了输出的最佳答案之外,模型还会将后排在top_n的答案结果,也输出到指定文件中,供模型优化时分析比对 。通过ers中的参数,即可定制top_n值 。
predictor = get_application_predictor(app_name="machine_reading_comprehension",model_dir="./squad_model_dir/", first_sequence="question_text",second_sequence="context_text",sequence_length=384,output_file="dev.pred.csv",user_defined_parameters=user_defined_parameters)predictor_manager = PredictorManager(predictor=predictor,input_file="dev_squad.tsv",input_schema="qas_id:str:1,context_text:str:1,question_text:str:1,answer_text:str:1,start_position_character:str:1,title:str:1",output_file="dev.pred.csv",output_schema="unique_id,best_answer,query,context",append_cols=args.append_cols,batch_size=1024)