NLP(四十二)人物关系分类的再次尝试

Python爬虫与算法

共 5975字,需浏览 12分钟

 ·

2021-03-25 22:43


  两周前的周末,笔者决定对人物关系分类进行再次尝试。
  为什么说是再次尝试呢?因为笔者之前已经写过一篇文章NLP(二十一)人物关系抽取的一次实战,当时的标注数据大约2900条,使用的模型也比较简单,为BERT+Bi-GRU+Attention+FC结构,其中BERT用作特征提取,该模型在原有数据集上的F1为79%。
  经过笔者一年断断续续的努力,现在的标注样本已经达到3900多条。鉴于笔者已做过BERT微调相关工作,当然希望在此数据集上进行再次尝试。
  现有的人物关系数据集大约3900多条,分布如下图:

人物关系分布图

  首先,我们只使用BERT分类模型,对输入数据进行格式改造,进行简单地尝试。
  我们以样本亲戚 1837年6月20日,威廉四世辞世,他的侄女维多利亚即位。为例,其中亲戚为人物关系,威廉四世为实体1,维多利亚为实体2,来演示输入的文本格式。下面的部分我们统一使用chinese-RoBERTa-wwm-ext作为预训练模型,数据集分为训练集和测试集,比例为8:2。
  第一种方法,我们与文章NLP(二十一)人物关系抽取的一次实战一样,在文本中将实体1替换为同样数量的#,实体2替换为同样数量的#,再将实体1、实体2、文本用$连接,输入格式为:威廉四世$维多利亚$1837年6月20日,####辞世,他的侄女####即位。。使用BERT+Bi-GRU+Attention+FC模型,在测试集上的评估结果如下:

模型名称训练1训练2训练3训练4训练5Avg
BiGRU+Attention0.77260.79740.79350.79080.79410.7897

  第二种方法,输入格式与第一种方法一致。使用文章NLP(三十五)使用keras-bert实现文本多分类任务中的多分类模型进行训练,在测试集上的评估结果如下:

模型名称训练1训练2训练3训练4训练5Avg
Bert_cls0.82460.81100.82820.84480.82180.8260

可以看到,有了预训练模型的帮助,模型效果有了显著提升,F1值平均高了3.6%。
  第三种方法,在文本中将实体用#包围,输入格式为:1837年6月20日,#威廉四世#辞世,他的侄女#维多利亚#即位。使用BERT_cls模型,在测试集上的评估结果如下:

模型名称训练1训练2训练3训练4训练5Avg
Bert_cls2(实体用#围绕)0.81750.82590.82750.83350.82990.8269

可以看到,该输入格式与第二种方法相比,在模型效果上并没有太大的提升。
  也许,是时候尝试新的模型了。
  上周一晚上,笔者无意中看到一篇论文,名称为Enriching Pre-trained Language Model with Entity Information for Relation Classification,顾名思义为使用实体信息将预训练模型用于关系分类(RC)。其模型结构如下图:

R-BERT模型结构

该模型被称为R-BERT,模型结构在此不多介绍,后面有机会再介绍。在Github上有R-BERT模型的Torch框架实现方式,在Semeval 2010 Task 8 Dataset取得了不错的效果。
  笔者将R-BERT用于人物关系分类数据集中,在测试集上的评估结果如下:
Model: chinese-roberta-wwm-ext, weighted avgage F1 = 85.35%

该项目笔者已上传至Github,网址为:https://github.com/percent4/R-BERT_for_people_relation_extraction。
  本周,笔者下定决心使用Keras实现R-BERT。第一天,无果。第二天,实现关键Keras层的突破,进行简单模型训练,发现离Torch版本的结果尚有一定差距。第三天,对照Torch版本,不断调整模型,加入Warmup机制,发现终于取得了与Torch版本一样的效果。在测试集上的评估结果如下:

# Model: chinese-RoBERTa-wwm-ext, weighted avgage F1 = 85.27%
              precision    recall  f1-score   support

     unknown     0.7930    0.8612    0.8257       209
         上下级     0.7188    0.7419    0.7302        31
          亲戚     0.8824    0.6250    0.7317        24
        兄弟姐妹     0.8378    0.9118    0.8732        34
          合作     0.8600    0.7288    0.7890        59
          同人     1.0000    0.9487    0.9737        39
          同学     0.8800    0.9167    0.8980        24
          同门     0.9615    0.9615    0.9615        26
          夫妻     0.8333    0.8861    0.8589        79
          好友     0.8065    0.8333    0.8197        30
          师生     0.8857    0.8378    0.8611        37
          情侣     0.9231    0.7742    0.8421        31
          父母     0.9062    0.9062    0.9062       128
          祖孙     0.9524    0.8000    0.8696        25

    accuracy                         0.8531       776
   macro avg     0.8743    0.8381    0.8529       776
weighted avg     0.8566    0.8531    0.8527       776

该项目已上传至Github,网址为:https://github.com/percent4/Keras_R_BERT。后面有机会笔者再详细介绍。
  至此,笔者不仅用Keras实现了R-BERT,并且比最初的BERT+Bi-GRU+Attention+FC模型,在测试集上的F1值提升了6.3%。
  实现模型的过程是痛苦的,笔者一度想放弃,但当模型成功复现后,那种快乐,是简单枯燥的工作中的一抹绚丽的阳光!这也是笔者第一次复现模型,虽然只是深度学习框架不同,但对我来说是极其重要的一步!
  最近又发现一个很不错的关系分类的模型:Mul-BERT,但由于该模型的论文并未公布,Github也没有公开源码,笔者只好按自己的理解,简单地实现了近似Mul-BERT模型,已上传至Github,网址为:https://github.com/percent4/Keras_quasi_Mul_BERT。等论文出来后,再用Keras去复现Mul-BERT模型。
  本文到此结束,感谢阅读~
  2021年3月25日于上海浦东,此日阳光明媚~

浏览 86
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报