背景:
目标:快速上手实现一个基于BERT和CRF的命名实体识别(NER)任务。
适宜人群:希望使用Bert来进行NER任务的NLP初学者。同时大概知道如何使用keras和Colab使用免费GPU的伙伴们。
问题:
1,为什么要用BERT,什么是bert4keras工具包?
BERT最近几年大火,因为提供了高效的预训练方法。许多NLP任务上取得了非常好的效果。
但是现在的BERT并不是很好使用,就算是想要做一个小的demo,入门也不是特别简单。
所以所以我们使用苏剑林大佬的bert4keras。苏老师的基本思想是,比起其他的神经网络框架,keras相对来说要更加容易使用一些。所以他将bert和keras结合了起来便于大家上手做相关任务。
2,为什么要用CRF?
之前看到知乎,有人完全扎进了高大上的各种模型,当别人提到CRF模型的时候不屑一顾,称之为“啥年代了还看着几十年前的玩意儿”。但是在序列标注领域,CRF的使用频率十分高。
宗成庆老师在《统计自然语言处理》一书说到:“由于该方法(CRF)简便易行,而且可以获得较好的性能,因此受到很多学者的青睐,已被广泛地应用于人名、地名和组织机构等各种类型命名实体的识别,并在具体应用中不断得到改进,可以说是命名实体识别中最成功的方法。”
想要学习CRF大概原理的伙伴可以从bert4keras的创造者苏剑林大佬博看一下他所写的系列文章~:https://kexue.fm/archives/4695
具体的推导可以从李航老师HMM章节开始看起可能帮助更大。
3,NER任务是什么?常见数据集标注格式?
命名实体识别(NER)可以看做是序列标注的一种。其他的序列标注包括像:词性标注、自动分词等。NER(named entity recognition)的本质其实就是从文本识别某些特定实体指称的边界和类别。这些特定的实体可以是:人名、地名、组织机构名、时间和数字表达(包括时间、日期、货币量和百分数等)。
同时NER的常见的数据集标注格式也同其他的机器学习任务不大一样。一般以字为单位。
以下图的人民日报的NER标注数据为例:对于“海南公司飞行部”,我们认为是一个组织实体名。所以在开始的字符进行“B-ORG”的标注,“B”表示begin,标注的开始。“I-ORG”表示实体名后续字符。文本中其余无关字符都标记为“O”。
4,为何使用Colab?
因为可以薅羊毛使用免费GPU~哈哈!
如果不清楚如何使用Colab的小伙伴可以自行查找一下。
步骤:
1,在colab下载必要的第三方包以及Bert模型
要点1:使用colab的`./content`空间的技巧。
我们可以直接较占空间的bert模型(300mb)下载到正运行的`./content`空间内。笔者体验在colab下载是十分快的,往往可以达到几十mb每秒的下载速度。下载好的文件可以在左侧的文件栏看到下载的文件。大家可以把bert模型和自己的数据集都放上去便于使用。
要点2:使用 pip 来下载bert4keras。
要点3:下载 BERT 模型。
很简单,按照下述的代码块就可以把数据集合bert模型都下载到运行空间了。需要注意的是,这里下载的BERT模型是专门用于中文的BERT模型。用于处理中文相关任务。
2,整理数据集并调整格式
要点1:每个文本之间的分割为`\n`,图示如下。
要点2:注意标注方法。
后续代码是根据人民日报的数据集来处理的。由于人民日报中的NER标注是BIO的。大伙在使用其他规则的命名实体的数据集的时候可能需要注意。例如像是下图的数据集,就是BIOES的标注方法。处理方式也简单,确保标注的开头只有B、I、O三个字母就行了。
要点3:将数据集上载到colab上
4, 搭配代码
代码来源:其实就是bert4keras,使用bert+CRF
代码地址:https://github.com/bojone/bert4keras/blob/master/examples/task_sequence_labeling_ner_crf.py
5, 载入数据集并配置模型;
6,训练模型以及模型预测
训练要点:
使用人民日报数据集时候batch_size为32可能会崩,笔者后来调成了10。大伙可以基于自己的数据集多尝试。
模型预测:
使用代码中的`named_entity_recognize`方法,传入文本就可以得到标注效果了!
笔者使用了其他的数据集实验了一下,最后的f1可以达到近90。下图为其他文本的标注效果。可以看到预测结果还是不错的
代码:
https://github.com/dengxc1220/bert4keras_ner_demo
欢迎大家多捧场,来star
同时大家注意,Google Colab可直接从github打开Jupyter notebooks,
只需将“http:// github.com/”替换为“https:// colab.research.google.com/github/”,就会直接加载到Colab中 。