taishan1994 / BERT-Event-Extraction

使用bert进行事件抽取。
36 stars 1 forks source link
bert event-extraction machine-reading-comprehension named-entity-recognition

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:关系识别训练和测试

说明

使用的方法:

这里以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"]}
一行一条样本,格式为BIO。
re_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)]}
====================================================================================================

补充

延申

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