前言
之前其实写过一篇关于命名实体识别的博客, 但是当时对于深度学习等各种内容的掌握还相当肤浅, 代码也只是对官方例子的粗略改进, 并且参照了很多网上的代码, 少了灵魂, 最后工程上用的还是别人的库, 但不得不说太垃圾了, 速度很慢而且不好使。
上一学期我算是系统地接触学习了这个领域, 因此趁着寒假末尾打算将之前的 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作为预测模型。
-
我将各个训练步骤做了封装, 所有模型通过以下流程进行训练和评测
关于经验和问题的分享
一些经验
- Bert Model的learning rate一定不能太大, 原论文中建议从2e-5, 3e-5, 5e-5中选
- 我把在实现模型过程中遇到的一些
PyTorch
的操作都都记录在这里。 - 写了一个同步服务器(linux)文件和本机(windwos)文件的脚本, 比ssh快太多了, 需要的话邮箱(zpt@ruc.edu.cn)找我
一些问题
- 目前Bert Model的表现不如BiLSTM, 我怀疑是数据集的问题, 毕竟是自己标的数据, 标签很不均衡, 但是我也懒得写处理public的数据集的脚本了, 可能之后会让多标一些数据~ 或者有无大佬不吝赐教一下。
- 实体识别只是第一步, 接下来要做的是实体消歧, 关系抽取, 所以这个仓库会一直更新(在我闲的时候hhh), 但对这两个方向还不是很了解, 慢慢来吧~
写在最后
“所有伟大的事业有一个共同点, 它们都不是一帆风顺的。”