Skip to content

taishan1994/BERT-Event-Extraction

Repository files navigation

BERT-Event-Extraction

使用bert进行事件抽取。

依赖

scikit-learn==1.1.3 
scipy==1.10.1 
seqeval==1.2.2
transformers==4.27.4
pytorch-crf==0.7.2

目录结构

--checkpoint模型和配置保存位置
--model_hub预训练模型
----chinese-bert-wwm-ext:
--------vocab.txt
--------pytorch_model.bin
--------config.json
--data存放数据
----duee
--------ori_data原始的数据
--------ner_data处理之后的数据
------------labels.txt标签
------------train.txt训练数据
------------dev.txt测试数据
--------re_data------------labels.txt关系标签
------------train.txt训练数据
------------dev.txt测试数据
------------rels.txt该数据集没有因为实体只有两类有的话则是哪些实体之间具有关系
--config.py配置
--model.py模型
--process.py处理ori数据得到ner数据和re数据
--predict.py加载训练好的模型进行预测
--ner_main.py实体识别训练和测试
--re_main.py关系识别训练和测试

说明

使用的方法:

  • 1、利用BERT-BILSTM-CRF识别出文本里面事件的触发词。
  • 2、根据触发词对应的事件类型找出事件论文,比如:{'财经/交易_出售/收购': ['时间', '出售方', '交易物', '出售价格', '收购方']},[CLS]财经/交易_出售/收购的时间[SEP]text[SEP],然后以问答的形式提取实体。需要注意的是答案可能不止一个。

这里以duee数据为例。

1去https://huggingface.co/hfl/chinese-bert-wwm-ext/tree/main下载相关文件到chinese-bert-wwm-ext下搜索千言数据集下载duee1.0解压后将相关json放置在ori_data下2在process.py里面定义将ori_data里面的数据处理得到ner_data下的数据和re_data下的数据ner_data下数据样本是这样的--labels.txt
财经/交易_出售/收购
组织行为_罢工
人生_出轨
财经/交易_涨停
人生_失联
灾害/意外_起火
竞赛行为_退赛
人生_婚礼
......
--train.txt/dev.txt
{"id": "cba11b5059495e635b4f95e7484b2684", "text": ["消", "失", "的", "“", "外", "企", "光", "环", "”", ",", "5", "月", "份", "在", "华", "裁", "员", "9", "0", "0", "余", "人", ",", "香", "饽", "饽", "变", "“", "臭", "”", "了"], "labels": ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "B-组织关系_裁员", "I-组织关系_裁员", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]}
一行一条样本格式为BIOre_data下的数据样本是这样的--labels.txt
{
  "财经/交易_出售/收购": [
    "时间",
    "出售方",
    "交易物",
    "出售价格",
    "收购方"
  ],
  "财经/交易_跌停": [
    "时间",
    "跌停股票"
  ],
  "财经/交易_加息": [
    "时间",
    "加息幅度",
    "加息机构"
  ],
  ......
}
--train.txt/dev.txt
{"id": "cba11b5059495e635b4f95e7484b2684", "text": ["消", "失", "的", "“", "外", "企", "光", "环", "”", ",", "5", "月", "份", "在", "华", "裁", "员", "9", "0", "0", "余", "人", ",", "香", "饽", "饽", "变", "“", "臭", "”", "了"], "start": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "end": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "prompt": "组织关系_裁员的裁员人数"}

3在config.py里面定义一些参数比如--max_seq_len句子最大长度GPU显存不够则调小--epochs训练的epoch数
--train_batch_size训练的batchsize大小GPU显存不够则调小--dev_batch_size验证的batchsize大小GPU显存不够则调小--save_step多少step保存模型
其余的可保持不变注意实体识别最大长度和关系抽取最大长度要保持一致4在ner_main.py里面修改data_name为数据集名称需要注意的是名称和data下的数据集名称保持一致最后运行python ner_main.py

5在re_main.py里面修改data_name为数据集名称需要注意的是名称和data下的数据集名称保持一致最后运行python re_main.py

5在predict.py修改data_name并加入预测数据最后运行python predict.py

DGRE数据集

触发词识别max_seq_len=256
epochs=3
train_batch_size=32
dev_batch_size=32

论元识别max_seq_len=256
epochs=1
train_batch_size=32
dev_batch_size=32
触发词识别precision    recall  f1-score   support

       交往_会见       0.90      1.00      0.95         9
       交往_感谢       0.88      0.88      0.88         8
       交往_探班       1.00      0.82      0.90        11
       交往_点赞       0.83      0.91      0.87        11
       交往_道歉       0.70      1.00      0.83        19
     产品行为_上映       0.85      0.94      0.89        35
     产品行为_下架       0.92      0.96      0.94        24
     产品行为_发布       0.79      0.88      0.84       153
     产品行为_召回       0.95      0.97      0.96        36
     产品行为_获奖       0.85      0.69      0.76        16
     人生_产子/       0.73      0.73      0.73        15
       人生_出轨       0.50      0.25      0.33         4
       人生_分手       0.84      0.89      0.86        18
       人生_失联       0.80      0.86      0.83        14
       人生_婚礼       0.67      1.00      0.80         6
       人生_庆生       0.73      0.69      0.71        16
       人生_怀孕       1.00      0.75      0.86         8
       人生_死亡       0.78      0.81      0.80       107
       人生_求婚       0.83      1.00      0.91        10
       人生_离婚       0.87      0.89      0.88        38
       人生_结婚       0.79      0.79      0.79        43
       人生_订婚       1.00      0.89      0.94         9
     司法行为_举报       0.86      1.00      0.92        12
     司法行为_入狱       0.82      0.86      0.84        21
     司法行为_开庭       0.82      1.00      0.90        14
     司法行为_拘捕       0.88      0.94      0.91        90
     司法行为_立案       0.80      0.89      0.84         9
     司法行为_约谈       0.97      1.00      0.99        33
     司法行为_罚款       0.91      0.88      0.89        33
     司法行为_起诉       0.73      0.90      0.81        21
    灾害/意外_地震       0.75      0.75      0.75        20
  灾害/意外_坍/垮塌       0.75      0.82      0.78        11
    灾害/意外_坠机       0.80      0.92      0.86        13
    灾害/意外_洪灾       0.67      0.57      0.62         7
    灾害/意外_爆炸       0.89      0.80      0.84        10
    灾害/意外_袭击       0.69      0.65      0.67        17
    灾害/意外_起火       0.89      0.86      0.88        29
    灾害/意外_车祸       0.66      0.77      0.71        35
     竞赛行为_夺冠       0.72      0.71      0.71        65
     竞赛行为_晋级       0.76      0.86      0.81        36
     竞赛行为_禁赛       0.75      0.83      0.79        18
     竞赛行为_胜负       0.86      0.83      0.85       271
     竞赛行为_退役       0.85      1.00      0.92        11
     竞赛行为_退赛       0.89      0.89      0.89        18
     组织关系_停职       0.92      1.00      0.96        11
     组织关系_加盟       0.88      0.72      0.79        53
     组织关系_裁员       0.86      0.86      0.86        22
     组织关系_解散       0.59      1.00      0.74        10
     组织关系_解约       0.00      0.00      0.00         5
     组织关系_解雇       0.71      0.38      0.50        13
   组织关系_辞/离职       0.79      0.94      0.86        71
     组织关系_退出       0.78      0.95      0.86        22
     组织行为_开幕       0.85      0.97      0.91        30
     组织行为_游行       0.89      0.67      0.76        12
     组织行为_罢工       0.89      1.00      0.94         8
     组织行为_闭幕       0.90      1.00      0.95         9
    财经/交易_上市       0.86      0.75      0.80         8
 财经/交易_出售/收购       0.78      0.88      0.82        24
    财经/交易_加息       0.00      0.00      0.00         3
    财经/交易_涨价       0.50      0.20      0.29         5
    财经/交易_涨停       0.97      1.00      0.98        28
    财经/交易_融资       0.93      0.88      0.90        16
    财经/交易_跌停       0.81      0.87      0.84        15
    财经/交易_降价       0.44      0.70      0.54        10
    财经/交易_降息       0.00      0.00      0.00         4

   micro avg       0.82      0.85      0.83      1783
   macro avg       0.77      0.80      0.78      1783
weighted avg       0.82      0.85      0.83      1783

论元识别总共3527正确1963准确率0.5565636518287497

融合预测文本>>>>> 振华三部曲的暗恋橘生淮南终于定档了洛枳爱盛淮南谁也不知道洛枳爱盛淮南其实全世界都知道实体>>>>> {'产品行为_上映': [('定档', 16, 17)]}
关系>>>>> {'产品行为_上映': [('上映方', '振华', 0, 1), ('上映影视', '振华三部曲的《暗恋橘生淮南》', 0, 13)]}
====================================================================================================
文本>>>>> 腾讯收购全境封锁瑞典工作室 欲开发另类游戏大IP
实体>>>>> {'财经/交易_出售/收购': [('收购', 2, 3)]}
关系>>>>> {'财经/交易_出售/收购': [('出售方', '腾讯', 0, 1), ('交易物', '《全境封锁》瑞典工作室 欲开发另类游戏大IP', 4, 25), ('收购方', '腾讯', 0, 1)]}
====================================================================================================
文本>>>>> 6月22日山外杯第四届全国体育院校篮球联赛SCBA在日照市山东外国语职业技术大学拉开战幕实体>>>>> {'组织行为_开幕': [('拉开', 43, 44), ('幕', 46, 46)]}
关系>>>>> {'组织行为_开幕': [('时间', '6月22日', 0, 4), ('地点', '日照市山东外国语职业技术大学', 29, 42), ('活动名称', '山外杯第四届全国体育院校篮球联赛(SCBA)', 6, 27)]}
====================================================================================================
文本>>>>> e公司讯工信部装备工业司发布2019年智能网联汽车标准化工作要点实体>>>>> {'产品行为_发布': [('发布', 13, 14)]}
关系>>>>> {'产品行为_发布': [('时间', '2019年', 15, 19), ('发布产品', '2019年智能网联汽车', 15, 25), ('发布方', '工信部装备工业司', 5, 12)]}
====================================================================================================
文本>>>>> 新京报讯  5月7日台湾歌手陈绮贞在社交网络上宣布已于两年前与交往18年的男友音乐人钟成虎分手实体>>>>> {'人生_分手': [('分手', 48, 49)]}
关系>>>>> {'人生_分手': [('时间', '两年前', 29, 31), ('分手双方', '台湾歌手陈绮贞', 11, 17), ('分手双方', '音乐人钟成虎', 42, 47)]}
====================================================================================================
文本>>>>> 国际金价短期回调 后市银价有望出现较大涨幅
实体>>>>> {}
关系>>>>> {}
====================================================================================================
文本>>>>> 央视名嘴韩乔生在赛前为中国男篮加油期待球队展现英雄本色输球后的韩乔生也相当无奈他用3个没有来点评中国男篮没有投手没有经验没有体力实在太扎心实体>>>>> {'竞赛行为_胜负': [('输球', 29, 30)]}
关系>>>>> {'竞赛行为_胜负': []}
====================================================================================================
文本>>>>> 8月31日第四届两岸关系天府论坛在四川眉山市举行实体>>>>> {'组织行为_开幕': [('举行', 23, 24)]}
关系>>>>> {'组织行为_开幕': [('时间', '8月31日', 0, 4), ('地点', '四川眉山市', 18, 22), ('活动名称', '第四届两岸关系天府论坛', 6, 16)]}
====================================================================================================
文本>>>>> 6月10日基金异动申万菱信中证申万电子行业投资指数分级B较前一交易日上涨6.6837%
实体>>>>> {'财经/交易_涨价': [('上涨', 35, 36)]}
关系>>>>> {'财经/交易_涨价': [('时间', '6月10日', 0, 4), ('涨价幅度', '6.6837%', 37, 43), ('涨价方', '申万菱信', 10, 13)]}
====================================================================================================
文本>>>>> 期间肖某及其父母向被告黄某支付了彩礼14万元实体>>>>> {}
关系>>>>> {}
====================================================================================================
文本>>>>> 9月8日第七届中国(绵阳)科技城国际科技博览会成果发布会举行实体>>>>> {'组织行为_开幕': [('会举行', 28, 30)]}
关系>>>>> {'组织行为_开幕': [('时间', '9月8日', 0, 3), ('地点', '第七届中国(绵阳)科技城', 5, 16), ('活动名称', '第七届中国(绵阳)科技城国际科技博览会', 5, 23)]}
====================================================================================================
文本>>>>> 今日,,张晋发布视频通告蔡少芬喜怀三胎实体>>>>> {'人生_产子/女': [('怀', 17, 17)]}
关系>>>>> {'人生_产子/女': [('时间', '今日', 0, 1), ('产子者', '蔡少芬', 13, 15), ('出生者', '蔡少芬', 13, 15)]}
====================================================================================================

补充

  • 这里没有采用负样本,可能需要在process.py中构建:如果某个事件的某个论元没有出现,在起始位置和终止位置都为0,并加入到样本中。

延申

由于这几个项目的代码结构都差不多,而且都和信息抽取相关,就一起放在这。