WuHuRestaurant/xf_event_extraction2020Top1

您好,有三个问题想请教一下

guxungang opened this issue · 6 comments

一、运行复赛数据时,一条数据中只有一个事件,而初赛数据存在一条数据多触发词情况,我看到Role1Extractor中输出的是每个token的类别,请问在这种情况下,如何解决论元抽取中触发词和论元对应问题,即不仅预测出是否是论元,也预测出属于哪个trigger。

个人想的解决方法,想请教一下是否可行:经过触发词模型和论元模型的识别之后可以得到所有的触发词和所有的论元,遍历所有触发词和论元,拼接两者向量进行二分类训练,判断触发词与论元是否对应。

二、由于复赛只有一个事件,我看到AttributionClassifier中输出的是每条语句的类别,所以在一条语句中出现多个事件情况下,如何进行事件属性的分类。

个人想的解决方法,想请教一下是否可行:在一条语句出现多个事件情况下,根据事件的数量生成相应数量的数据,即一条数据只有一个事件,同样的语句,事件不同,然后当作不同的数据输入模型中进行训练。

三、在运行代码过程中,已经用train.py文件将四个任务的模型都训练完毕,在运行test.py文件时提示需要ckpt_dir路径中的model.pt文件,而运行train.py文件时只在out文件中生成了checkpoint文件,请问test.py文件所需要的model.pt文件如何解决。

1.本项目是一个pipeline的流程,先把trigger抽取出来后,在抽取role和attribution时候是把trigger当做一种condition。可以用两种方法解决trigger与role对应的问题:1.把trigger当做query,采用阅读理解的方式来找到trigger对应的role;2.把trigger的biaffine-logits提取出来,作为condition输入到Conditional Layer Norm(参考苏神博客)中,来抽取对应的role;你提出的方法我认为也可行,不过需要实验对照;
2.多个事件仍然可以用上述方法将与每个事件对应起来;
3.是不是你操作失误,在trainer.py文件里面的 save_model 函数会在每一个epoch结尾存储model.pt,如果正常的话不会有这个问题。

1.本项目是一个pipeline的流程,先把trigger抽取出来后,在抽取role和attribution时候是把trigger当做一种condition。可以用两种方法解决trigger与role对应的问题:1.把trigger当做query,采用阅读理解的方式来找到trigger对应的role;2.把trigger的biaffine-logits提取出来,作为condition输入到Conditional Layer Norm(参考苏神博客)中,来抽取对应的role;你提出的方法我认为也可行,不过需要实验对照;
2.多个事件仍然可以用上述方法将与每个事件对应起来;
3.是不是你操作失误,在trainer.py文件里面的 save_model 函数会在每一个epoch结尾存储model.pt,如果正常的话不会有这个问题。

您所说的两种解决方法中,第一种方法由于个人水平有限,不太理解如何采用阅读理解的方式找到trigger对应的role。

对于第二种方法,我不太明白trigger的biaffine-logitst是什么意思。
我对该方法的理解是这样的:对于pipline流程,首先进行trigger的抽取,多个trigger的情况下抽取出所有trigger;
然后根据trigger来生成接下来任务的数据(例如有2条语句,第一条语句2个trigger,第二条语句1个trigger,根据trigger的数量可以构建3条数据,其中2条数据语句内容一样,但trigger不一样,保证每条数据都只有一个trigger);
在role抽取过程中通过Condtional Layer Norm融入trigger的信息来抽取对应的role;
在attribution分类过程中,将pooling trigger窗口的logits和trigger_label_feature进行拼接,从而完成attribution分类。
role的抽取和attribution分类全都是建立在每个数据只有一个trigger的情况下进行的。

以上是我对您回答的理解,不知道是否正确,请您斧正。
另外就是该项目是否能够在初赛数据上运行,如果不能运行的话您方便分享初赛的代码让我学习一下嘛。

1.采用阅读理解的方式即把trigger当做query,原始句子当做text,拼接起来,再利用序列标注来抽取对应的role;
2.biaffine就是代码里面的那种实现方式,将trigger对应位置(首+尾)的最后一层hidden state抽取出来,拼接即为trigger的biaffine;
3.初赛代码这个也能运行,就是把trigger只能提取一个的限制解除就行,具体在src_final/utils/evaluator.py/pointer_trigger_decode 中把 one_trigger 限制关了。

1.采用阅读理解的方式即把trigger当做query,原始句子当做text,拼接起来,再利用序列标注来抽取对应的role;
2.biaffine就是代码里面的那种实现方式,将trigger对应位置(首+尾)的最后一层hidden state抽取出来,拼接即为trigger的biaffine;
3.初赛代码这个也能运行,就是把trigger只能提取一个的限制解除就行,具体在src_final/utils/evaluator.py/pointer_trigger_decode 中把 one_trigger 限制关了。

那我理解的那种方式是否可行,可行的话对效果是否有影响?就是在抽取出触发词之后,根据触发词来构建相应的数据,保证一条语句只有一个触发词,然后再进行接下来的任务

效果有没有影响你做实验啊 这种东西不做实验怎么知道有没有用。。。

效果有没有影响你做实验啊 这种东西不做实验怎么知道有没有用。。。

最近开始看的您这个项目,所以还没来得及做实验,所以只能先问问您的意见。。。,后续我会继续深入学习一下,有什么问题可能还得麻烦您,非常感谢!