命名实体识别从零到一

前言

之前其实写过一篇关于命名实体识别的博客, 但是当时对于深度学习等各种内容的掌握还相当肤浅, 代码也只是对官方例子的粗略改进, 并且参照了很多网上的代码, 少了灵魂, 最后工程上用的还是别人的库, 但不得不说太垃圾了, 速度很慢而且不好使。

上一学期我算是系统地接触学习了这个领域, 因此趁着寒假末尾打算将之前的 NER(Named Entity Recognition) 代码重写一下, 因为这是我大创的一部分内容, 并且我还是很感兴趣这个课题的, 还能顺便学习Bert, 让我在成为一个nlper的路途上再迈一步~

由于我已经将代码和自己写的文档 (对原理的解释) 上传到了 Github, 在这篇博客中我不会介绍原理, 而是想介绍一下自己的这个开源仓库, 并且分享一些经验和问题。

关于我的NER

  • PyTorch官方给出的NER例子是最基础的版本, 即所有的动态规划都是用for循环做的, 而且batch_size=1, 我将其中的for循环改为batch版本, 并且融合batch, 即一次可以训练/预测一个batch的句子

  • 官方的例子是toy data, 并且直接用列表传的数据, 大创时我从人大教务处爬取了近一年发布的新闻, 并从中采样了885个句子, 标记的类别包括

    'B-award',	# 奖项的开始
    'I-award',	# 奖项的中间
    'B-conference',	# 会议的开始
    'I-conference',	# 会议的中间
    'B-department',	# 部门的开始
    'I-department',	# 部门的中间
    'B-location',	# 地点的开始
    'I-location',	# 地点的中间
    'B-major',	# 专业的开始
    'I-major',	# 专业的中间
    'B-name',	# 姓名的开始
    'I-name',	# 姓名的中间
    'B-organization',	# 组织的开始
    'I-organization',	# 组织的中间
    'B-position',	# 职位的开始
    'I-position',	# 职位的中间
    'B-scholarship',	# 活动的开始
    'I-scholarship',	# 活动的中间
    'O'	# 其他
    

    我自定义了完整的Dataset, 进行tokenize等功能, 然后在其上定义了Dataloader, 形成了完整的preprocess的工作流。
    进一步, 用户可以按照格式提供自己的数据进行训练和测试。

  • 除了BiLSTM+CRF的基础模型外, 我还实现了3种不同的利用Bert的模型, 分别使用Bert做更好的token embedding, 或者直接使用BertForTokenClassification作为预测模型。

  • 我将各个训练步骤做了封装, 所有模型通过以下流程进行训练和评测

    Created with Raphaël 2.2.0 定义Hyper Parameters字典 prepare() 进行数据预处理, 自定义训练集和测试集的划分比例并生成Dataloader以及tokenizer等对象 train() 训练模型, 每个epoch输出在测试集(验证集)上的 f1_score predict() 输入想要预测的自然语言句子的列表, 输出每句话每个字的预测结果 save() 保存模型 结束

关于经验和问题的分享

一些经验

  • Bert Model的learning rate一定不能太大, 原论文中建议从2e-5, 3e-5, 5e-5中选
  • 我把在实现模型过程中遇到的一些PyTorch的操作都都记录在这里。
  • 写了一个同步服务器(linux)文件和本机(windwos)文件的脚本, 比ssh快太多了, 需要的话邮箱(zpt@ruc.edu.cn)找我

一些问题

  • 目前Bert Model的表现不如BiLSTM, 我怀疑是数据集的问题, 毕竟是自己标的数据, 标签很不均衡, 但是我也懒得写处理public的数据集的脚本了, 可能之后会让多标一些数据~ 或者有无大佬不吝赐教一下。
  • 实体识别只是第一步, 接下来要做的是实体消歧, 关系抽取, 所以这个仓库会一直更新(在我闲的时候hhh), 但对这两个方向还不是很了解, 慢慢来吧~

写在最后

“所有伟大的事业有一个共同点, 它们都不是一帆风顺的。”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值