NLP实战:使用Bert4Keras工具包+Colab实现命名实体识别NER任务

背景:

目标:快速上手实现一个基于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”。

人民日报的NER标注数据

4,为何使用Colab?

    因为可以薅羊毛使用免费GPU~哈哈!

    如果不清楚如何使用Colab的小伙伴可以自行查找一下。


步骤:

1,在colab下载必要的第三方包以及Bert模型

要点1:使用colab的`./content`空间的技巧。

    我们可以直接较占空间的bert模型(300mb)下载到正运行的`./content`空间内。笔者体验在colab下载是十分快的,往往可以达到几十mb每秒的下载速度。下载好的文件可以在左侧的文件栏看到下载的文件。大家可以把bert模型和自己的数据集都放上去便于使用。

colab的文件栏查看文件

要点2:使用 pip 来下载bert4keras。

要点3:下载 BERT 模型。

很简单,按照下述的代码块就可以把数据集合bert模型都下载到运行空间了。需要注意的是,这里下载的BERT模型是专门用于中文的BERT模型。用于处理中文相关任务。

使用wget等命令下载和解压bert模型

2,整理数据集并调整格式

要点1:每个文本之间的分割为`\n`,图示如下。

每个文本之间的分割为`\n`

要点2:注意标注方法。

    后续代码是根据人民日报的数据集来处理的。由于人民日报中的NER标注是BIO的。大伙在使用其他规则的命名实体的数据集的时候可能需要注意。例如像是下图的数据集,就是BIOES的标注方法。处理方式也简单,确保标注的开头只有B、I、O三个字母就行了。

非人民日报NER数据集示例

要点3:将数据集上载到colab上

4, 搭配代码

    代码来源:其实就是bert4keras,使用bert+CRF

    代码地址:https://github.com/bojone/bert4keras/blob/master/examples/task_sequence_labeling_ner_crf.py 

5, 载入数据集并配置模型;

代码块:载入数据
代码块:bert配置文件

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中 。

你可能感兴趣的:(NLP实战:使用Bert4Keras工具包+Colab实现命名实体识别NER任务)