Bert用于命名实体识别任务(NER)
前记:
BERT(Bidirectional Encoder Representation from Transformers)是2018年10月Google AI研究院提出的一种预训练-微调大模型,和GPT属于是同一时期的产物。BERT在多项自然语言处理任务上都实现了SOTA,抛弃了传统模型,在一种任务上需要修改模型架构的方式,而是同一个模型架构在不需要修改的情况下,应用于多个任务上。因此,一经问世就引起了学术界极大地关注,甚至超过了GPT。
BERT的网络架构使用的是基于Transformer中的Encoder部分,由于其使用Attention的关系,从而避免了传统网络结构,诸如RNN,LSTM,GRU等的遗忘问题,可以捕获一个长序列不同token的相关性问题。
Bert架构图如下:
网络结构介绍:
这里重点介绍一下Bert的嵌入编码部分,后面部分就是Encoder模块的堆叠了,并没有什么新奇的。
Bert的嵌入编码有三部分,分别是token Embedding,position Embedding, segment Embedding,之所以这里需要segment Embedding,是因为在Bert的预训练任务中有两个训练任务一个是掩码填充预测,一个NSP(Next Sentence Prediction)预测。
NER任务:
命名实体识别——Named Entity Recognition——简称NER,是指从文本中识别出具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。 简单举例: 识别出的实体结果: 结果显示就把举例文本中的具有特定意义的实体,机构名和人名以及它们的具体位置都识别出来了。 以上就是一个NER任务的实际样例,在做具体的项目的时候,往往涉及到的实体类型更多,有可能成百上千,然后数据量更多。
使用Bert用于NER任务
所使用到的数据集链接:数据集
首先是数据集的处理:
1 | import torch |
output:
1 | [1745, 711, 1266, 776, 1920, 2110, 1744, 2157, 1355, 2245, 4777, 4955, 7368, 3136, 2956, 510, 704, 1744, 5307, 3845, 4777, 4955, 704, 2552, 712, 818, 2001, 3817, 1745, 120, 1358, 6393, 5442, 897, 1745] 35 |
模型构建:
1 | import torch |
output:
1 | # torch.Size([2, 20, 768]) |
训练代码部分:
1 | # from dataset import NerDataset |
evolution:这部分主要是对预测的后处理结果,处理后返回后处理的识别分类元组。
1 | import torch |
output:
1 | 2025-05-21 09:20:21,551 - modelscope - WARNING - Using branch: master as version is unstable, use with caution |
另:
torchcrf包安装问题
解决方法:
1 | pip install pytorch-crf |
总结:
其实本质上NER任务,还是在做分类问题,只是是相对较为复杂的分类问题。