/ccks-ee-subject

ccks金融事件主体抽取

Primary LanguagePython

CCKS 2020:面向金融领域的篇章级事件主体与要素抽取(一)事件主体抽取

https://www.biendata.xyz/competition/ccks_2020_4_1/leaderboard/199952/

排名:25/686

特点:

  1. 多标签实体识别
  2. 实体的类别不敏感(不管什么类型的实体都是公司)
  3. 实体类别多(29分类)
  4. 包含负样本(即标签为空的样本)

数据样例:

    "context": "而随着近日摩能国际因涉嫌传销被调查的消息被确认,也坐实了摩能国际近段时间以来的崩盘传闻",
    "type": [
    "涉嫌传销",
    "提现困难"
    ],
    "entity": [
    [
    摩能国际
    	],
    [
    摩能国际
    	]
    ]

方法一:CRF

注:抽取的实体只能有一个类别标签,数据预处理时shuffle类别(数据类别多折,结果融合)

模型:[BERT]+[Encoder]+CRF

BERT/MIDDLE Bi-LSTM IDCNN TENER R-Transformer
NEZHA ×

通过替换预训练模型下游结构Encoder提升模型的表现,问题在于不能cover多标签的特点。

最佳单模:

结构:NEZHA+Bi-LSTM+CRF

F1-score:0.76

方法二:MRC

复现论文:《A Unified MRC Framework for Named Entity Recognition》

利用MRC方法实现NER任务,通过先验问题的构造确定实体类别,可以解决多标签的问题。

该模型的不足在于存在无回答的样本,这使得模型无法完全分辨出不同问题之间的差异(Recall高,Precision低)。

最佳单模:

结构:RoBERTa+MRC

F1-score:0.70

多任务(Multi-task):

为了解决无法正确分辨类别的问题,尝试了一种多任务的方法。除了原始的主任务以外,加入了文本匹配任务,任务目标是判断样本中的问题与文本是否匹配,如不匹配则丢弃该样本中抽取到的实体。

但实验结果分数低于原始的MRC方法,即文本匹配任务反而伤害了模型。

方法三:Multi-Pointer

多层指针网络,将类别先验的表示为指针的层数,标签形状为(bs, seq_len, tag_size)。

可以解决多标签的问题,不足在于模型学习的目标会变得复杂,使得模型泛化性较差。

最佳单模:

结构:RoBERTa+Multi-Pointer

F1-score:0.77

方法四:PIPELINE

将任务视作事件抽取来做,分为两个阶段。

阶段一:事件类别

通过整段文本的表征做多标签分类任务,获得事件类别。由于事件类别的获取是独立的模型,在这个阶段可以引入负样本

阶段二:主体抽取

将得到的事件类别通过**MRC方法(方法二)**的**拼接到原样本上去,然后抽取实体。

这种方式有效的避免了方法二中的无回答样本问题,使得测试集样本更加准确。

但是pipline的方式也导致了两个问题:

  1. 第一阶段的误差累积到了第二阶段
  2. 事件类别和实体抽取之间的内在联系被割裂

最佳单模:

阶段一结构:RoBERTa+多标签分类

阶段二结构:RoBERTa+MRC

F1-score:0.75

方法五:Joint-pointer

两阶段抽取,先抽类别再抽对应实体

各方法对比

方法名 优点 缺点
CRF方法 有CRF转移矩阵约束,分词和分类信息更加准确 无法解决实体多标签和实体嵌套问题
MRC方法 先天可以解决多标签问题,通过span矩阵可以解决实体嵌套的问题 局限性太大,在多类别数据集和少样本数据集上效果欠佳
指针方法 可通过多层指针解决实体多标签问题 分词与分类信息无约束,结果较脏

Silver Bullet:

  1. 可解决多标签问题
  2. 可解决实体嵌套问题
  3. 分词和分类任务有约束