taishan1994 / pytorch_bert_coreference_resolution

基于pytorch+bert的指代消解
15 stars 5 forks source link
bert correference-resolution pytorch

pytorch_bert_coreference_resolution

基于pytorch+bert的指代消解

说明

提取span1及span2对应位置的向量后和[CLS]对应的向量进行拼接,然后在第0维进行求和之后,最终利用融合后的向量进行二分类。使用的预训练模型可以去hugging face上下载:hfl/chinese-roberta-wwm-ext。已经训练好的模型:
阿里云盘链接:https://www.aliyundrive.com/s/YhRYjA8zD16

目录结构

--checkpoints:模型保存位置
--logs:日志保存位置
--utils:辅助函数位置
--data:数据文件
--bertBaseModel.py:基本的Bert
--config.py:配置
--CRModel.py:指代消解模型
--dataset.py:pytorch数据集
--main.py:主运行程序
--preprocess.py:数据预处理

运行指令

由于已经在config.py中修改了相关的参数,因此直接运行以下命令即可,如果需要修改相关参数,可以直接在config.py中进行修改,也在命令行中修改。

python main.py

训练及验证

epoch:7/50 step:137/1000 loss:0.160401
2021-09-16 15:19:28,529 - INFO - main.py - train - 109 - [train] epoch:7/50 step:138/1000 loss:0.168107
2021-09-16 15:19:29,554 - INFO - main.py - train - 109 - [train] epoch:7/50 step:139/1000 loss:0.107534
2021-09-16 15:19:32,756 - INFO - main.py - train - 114 - [dev] loss:3.039502 accuracy:0.7632 precision:0.7632 recall:0.7632 f1:0.7632

测试

2021-09-16 15:19:36,391 - INFO - main.py - test - 175 -               
                precision    recall  f1-score   support

           0       0.86      0.77      0.81       193
           1       0.66      0.78      0.72       111

    accuracy                           0.78       304
   macro avg       0.76      0.78      0.77       304
weighted avg       0.79      0.78      0.78       304

预测

text=作为代价,这个兵种在不拔剑的时候,他们看起来就跟普通的精锐没什么区别,顺带从这里也可以看出来曹操给曹真补了这五千多锐士是怎么个想法,很明显曹操也不是好鸟。
2021-09-16 15:33:21,227 - INFO - main.py - <module> - 275 - span1=['曹操', 46]
2021-09-16 15:33:21,227 - INFO - main.py - <module> - 276 - span2=['他们', 17]
2021-09-16 15:33:21,661 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:21,663 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:21,663 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:21,663 - INFO - main.py - <module> - 274 - text=作出回答的却不是高文,而是一直趴在桌子旁边往嘴里塞葡萄的琥珀,这位半精灵蹭了蹭嘴巴,对瑞贝卡甩过去一个白眼:笨,因为他不想赔钱啊。
2021-09-16 15:33:21,663 - INFO - main.py - <module> - 275 - span1=['高文', 8]
2021-09-16 15:33:21,663 - INFO - main.py - <module> - 276 - span2=['他', 58]
2021-09-16 15:33:21,711 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:21,712 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:21,712 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:21,712 - INFO - main.py - <module> - 274 - text=作出回答的却不是高文,而是一直趴在桌子旁边往嘴里塞葡萄的琥珀,这位半精灵蹭了蹭嘴巴,对瑞贝卡甩过去一个白眼:笨,因为他不想赔钱啊。
2021-09-16 15:33:21,712 - INFO - main.py - <module> - 275 - span1=['瑞贝卡', 43]
2021-09-16 15:33:21,712 - INFO - main.py - <module> - 276 - span2=['他', 58]
2021-09-16 15:33:21,760 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:21,762 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:21,763 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:21,763 - INFO - main.py - <module> - 274 - text=最终决定由丁槐负责解码板系统控制软件及电路版等关键配件的开发;苏津东负责辅助配件的开发并负责项目的整体调度,张恪相信苏津东此时已具备这样的能力,只是他之前缺乏发挥的空间;刘明辉负责后勤保障。
2021-09-16 15:33:21,763 - INFO - main.py - <module> - 275 - span1=['张恪', 54]
2021-09-16 15:33:21,763 - INFO - main.py - <module> - 276 - span2=['他', 74]
2021-09-16 15:33:21,814 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:21,815 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:21,815 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:21,816 - INFO - main.py - <module> - 274 - text=最终决定由丁槐负责解码板系统控制软件及电路版等关键配件的开发;苏津东负责辅助配件的开发并负责项目的整体调度,张恪相信苏津东此时已具备这样的能力,只是他之前缺乏发挥的空间;刘明辉负责后勤保障。
2021-09-16 15:33:21,816 - INFO - main.py - <module> - 275 - span1=['丁槐', 5]
2021-09-16 15:33:21,816 - INFO - main.py - <module> - 276 - span2=['他', 74]
2021-09-16 15:33:21,865 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:21,866 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:21,867 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:21,867 - INFO - main.py - <module> - 274 - text=最近一段时间,小不点石昊常与三头幼鸟厮混,摸索出了不少门道,族长石云峰也乐得他们凑在一起。
2021-09-16 15:33:21,867 - INFO - main.py - <module> - 275 - span1=['石昊常与三头幼鸟', 10]
2021-09-16 15:33:21,867 - INFO - main.py - <module> - 276 - span2=['他们', 38]
2021-09-16 15:33:21,920 - INFO - main.py - predict - 228 - 结果:1
2021-09-16 15:33:21,921 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:21,922 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:21,922 - INFO - main.py - <module> - 274 - text=最近一段时间,小不点石昊常与三头幼鸟厮混,摸索出了不少门道,族长石云峰也乐得他们凑在一起。
2021-09-16 15:33:21,922 - INFO - main.py - <module> - 275 - span1=['石云峰', 32]
2021-09-16 15:33:21,922 - INFO - main.py - <module> - 276 - span2=['他们', 38]
2021-09-16 15:33:21,975 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:21,976 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:21,976 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:21,976 - INFO - main.py - <module> - 274 - text=走出医院,庄睿心里有点遗憾,因为他到临走都没有见到那位十几天来一直照顾他的宋护士,刚才他专门去到医生值班室,想去谢谢宋护士,得到的消息却是宋护士请假了。
2021-09-16 15:33:21,976 - INFO - main.py - <module> - 275 - span1=['庄睿', 5]
2021-09-16 15:33:21,976 - INFO - main.py - <module> - 276 - span2=['他', 16]
2021-09-16 15:33:22,025 - INFO - main.py - predict - 228 - 结果:1
2021-09-16 15:33:22,027 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:22,027 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:22,027 - INFO - main.py - <module> - 274 - text=走出医院,庄睿心里有点遗憾,因为他到临走都没有见到那位十几天来一直照顾他的宋护士,刚才他专门去到医生值班室,想去谢谢宋护士,得到的消息却是宋护士请假了。
2021-09-16 15:33:22,027 - INFO - main.py - <module> - 275 - span1=['宋护士', 37]
2021-09-16 15:33:22,027 - INFO - main.py - <module> - 276 - span2=['他', 43]
2021-09-16 15:33:22,074 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:22,075 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:22,075 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:22,075 - INFO - main.py - <module> - 274 - text=走出房间,抬天看了看,看情形雨点子马上就要砸落下来,张恪与翟丹青朝小宴会厅走去。邢爱国的嗓门很大,在走廊上就听得见,张恪与翟丹青倒不用服务员领路,循着声音就能找到他们。
2021-09-16 15:33:22,075 - INFO - main.py - <module> - 275 - span1=['邢爱国', 40]
2021-09-16 15:33:22,075 - INFO - main.py - <module> - 276 - span2=['他们', 81]
2021-09-16 15:33:22,122 - INFO - main.py - predict - 228 - 结果:1
2021-09-16 15:33:22,123 - INFO - main.py - <module> - 278 - ===============================
2021-09-16 15:33:22,124 - INFO - main.py - <module> - 273 - ===============================
2021-09-16 15:33:22,124 - INFO - main.py - <module> - 274 - text=走出房间,抬天看了看,看情形雨点子马上就要砸落下来,张恪与翟丹青朝小宴会厅走去。邢爱国的嗓门很大,在走廊上就听得见,张恪与翟丹青倒不用服务员领路,循着声音就能找到他们。
2021-09-16 15:33:22,124 - INFO - main.py - <module> - 275 - span1=['张恪', 26]
2021-09-16 15:33:22,124 - INFO - main.py - <module> - 276 - span2=['他们', 81]
2021-09-16 15:33:22,169 - INFO - main.py - predict - 228 - 结果:0
2021-09-16 15:33:22,170 - INFO - main.py - <module> - 278 - ===============================

讲在最后

由于数据比较少,最后效果,不太好。实体的位置是预先就得到的,也可以根据命名实体识别来找出需要指代的实体以及代词,然后两两配对进行指代消解。