当前位置:   article > 正文

NLPer必会:bert+bilstm+CRF进行中文命名实体识别(NER)

bert+bilstm+crf

1、命名实体识别由于有标注标签的存在,转化为多分类问题。
标注标签本次训练集中为‘BIO’方式标注
命名实体标注三种:人物,地点,组织机构
标签共7个类别:B-PER,I-PER,B-LOC,I-LOC,B-ORG,I-ORG,O

2、对于文本向量表示,如使用预训练模型BERT的向量:
安装腾讯肖涵博士开发的Bert Server(bert-serving-server)和Client(bert-serving-client)的python包
下载谷歌Bert-base chinese预训练模型
启动bert-serving-server,调用bert-serving-client,对字典集中所有字符进行encode
如不使用,则可以随机初始化一个numpy矩阵作为初始向量表示

3、对于文本序列的特征学习使用bilstm,可以双向获取各节点上下文特征
使用tensorflow 1.14版本构建bilstm模型主流程:
构建静态计算图(input层(输入数据的占位符)-embedding层(Bert或随机)-bilstm层(计算output)-softmax_or_crf层(计算预测标签概率值)-loss层(定义损失函数,计算loss)-optimizer层(定义优化损失函数方式:Adam/RMSProp…)-变量初始化开始层)

其中,softmax_or_crf层(最终分类使用softmax或CRF)
如使用softmax作为最后一层激活函数,则对于各节点,每个节点都在N个标签中选取softmax概率值最大的作为标签,标签选取时不在考虑上个节点的标签类别;
如使用CRF作为最后一层进行分类,则对于各节点,每个节点在N个标签中选取标签时,还同时考虑上个节点的标签与该节点标签的转移概率,最后用维特比算法,根据每个节点标签的likelihood和标签之间的转移概率,计算出最优标签序列

数据集 char sentence PER LOC ORG
训练集:1000043 20864 8144 16571 9277
验证集:112187 2318 884 1951 984
测试集:223832 4636 1864 3658 6185

中文数据集,感谢博文命名实体识别训练集汇总(一直更新)中提供的语料地址

epoch=20
loss:
在这里插入图片描述
在这里插入图片描述代码:
1、data_processing数据处理模块:
在这里插入图片描述重点:字向量生成
chardic_embedding.py:

from run.parameters_set import args
import numpy as np
from data_processing.create_char2id_dic import char_dic
from bert_serving.client import BertClient
bert_root = 'C:\\Users\\ZCY\\Anaconda3\\NLP_BERT\\chinese_L-12_H-768_A-12\\'
bert_config_file = bert_root+'bert_config.json'


def chardic_embedding():
    embedding_dim = args.embedding_dim
    if args.char_embedding_init == 'random':
        embedding_matrix = np.random.uniform(-0.25,0.25,(len(char_dic.keys()),embedding_dim))
        embedding_matrix = np.float32(embedding_matrix)
    elif args.char_embedding_init == 'BERT':
        embedding_matrix = BertClient().encode(list(char_dic.keys()))#bert_base的维度768,bert_large的维度1024,均不可更改,如需改可以添加隐层的方式更改
    #print(embedding_matrix)
    return embedding_matrix
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2、model模块:
在这里插入图片描述重点:
Bilstm_CRF.py

import tensorflow as tf
from tensorflow.contrib.rnn import LSTMCell
from tensorflow.contrib.crf import crf_log_likelihood
from tensorflow.contrib.layers import xavier_initializer
from data_processing.create_sentset import tag2id
from data_processing.create_char2id_dic import char_dic
from data_processing.chardic_embedding import chardic_embedding
from run.parameters_set import model_path


class Bilstm_CRF(object):
    def __init__(self,args):

        self.hidden_dim = args.hidden_dim
        self.epoch_num = args.epochs
        self.optimizer = args.optimizer
        self.learning_rate = args.learning_rate
        self.gradient_clipping = args.gradient_clipping
        self.dropout_rate = args.dropout
        self.CRF_SOFTMAX = args.CRF_SOFTMAX
        self.embedding = chardic_embedding()
        self.char_dic = char_dic
        self.tag2id = tag2id
        self.model_path = model_path

    def computing_graph(self):
        self.input_placeholder()
        self
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/364960
推荐阅读
相关标签
  

闽ICP备14008679号