资源 【Demo】基于LaserTagger的中文文本数据增强
文本复述——基于LaserTagger的中文文本数据增强 一.概述 文本复述任务是指把一句/段文本A改写成文本B,要求文本B采用与文本A略有差异的表述方式来表达与之意思相近的文本。 改进谷歌的LaserTagger模型,使用LCQMC等中文语料训练文本复述模型,即修改一段文本并保持原有语义。 复述的结果可用于数据增强,文本泛化,从而增加特定场景的语料规模,提高模型泛化能力。 二.模型介绍 谷歌在文献《Encode, Tag, Realize: High-Precision Text Editing》中采用序列标注的框架进行文本编辑,在文本拆分和自动摘要任务上取得了最佳效果。 在同样采用BERT作为编码器的条件下,本方法相比于Seq2Seq的方法具有更高的可靠度,更快的训练和推理效率,且在语料规模较小的情况下优势更明显。 谷歌公开了本文献对应的代码,但是原有任务与当前任务有一定的差异性,需要修改部分代码,主要修改如下: A.分词方式:原代码针对英文,以空格为间隔分成若干词。现在针对中文,分成若干字。 B.推理效率:原代码每次只对一个文本进行复述,改成每次对batch_size个文本进行复述,推理效率提高6倍。 三.文件说明和实验步骤 1.安装python模块 参见"requirements.txt", "rephrase.sh" 2.训练和评测模型 文件需求 bert预训练的tensorflow 模型 采用RoBERTa-tiny-clue(中文版)预训练模型。 网址 如果想采用其他预训练模型,请修改“configs/lasertagger_config.json". 代码跑通顺序: 第一种方法: 修改运行rephrase.sh 第二种方法详解: 第一步:制作训练测试验证集 python get_pairs_chinese/get_text_pair_lcqmc.py 获得lcqmc中的文本复述语料(语义一致的文本对,且字面表述差异不能过大,第三列为最长公共子串长度与总长度的比值) 只需要修改lcqmc的目录位置即可 python get_pairs_chinese/get_text_pair.py 可根据自己的预料获得文本复述语料(第三列为最长公共子串长度与总长度的比值) 再运行merge_split_corpus.py 将 结果数据 按比例划分 训练、测试、验证集 第二步:短语_词汇表_优化 第三步: 1、制作后续训练模型的验证集 2、制作后续训练模型的训练集 第四步: 1、训练模型 2、 模型整理 第五步 根据test文件进行预测 第六步 对第五步预测的文件进行打分。 3.启动文本复述服务 根据自己需要,可选 根据自己情况修改"rephrase_server.sh"文件中几个文件夹的路径,使用命令"sh rephrase_server.sh"可以启动一个文本复述的API服务 本API服务可以接收一个http的POST请求,解析并对其中的文本进行泛化,具体接口请看“rephrase_server/rephrase_server_flask.py" 有几个脚本文件如rephrase_for_qa.sh,rephrase_for_chat.sh,rephrase_for_skill.sh是作者自己办公需要的,可以忽略 四.实验效果 1.在公开数据集Wiki Split上复现模型: Wiki Split数据集是英文语料,训练模型将一句话拆分成两句话,并保持语义一致,语法合理,语义连贯通顺,如下图所示。 Exact score=15,SARI score=61.5,KEEP score=93,ADDITION score=32,DELETION score=59, 基本与论文中的Exact score=15.2;SARI score=61.7一致(这些分数均为越高越好)。 2.在自己构造的中文数据集训练文本复述模型: (1)语料来源 (A)一部分语料来自于LCQMC语料中的正例,即语义接近的一对文本; (B)另一部分语料来自于宝安机场用户QA下面同一答案的问题。; 因为模型的原理,要求文本A和B在具有一定的重合字数,故过滤掉上述两个来源中字面表述差异大的文本,如“我要去厕所”与“卫生间在哪里”。对语料筛选后对模型进行训练和测试。 (2)测试结果 对25918对文本进行复述和自动化评估,评测分数如下(越高越好): Exact score=29,SARI score=64,KEEP score=84,ADDITION score=39,DELETION score=66. CPU上耗时0.5小时,平均复述一句话需要0.72秒。 可能是语言和任务不同,在中文文本复述上的评测分数比公开数据集高一些。 五.一些trick 1.可以设定对于某些字或词不做修改 如对实体识别NER的语料泛化,需要保证模型不能修改其中的实体; 对业务语料泛化,也可以根据情况保证模型不能修改其中的关键字 如日期,航班号等; 目前,是通过正则的方式定位这些不能被模型修改的位置,然后将这些位置的location设置为1,具体实现参见tagging.py. 2.增加复述文本与原文本的差异度 可以对训练语料中的text_a先进行随机的swag操作,相应地脚本中enable_swap_tag改为true,再训练模型将其改写为text_b; 实际应用或测试时同样将原始文本text_a先进行随机的swag操作,然后利用模型改写为text_b; 因为训练语料中text_a是不通顺,但text_b是通顺的,所以实际应用或测试时仍然会得到通顺的复述结果。 六.数据集 You can download LCQMC data set from https://download.csdn.net/download/tcd1112/12357994 ,But other data is the company data can't give you. You can also leave your E-mail, I will send you LCQMC data 七.文件 tree树如下: 文件框架格局如下: ├── chat_rephrase │ ├── init.py │ ├── predict_for_chat.py │ └── score_for_qa.txt ├── configs │ ├── lasertagger_config_base.json │ └── lasertagger_config.json ├── data │ ├── LCQMC │ │ ├── dev.txt │ │ ├── test.txt │ │ └── train.txt │ └── QQ │ └── Q_Q.txt ├── domain_rephrase │ ├── init.py │ ├── predict_for_domain.py │ └── rephrase_for_domain.sh ├── get_pairs_chinese │ ├── curLine_file.py │ ├── get_text_pair_lcqmc.py │ ├── get_text_pair.py │ ├── get_text_pair_shixi.py │ ├── get_text_pair_sv.py │ ├── init.py │ └── merge_split_corpus.py ├── official_transformer │ ├── attention_layer.py │ ├── beam_search.py │ ├── embedding_layer.py │ ├── ffn_layer.py │ ├── init.py │ ├── model_params.py │ ├── model_utils.py │ ├── README │ ├── tpu.py │ └── transformer.py ├── qa_rephrase │ ├── init.py │ └── predict_for_qa.py ├── rephrase_server │ ├── init.py │ ├── rephrase_server_flask.py │ └── test_server.py ├── skill_rephrase │ ├── init.py │ └── predict_for_skill.py ├── AR_architecture.png ├── bert_example.py ├── compute_lcs.py ├── CONTRIBUTING.md ├── curLine_file.py ├── init.py ├── LICENSE ├── output ├── phrase_vocabulary_optimization.py ├── prediction.txt ├── predict_main.py ├── predicts.py ├── predict_utils.py ├── preprocess_main.py ├── README.md ├── rephrase.sh ├── requirements.txt ├── run_lasertagger.py ├── run_lasertagger_utils.py ├── sari_hook.py ├── score_lib.py ├── score_main.py ├── sentence_fusion_task.png ├── tagging_converter.py ├── tagging.py ├── transformer_decoder.py └── utils.py 来源https://github.com/tongchangD/text_data_enhancement_with_LaserTagger