目录
概述
OmniEvent是一个强大的开源事件抽取工具包,包括事件检测和事件论元抽取。我们全面涵盖了各种范式,并在广泛使用的英语和中文数据集上提供公平和统一的评估。模块化实现使OmniEvent具有高度的可扩展性。
亮点
-
全面的能力
-
统一的基准和评估
-
模块化实现
- 所有模型都分解为四个模块:
- 输入工程:准备输入并支持各种输入工程方法,如提示。
- 主干网络:将文本编码为隐藏状态。
- 聚合:融合隐藏状态(如选择[CLS]、池化、GCN)到最终事件表示。
- 输出头:将事件表示映射到最终输出,如线性层、CRF、MRC头等。
- 您可以组合和重新实现不同的模块来设计和实现自己的新模型。
- 所有模型都分解为四个模块:
-
大模型训练与推理
- 支持使用BMTrain进行大型事件抽取模型的高效训练和推理。
-
易于使用且高度可扩展
- 可以通过单个命令下载和处理开放数据集。
- 完全兼容🤗 Transformers及其Trainer。
- 用户可以轻松复现现有模型并使用OmniEvent构建自定义模型。
安装
使用pip
该存储库在Python 3.9+和Pytorch 1.12.1+上进行了测试。可以使用pip按如下方式安装OmniEvent:
pip install OmniEvent
从源代码安装
如果您想从本地源代码安装存储库,可以按如下方式安装:
pip install .
如果您想编辑存储库,可以使用:
pip install -e .
快速开始
OmniEvent为用户提供了几个现成的模型。以下是示例。
确保您已按上述说明安装了OmniEvent。请注意,首次下载检查点可能需要几分钟。
>>> from OmniEvent.infer import infer
>>> # 事件抽取(EE)任务
>>> text = "2022年北京市举办了冬奥会"
>>> results = infer(text=text, task="EE")
>>> print(results[0]["events"])
[
{
"type": "组织行为开幕", "trigger": "举办", "offset": [8, 10],
"arguments": [
{ "mention": "2022年", "offset": [9, 16], "role": "时间"},
{ "mention": "北京市", "offset": [81, 89], "role": "地点"},
{ "mention": "冬奥会", "offset": [0, 4], "role": "活动名称"},
]
}
]
>>> text = "U.S. and British troops were moving on the strategic southern port city of Basra \
Saturday after a massive aerial assault pounded Baghdad at dawn"
>>> # 事件检测(ED)任务
>>> results = infer(text=text, task="ED")
>>> print(results[0]["events"])
[
{ "type": "attack", "trigger": "assault", "offset": [113, 120]},
{ "type": "injure", "trigger": "pounded", "offset": [121, 128]}
]
```python
>>> # 事件论元提取(EAE)任务
>>> results = infer(text=text, triggers=[("assault", 113, 120), ("pounded", 121, 128)], task="EAE")
>>> print(results[0]["events"])
[
{
"type": "attack", "trigger": "assault", "offset": [113, 120],
"arguments": [
{ "mention": "U.S.", "offset": [0, 4], "role": "attacker"},
{ "mention": "British", "offset": [9, 16], "role": "attacker"},
{ "mention": "Saturday", "offset": [81, 89], "role": "time"}
]
},
{
"type": "injure", "trigger": "pounded", "offset": [121, 128],
"arguments": [
{ "mention": "U.S.", "offset": [0, 4], "role": "attacker"},
{ "mention": "Saturday", "offset": [81, 89], "role": "time"},
{ "mention": "British", "offset": [9, 16], "role": "attacker"}
]
}
]
使用OmniEvent训练您自己的模型
OmniEvent可以帮助用户轻松地在特定数据集上训练和评估自定义模型。
我们展示了一个使用OmniEvent在ACE-EN数据集上训练和评估事件检测模型的步骤示例,采用Seq2Seq范式。 更多示例请参见examples。
步骤1: 将数据集处理为统一格式
我们为几个常用数据集提供了标准的数据处理脚本。详细信息请查看scripts/data_processing。
dataset=ace2005-en # 数据集名称
cd scripts/data_processing/$dataset
bash run.sh
步骤2: 设置自定义配置
我们通过单个*.yaml
文件跟踪数据集、模型和训练参数的配置。详细信息请参见./configs。
>>> from OmniEvent.arguments import DataArguments, ModelArguments, TrainingArguments, ArgumentParser
>>> from OmniEvent.input_engineering.seq2seq_processor import type_start, type_end
>>> parser = ArgumentParser((ModelArguments, DataArguments, TrainingArguments))
>>> model_args, data_args, training_args = parser.parse_yaml_file(yaml_file="config/all-datasets/ed/s2s/ace-en.yaml")
>>> training_args.output_dir = 'output/ACE2005-EN/ED/seq2seq/t5-base/'
>>> data_args.markers = ["<event>", "</event>", type_start, type_end]
步骤3: 初始化模型和分词器
OmniEvent支持各种backbone。用户可以在配置文件中指定模型和分词器,并按如下方式初始化它们。
>>> from OmniEvent.backbone.backbone import get_backbone
>>> from OmniEvent.model.model import get_model
>>> backbone, tokenizer, config = get_backbone(model_type=model_args.model_type,
model_name_or_path=model_args.model_name_or_path,
tokenizer_name=model_args.model_name_or_path,
markers=data_args.markers,
new_tokens=data_args.markers)
>>> model = get_model(model_args, backbone)
步骤4: 初始化数据集和评估指标
OmniEvent为不同任务和范式准备了DataProcessor
和相应的评估指标。
注意这里的指标是特定范式的,不用于最终的统一评估。
>>> from OmniEvent.input_engineering.seq2seq_processor import EDSeq2SeqProcessor
>>> from OmniEvent.evaluation.metric import compute_seq_F1
>>> train_dataset = EDSeq2SeqProcessor(data_args, tokenizer, data_args.train_file)
>>> eval_dataset = EDSeq2SeqProcessor(data_args, tokenizer, data_args.validation_file)
>>> metric_fn = compute_seq_F1
步骤5: 定义Trainer并训练
OmniEvent采用🤗 Transformers中的Trainer进行训练和评估。
>>> from OmniEvent.trainer_seq2seq import Seq2SeqTrainer
>>> trainer = Seq2SeqTrainer(
args=training_args,
model=model,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
compute_metrics=metric_fn,
data_collator=train_dataset.collate_fn,
tokenizer=tokenizer,
)
>>> trainer.train()
步骤6: 统一评估
由于步骤4中的指标取决于范式,直接比较不同范式模型的性能是不公平的。
OmniEvent以统一的方式评估不同范式的模型,将不同模型的预测转换为同一候选集上的预测,然后进行评估。
>>> from OmniEvent.evaluation.utils import predict, get_pred_s2s
>>> from OmniEvent.evaluation.convert_format import get_trigger_detection_s2s
>>> logits, labels, metrics, test_dataset = predict(trainer=trainer, tokenizer=tokenizer, data_class=EDSeq2SeqProcessor,
data_args=data_args, data_file=data_args.test_file,
training_args=training_args)
>>> # 特定范式的指标
>>> print("{} test performance before converting: {}".formate(test_dataset.dataset_name, metrics["test_micro_f1"]))
ACE2005-EN test performance before converting: 66.4215686224377
>>> preds = get_pred_s2s(logits, tokenizer)
>>> # 转换为统一预测并评估
>>> pred_labels = get_trigger_detection_s2s(preds, labels, data_args.test_file, data_args, None)
ACE2005-EN test performance after converting: 67.41016109045849
对于那些测试集注释未公开的数据集,如MAVEN和LEVEN,OmniEvent提供了生成提交文件的脚本。详细信息请参见dump_result.py。
支持的数据集和模型和竞赛
持续更新中。欢迎添加更多!
数据集
模型
- 范式
- 标记分类 (TC)
- 序列标注 (SL)
- 序列到序列 (Seq2Seq)
- 机器阅读理解 (MRC)
- 主干网络
- CNN / LSTM
- Transformers (BERT, T5等)
- 聚合
- 选择 [CLS]
- 动态/最大池化
- 标记
- GCN
- 头部
- 线性 / CRF / MRC头
一致性评估
OmniEvent为事件抽取评估中的三个差异提供了相应的解决方案,正如我们在ACL 2023的论文中所建议的。
1. 一致的数据预处理
我们在scripts/data_processing
中提供了几个预处理脚本。对于ACE 2005,我们提供了三个主流脚本:ace2005-dygie
、ace2005-oneie
和ace2005-en
。用户可以轻松使用这些脚本将原始数据处理成统一的数据格式。
2. 输出标准化
我们在OmniEvent/evaluation/convert_format.py
中实现了输出标准化。具体来说,用户可以使用相应的函数将不同范式的输出转换为标记分类方法的输出空间。
3. 流水线评估
如OmniEvent/evaluation/README.md
中所建议,我们为评估事件论元抽取提供了几种评估模式。我们推荐使用严格模式进行可比较的评估。我们还为不同的事件论元抽取方法的流水线评估提供了统一的抽取触发词集。这些触发词是由一个先进的ED模型CLEVE抽取的。不同数据集(ACE 2005、RichERE和TACKBP 2014-2017)的抽取触发词放在这里。
实验
我们使用OmniEvent在一些流行的基准数据集上实现并评估了最先进的方法,结果展示在我们的ACL 2023论文"魔鬼在细节中:事件抽取评估的陷阱"中。
引用
如果我们的代码对您有帮助,请引用我们:
@inproceedings{peng2023devil,
title={The Devil is in the Details: On the Pitfalls of Event Extraction Evaluation},
author={Peng, Hao and Wang, Xiaozhi and Yao, Feng and Zeng, Kaisheng and Hou, Lei and Li, Juanzi and Liu, Zhiyuan and Shen, Weixing},
booktitle={Findings of ACL 2023},
year={2023}
}