taishan1994 / BERT-BILSTM-CRF

使用BERT-BILSTM-CRF进行中文命名实体识别。
291 stars 32 forks source link
bert-bilstm-crf named-entity-recognition

BERT-BILSTM-CRF

使用BERT-BILSTM-CRF进行中文命名实体识别。突出一个词:方便

数据和模型下载地址:https://cowtransfer.com/s/3a155b702dfa42 点击链接查看 [ BERT-BILSTM-CRF ] ,或访问奶牛快传 cowtransfer.com 输入传输口令 hmpdf8 查看;

问题勘验

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:存放数据
----dgre
--------ori_data:原始的数据
--------ner_data:处理之后的数据
------------labels.txt:标签
------------train.txt:训练数据
------------dev.txt:测试数据
--config.py:配置
--model.py:模型
--process.py:处理ori数据得到ner数据
--predict.py:加载训练好的模型进行预测
--main.py:训练和测试

说明

这里以dgre数据为例,其余数据类似。

1、去https://huggingface.co/hfl/chinese-bert-wwm-ext/tree/main下载相关文件到chinese-bert-wwm-ext下。

2、在process.py里面定义将ori_data里面的数据处理得到ner_data下的数据,ner_data下数据样本是这样的:
--labels.txt
故障设备
故障原因
--train.txt/dev.txt
{"id": "AT0001", "text": ["6", "2", "号", "汽", "车", "故", "障", "报", "告", "综", "合", "情", "况", ":", "故", "障", "现", "象", ":", "加", "速", "后", ",", "丢", "开", "油", "门", ",", "发", "动", "机", "熄", "火", "。"], "labels": ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "B-故障设备", "I-故障设备", "I-故障设备", "B-故障原因", "I-故障原因", "O"]}
一行一条样本,格式为BIO。

3、在config.py里面定义一些参数,比如:
--max_seq_len:句子最大长度,GPU显存不够则调小。
--epochs:训练的epoch数
--train_batch_size:训练的batchsize大小,GPU显存不够则调小。
--dev_batch_size:验证的batchsize大小,GPU显存不够则调小。
--save_step:多少step保存模型
其余的可保持不变。

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

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

DGRE数据集

max_seq_len=512
train_batch_size=12
dev_batch_size=12
save_step=20
epochs=3
              precision    recall  f1-score   support

        故障原因       0.70      0.74      0.72       490
        故障设备       0.75      0.79      0.77       484

   micro avg       0.72      0.76      0.74       974
   macro avg       0.72      0.76      0.74       974
weighted avg       0.72      0.76      0.74       974

文本>>>>>: 492号汽车故障报告故障现象一辆车用户用水清洗发动机后,在正常行驶时突然产生铛铛异响,自行熄火
实体>>>>>: {'故障原因': [('异响', 40, 41), ('熄火', 45, 46)]}
====================================================================================================
文本>>>>>: 故障现象:空调制冷效果差。
实体>>>>>: {'故障设备': [('空调', 5, 6)], '故障原因': [('制冷效果差', 7, 11)]}
====================================================================================================
文本>>>>>: 原因分析:1、遥控器失效或数据丢失;2、ISU模块功能失效或工作不良;3、系统信号有干扰导致。处理方法、体会:1、检查该车发现,两把遥控器都不能工作,两把遥控器同时出现故障的可能几乎是不存在的,由此可以排除遥控器本身的故障。2、检查ISU的功能,受其控制的部分全部工作正常,排除了ISU系统出现故障的可能。3、怀疑是遥控器数据丢失,用诊断仪对系统进行重新匹配,发现遥控器匹配不能正常进行。此时拔掉ISU模块上的电源插头,使系统强制恢复出厂设置,再插上插头,发现系统恢复,可以进行遥控操作。但当车辆发动在熄火后,遥控又再次失效。4、查看线路图发现,在点火开关处安装有一钥匙行程开关,当钥匙插入在点火开关内,处于ON位时,该开关接通,向ISU发送一个信号,此时遥控器不能进行控制工作。当钥匙处于OFF位时,开关断开,遥控器恢复工作,可以对门锁进行控制。如果此开关出现故障,也会导致遥控器不能正常工作。同时该行程开关也控制天窗的自动回位功能。测试天窗发现不能自动回位。确认该开关出现故障
实体>>>>>: {'故障设备': [('遥控器', 7, 9), ('ISU模块', 20, 24), ('系统信号', 37, 40), ('遥控器', 66, 68), ('遥控器', 158, 160), ('遥控器', 182, 184), ('开关', 434, 435)], '故障原因': [('失效', 10, 11), ('数据', 13, 14), ('丢失', 15, 16), ('功能失效', 25, 28), ('工作不良', 30, 33), ('干扰', 42, 43), ('不能工作', 70, 73), ('数据丢失', 161, 164), ('失效', 260, 261), ('不能自动回位', 424, 429), ('故障', 438, 439)]}
====================================================================================================
文本>>>>>: 原因分析:1、发动机点火系统不良;2、发动机系统油压不足;3、喷嘴故障;4、发动机缸压不足;5、水温传感器故障。
实体>>>>>: {'故障设备': [('发动机点火系统', 7, 13), ('发动机系统', 19, 23), ('喷嘴', 31, 32), ('发动机', 38, 40), ('水温传感器', 48, 52)], '故障原因': [('不良', 14, 15), ('油压不足', 24, 27), ('故障', 33, 34), ('缸压不足', 41, 44), ('故障', 53, 54)]}
====================================================================================================

DUIE数据集

max_seq_len=256
train_batch_size=12
dev_batch_size=12
save_step=500
epochs=1

没跑完,在第1500step后手动停止了。

             precision    recall  f1-score   support

        Date       0.87      0.79      0.83      3130
      Number       0.77      0.72      0.75       877
        Text       0.70      0.63      0.66      2045
          人物       0.80      0.90      0.85     44595
          企业       0.47      0.67      0.55      3148
       企业/品牌       0.53      0.69      0.60       160
          作品       0.00      0.00      0.00        90
          国家       0.71      0.74      0.73      2241
        图书作品       0.86      0.72      0.78      4535
          地点       0.40      0.50      0.44       958
          城市       0.45      0.61      0.52       220
          奖项       0.00      0.00      0.00       529
          学校       0.64      0.86      0.74      1879
        学科专业       0.00      0.00      0.00         8
        影视作品       0.86      0.63      0.72      7900
        文学作品       0.57      0.21      0.30       188
          景点       0.44      0.36      0.40       118
          机构       0.81      0.37      0.51      2977
          歌曲       0.80      0.76      0.78      4976
          气候       0.80      0.80      0.80       132
        电视综艺       0.76      0.65      0.70      1010
         行政区       0.73      0.70      0.71       305
          语言       0.00      0.00      0.00        20
        音乐专辑       0.70      0.70      0.70      1035

   micro avg       0.77      0.79      0.78     83076
   macro avg       0.57      0.54      0.55     83076
weighted avg       0.78      0.79      0.77     83076

文本>>>>>: 歌曲《墨写你的美》是由歌手冷漠演唱的一首歌曲
实体>>>>>: {'歌曲': [('墨写你的美', 3, 7)], '人物': [('冷漠', 13, 14)]}
====================================================================================================
文本>>>>>: 982年,阎维文回到山西,隆重地迎娶了刘卫星
实体>>>>>: {'人物': [('阎维文', 5, 7), ('刘卫星', 19, 21)]}
====================================================================================================
文本>>>>>: 王皃姁为还是太子的刘启生了二个儿子,刘越(汉景帝第11子)、刘寄(汉景帝第12子)
实体>>>>>: {'人物': [('王皃姁', 0, 2), ('刘启', 9, 10), ('刘越', 18, 19), ('刘寄', 30, 31)]}
====================================================================================================
文本>>>>>: 数据分析方法五种》是2011年格致出版社出版的图书,作者是尤恩·苏尔李
实体>>>>>: {'图书作品': [('数据分析方法五种', 0, 7)], '人物': [('尤恩·苏尔李', 29, 34)]}
====================================================================================================
文本>>>>>: 视剧《不可磨灭》是导演潘培成执导,刘蓓、丁志诚、李洪涛、丁海峰、雷娟、刘赫男等联袂主演
实体>>>>>: {'影视作品': [('不可磨灭', 3, 6)], '人物': [('潘培成', 11, 13), ('刘蓓', 17, 18), ('丁志诚', 20, 22), ('李洪涛', 24, 26), ('丁海峰', 28, 30), ('雷娟', 32, 33), ('刘赫男', 35, 37)]}
====================================================================================================

延申

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