命名实体识别NER实战(一)

1,什么是命名实体识别

    命名实体识别(Named Entity Recognition,简称NER)就是从一句话中找出相关的实体,并标识出其位置,实体的定义很广,可以是人名、机构、地点,根据业务需求也可以是性别、产品型号之类的。

例如:
刘媛媛同学被清华大学录取。
这里刘媛媛是一个人,清华大学是一个机构。

NER是NLP中一项基础性关键任务,对于其他的自然语言任务如关系抽取、事件抽取、知识图谱、机器翻译、问答系统都需要NER的支撑。

NER技术目前已经很成熟,在工业上已经完全满足应用需求。

2,通用工具

    如果业务需求简单,目前有封装好的工具可以直接使用,
NLTK和Stanford NLP。当然通用工具只能满足简单的需求,对于复杂的任务还是需要自己训练模型。

3,NER模型

    早期的NER使用字典和规则,在发展就是使用HMM和CRF概率模型。目前主流的方法是深度学习加CRF(RNN+CRF/CNN+CRF)

在基于深度学习的方法中,NER被当作是序列标注问题,类似于分类问题,对句子中的每个词判断其类别。这里会系列的介绍RNN,RNN+CRF,Bert+RNN+CRF.

4 实战

    4.1标签结构

        前面说了,在深度学习中NER被当做序列标注问题,所以要对每个词建立其对应的标签。序列标注的常用标签体系包括IO、BIO、BMEWO、BMEWO+。用个例子来理解下这些标签。

ner标签

一般来说越复杂的标签结构,效果越好,当然复杂的标签结构处理起来也很麻烦。在我以前的业务中,使用BIO比较多,能够满足业务需求。

    4.2标注方式

        标注工具我一般使用brat,当然这不是必须的。标注的实体,我建议是颗粒度越细越好,例如:

标注

这里苏州高新区房产交易管理中心 也可以 整个标注成一个机构,但我建议细分颗粒度。原因有二:1、细分后的模型表现要好。2、有助于扩充数据,随便交换两个同类实体,便可以生成新的样本。

    4.3模型输入

        对于中文来说,我们可以使用词当做输入,也可以使用字。

对于词来讲,很显然分词的效果对最后的结果影响很大,如果分词错误了,得到的实体标签始终就不可能正确。你可能想,使用字不就没问题了?显然不会,对于字来讲失去了词的信息,或者说需要跟多的样本来学习词的信息。如果标注数量足够的情况,建议使用字向量,模型会自动学习到分词的信息(分词本身也是序列标注的任务)。

    4.4训练

        这一节先用双向RNN来实现命名体识别,本文代码GIT。

模型

模型结构如上图。模型本身很简单,通过双向的RNN来获取隐藏特征,经过全连接和softmax来得到每个token在不同标签类别上的概率。最后损失函数就是对每一个token求交叉熵。

看下数据流就很清晰了,假设 样本形状为[N,128] N是batch_size,128是每个句子的token数量,经过embedding得到[N,128,300] 300是word2vec的维度。经过双向RNN后数据变成[2,N,128,200] 这里2 代表RNN的两个方向,前向和后向分别会有一个hidden输出,200 是RNN的神经元数量。将两个方向的RNN输出合并到一起,得到[N,128,400],然后通过一个或几个全连接层,得到[N,128,5] 5就是标签类别数量,通过softmax 转化成概率。

详情可以参考代码,命名实体识别NER实战
会介绍RNN+CRF,以及bert实现NER。

你可能感兴趣的:(命名实体识别NER实战(一))