基于transformers的端到端指代消解pytorch实现,模型架构及tensorflow实现参考bert-coref
程序需要超过16G的内存/显存,训练时可通过修改 config.py 中的 max_training_sentences 等配置降低显存使用
ln -si ./data/list/train_chinese_list ./data/train_list
python onf_to_data.py
将数据根据需要分割成 train.json/test.json/val.json
三个json文件的格式为:每行代表一个文档,每行都是一个json对象,json对象具体内容为:(注:此处为了美观将json对象格式化为多行,在真实文件中需为1行)
{
"sentences": [["token1", "token2", ...], ...],
"clusters": [[[sloc1, eloc1], [sloc2, eloc2], ...], ...],
"speaker_ids" [["speaker#1", ...], ...]
"sentence_map": [[0, 0, 0, ..., 3, 3, 3], ...],
"subtoken_map": [[0, 0, 1, 2, 3, ...], ...],
"genre": "文档类型",
"doc_key": "文档的名称"
}
说明:sentences中一个元素代表一个长句子,可由若干个短句子组成,使用onf_to_data.py生成的长句子长度在 max_seq_length 附近,max_seq_length 可在 config.py 文件中设置;sentences中组成长句子的若干个短句子由 tokenize 后的 token 组成;clusters 是文档中所有指代链的集合,由若干指代链组成,一个指代链由若干个mention组成,mention使用位置表示:[在文档中的token起始位置, 在文档中的token结束位置]
。
例子(注:此处为了美观将json对象格式化为多行,在真实文件中每个文档需为1行):
{
"sentences": [["打", "雷", "了", "怎", "么", "发", "短", "信", "安", "慰", "女", "朋", "友", "?", "打", "雷", "时", "还", "给", "她", "发", "?"]],
"clusters": [[[10, 12], [19, 19]]], # (女朋友, 她)
"speaker_ids": [["a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"]],
"sentence_map": [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]],
"subtoken_map": [[1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16]],
"genre": "dummy_genre",
"doc_key": "dummy_data"
}
python train.py
python evaluate.py
python predict.py
使用预设的配置训练 70000 steps,OntoNotes中文测试集 F1 值约为 0.67,英文测试F1 值为 0.73。由于水平有限,英文数据集上与论文效果差距 0.01。
如有错误和建议,欢迎指正和说明。 欢迎 star 和 fork 本项目。