命名实体识别(NER)(二):BERT+CRF模型训练

摘要:上篇介绍了数据的标注过程,接下来就是模型的训练了,本文采用BERT+CRF模型进行训练。

 

采用kashgari模块(一个将Bert封装好的模块,用于快速搭建模型)的Bert模块快速搭建自己模型

在原来bert预训练模型基础上,导入自己的标注数据进一步训练,

bert中文预训练模型就自己下一下吧~

代码比较简单,就是导入数据,在预训练基础上进一步训练

from kashgari.tasks.seq_labeling import BLSTMCRFModel
from kashgari.embeddings import BERTEmbedding
import kashgari
from kashgari import utils
import os
#os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
#os.environ["CUDA_VISIBLE_DEVICES"] = ""

def get_sequence_tagging_data(file_path):

    data_x, data_y = [], []

    with open(file_path, 'r', encoding='utf-8') as f:
        lines = f.read().splitlines()
        # print(lines)
        x, y = [], []
        for line in lines:
            rows = line.split(' ')
            if len(rows) == 4:
                data_x.append(x)
                data_y.append(y)
                x = []
                y = []
            else:
                x.append(rows[0])
                y.append(rows[1])
    return data_x, data_y
#train_x, train_y = get_sequence_tagging_data('training_data_bert_train.txt')

# train_x, train_y = get_sequence_tagging_data('../new_note.txt')
# print(f"train data count: {len(train_x)}")



model training 
embedding = BERTEmbedding('/pvc/train/chinese_L-12_H-768_A-12',40)
model = BLSTMCRFModel(embedding)
model.fit(train_x,
          train_y,
          validation_split = 0.4,
          epochs=10,
          batch_size=32)
print('model_save')
model.save('../model_save/ner_model')

最后附上一段供测试的代码

load_model = BLSTMCRFModel.load_model('../model_save/ner_model')
print(load_model.predict("刘若英语怎么样"))

从训练数据的标注至NER模型训练流程就算简单走一遍了。

至此,NER本节就算完结了~逃

### 使用 BERTCRF 实现 NER 的方法 #### 架构概述 为了实现高效的命名实体识别NER),可以采用一种融合了双向编码器表示来自Transformer (BERT) 和条件随机场(CRF)的方法。这种方法能够利用预训练的语言模型来捕捉上下文信息,同时通过CRF层优化标签序列的一致性和准确性[^1]。 #### 数据准备 数据集通常由一系列标记过的句子组成,其中每个单词都附有一个对应的类别标签。这些标签遵循特定的标注方案,比如BIO(Begin, Inside, Outside),用于指示词语是否属于某个实体及其位置关系。对于中文环境下的应用,则需考虑分词问题并可能要对原始语料进行适当处理以适应输入格式的要求[^2]。 #### 模型构建 以下是Python代码片段展示了一个简单的基于PyTorch框架下使用 Hugging Face Transformers 库加载预训练好的BERT模型,并在其顶部添加一层线性变换和CRF解码器的方式: ```python from transformers import BertModel import torch.nn as nn class BertCrfForNer(nn.Module): def __init__(self, num_labels=9): # 这里的num_labels应等于您定义的不同类型的实体数量加一(代表非实体) super().__init__() self.bert = BertModel.from_pretrained('bert-base-chinese') self.dropout = nn.Dropout(0.1) self.classifier = nn.Linear(self.bert.config.hidden_size, num_labels) def forward(self, input_ids=None, token_type_ids=None, attention_mask=None, labels=None): outputs = self.bert(input_ids=input_ids, token_type_ids=token_type_ids, attention_mask=attention_mask)[0] sequence_output = self.dropout(outputs) logits = self.classifier(sequence_output) if labels is not None: loss_fct = CrossEntropyLoss() active_loss = attention_mask.view(-1) == 1 active_logits = logits.view(-1, self.num_labels)[active_loss] active_labels = labels.view(-1)[active_loss] loss = loss_fct(active_logits, active_labels) return loss else: return logits ``` 此部分实现了基础结构,在实际部署时还需要加入CRF模块来进行路径评分计算与最优路径推断操作[^3]。 #### 训练过程 在准备好上述组件之后,就可以按照常规流程设置损失函数、优化算法等参数开始训练过程。值得注意的是,由于加入了CRF层,因此除了普通的交叉熵损失外还需额外引入负对数似然作为目标函数的一部分;而在预测阶段则可通过Viterbi算法求得最有可能的状态转移路径即最终的结果输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值