语义角色标签的编码器模型
该存储库包含:
- 论文:翻译和标签!用于语义角色标签的编码器解码器方法(EMNLP 2019介绍)
- 作者:Angel Daza,Anette Frank
该代码在Allennlp工具包上运行。
要求
- Python 3.6
- Pytorch 1.0
- Allennlp 0.8.2
- Flair 0.4.3(用于谓词预测)
入门
设置环境
- 使用Anaconda创建
SRL-S2S环境
conda create -n SRL-S2S python=3.6
- 激活环境
source activate SRL-S2S
- 在环境中安装要求:
安装Pytorch 1.0(建议使用CUDA 8的GPU版本):
conda install pytorch torchvision cuda80 -c pytorch
安装进一步的依赖…
bash scripts/install_requirements.sh
注意:在Mac OS X 10.14 [Mojave]上安装AllennLP时,有一些报告的问题(尤其是JSONNET模块错误)。如果安装失败,请运行以下命令:
xcode-select --install
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
然后再次运行install_requirlements脚本。如果问题持续存在,请尝试以下解决方法之一:
Allenai/Allennlp#1938
Google/jsonnet#573
简短教程
我们以玩具示例显示:
- 我们的模型可以阅读的预处理和构建数据集
- 训练模型
- 使用训练有素的模型预测新输出
预处理
所有模型都需要JSON文件作为输入。在pre-processing文件夹中,我们包括脚本CoNLL_to_JSON.py ,以按照conll-U数据格式将文件转换为合适的输入JSON数据集。
也可以使用Text_to_JSON.py脚本将任何文本文件转换为我们的JSON格式(包括并行机器翻译文件)。
最简单的情况是将conll文件转换为json,其中源序列是句子(仅词),而目标序列是标记的句子。构建一个单语数据集以进行培训:
python pre_processing/CoNLL_to_JSON.py \\
--source_file datasets/raw/CoNLL2009-ST-English-trial.txt \\
--output_file datasets/json/EN_conll09_trial.json \\
--dataset_type mono \\
--src_lang \"<EN>\" \\
--token_type CoNLL09
JSON文件中的每一行EN_conll09_trial.json看起来像这样:
{
\"seq_words\": [\"The\", \"economy\", \"\'s\", \"temperature\", \"will\", \"be\", \"taken\", \"from\", \"several\", \"vantage\", \"points\", \"this\", \"week\", \",\", \"with\", \"readings\", \"on\", \"trade\", \",\", \"output\", \",\", \"housing\", \"and\", \"inflation\", \".\"],
\"BIO\": [\"O\", \"O\", \"O\", \"B-A1\", \"B-AM-MOD\", \"O\", \"B-V\", \"B-A2\", \"O\", \"O\", \"O\", \"O\", \"B-AM-TMP\", \"O\", \"B-AM-ADV\", \"O\", \"O\", \"O\", \"O\", \"O\", \"O\", \"O\", \"O\", \"O\", \"O\"],
\"pred_sense\": [6, \"taken\", \"take.01\", \"VBN\"],
\"seq_tag_tokens\": [\"The\", \"economy\", \"\'s\", \"(#\", \"temperature\", \"A1)\", \"(#\", \"will\", \"AM-MOD)\", \"be\", \"(#\", \"taken\", \"V)\", \"(#\", \"from\", \"A2)\", \"several\", \"vantage\", \"points\", \"this\", \"(#\", \"week\", \"AM-TMP)\", \",\", \"(#\", \"with\", \"AM-ADV)\", \"readings\", \"on\", \"trade\", \",\", \"output\", \",\", \"housing\", \"and\", \"inflation\", \".\"],
\"src_lang\": \"<EN>\",
\"tgt_lang\": \"<EN-SRL>\",
\"seq_marked\": [\"The\", \"economy\", \"\'s\", \"temperature\", \"will\", \"be\", \"<PRED>\", \"taken\", \"from\", \"several\", \"vantage\", \"points\", \"this\", \"week\", \",\", \"with\", \"readings\", \"on\", \"trade\", \",\", \"output\", \",\", \"housing\", \"and\", \"inflation\", \".\"]
}
要构建一个跨语言数据集(例如,在目标侧的英语句子作为源和德语标记的序列)运行:
python pre_processing/CoNLL_to_JSON.py \\
--source_file datasets/raw/CrossLang_ENDE_EN_trial.txt \\
--target_file datasets/raw/CrossLang_ENDE_DE_trial.conll09 \\
--output_file datasets/json/En2DeSRL.json \\
--dataset_type cross \\
--src_lang \"<EN>\" \\
--tgt_lang \"<DE-SRL>\"
JSON文件En2DeSRL.json中的每一行都会像这样:
{
\"seq_words\": [\"We\", \"need\", \"to\", \"take\", \"this\", \"responsibility\", \"seriously\", \".\"],
\"BIO\": [\"O\", \"B-V\", \"O\", \"O\", \"O\", \"O\", \"O\", \"O\"],
\"pred_sense_origin\": [1, \"need\", \"need.01\", \"V\"],
\"pred_sense\": [1, \"m\\u00fcssen\", \"need.01\", \"VMFIN\"],
\"seq_tag_tokens\": [\"(#\", \"Wir\", \"A0)\", \"(#\", \"m\\u00fcssen\", \"V)\", \"diese\", \"Verantwortung\", \"ernst\", \"nehmen\", \".\"],
\"src_lang\": \"<EN>\",
\"tgt_lang\": \"<DE-SRL>\"
}
最后,要创建一个并行MT数据的JSON数据集文件(例如,具有英语 – 及格翻译的Europarl文件)可以运行:
python pre_processing/Text_to_JSON.py --path datasets/raw/ \\
--source_file mini_europarl-v7.de-en.en \\
--target_file mini_europarl-v7.de-en.de \\
--output datasets/json/MiniEuroparl.en_to_de.json \\
--src_key \"<EN>\" --tgt_key \"<DE>\"
脚本pre-processing/make_all_trial.py嵌入所有预处理选项和可用数据集类型。
训练模型
- 模型配置可在
training_config文件夹和子文件夹中找到。请注意,在此配置文件中,可以操纵模型超参数,并指向所需的数据集。 - 要训练模型,请选择一个实验配置文件(例如
training_config/test/en_copynet-srl-conll09.json),然后在主目录中运行以下命令:
allennlp train training_config/test/en_copynet-srl-conll09.json -s saved_models/example-srl-en/ --include-package src
- 结果和培训信息将存储在
saved_models/example-srl-en目录中。 - 注意:
training_config内部包含用于纸的实验的模型超参数,应以相同的方式进行培训。
使用训练有素的模型
将txt文件转换为json
在推理时,只需要提供一个file.txt ,每行一个句子。这样,我们可以使用天赋来预测句子内部的谓词,然后使用我们的模型来预测每个谓词的SRL标签。
首先,我们需要将输入转换为JSON格式并给出所需的目标语言(例如,如果我们想要标记为德语,我们应该指示tgt_key as):
python pre_processing/Text_to_JSON.py --source_file datasets/raw/mini_europarl-v7.de-en.en \\
--output datasets/test/MiniEuroparl.PREDICT.json \\
--src_key \"<EN>\" --tgt_key \"<DE-SRL>\" \\
--predict_frames True \\
--sense_dict datasets/aux/En_De_TopSenses.tsv
得到预测
使用训练有素的模型进行预测(使用开发集中最佳BLEU得分的检查点)运行:
allennlp predict saved_models/example-srl-en/model.tar.gz datasets/test/MiniEuroparl.PREDICT.json \\
--output-file saved_models/example-srl-en/output_trial.json \\
--include-package src \\
--predictor seq2seq-srl
其中EN_conll09_trial_to_predict.json包含要预测的源序列。
请注意,提供这些文件只是为了提供工作流程的示例,因此使用这些设置的预测将是随机的!
再现结果
为了重现本文中的结果,有必要拥有CONLL-2005和CONLL-2009共享任务数据集的许可证:
- CONLL-2005共享任务,这是Penn Treebank数据集的一部分
- CONLL-2009共享任务:第1部分和第2部分是LDC目录的一部分
在这里,需要公开提供法语的SRL数据(需要注册)。
使用的机器翻译公司是:
- Europarl(英语 – 德国)
- 联合国(英语法国)
向我们的培训的跨语言SRL数据要求:
为多语种语义角色标签生成高质量的命题银行(Akbik等,2015)。
我们在此存储库的training_config文件夹中包括了每个实验设置(单语,多语言和跨语义)的配置文件。他们必须以与上一个教程相似的方式运行。
