Transformers实战之实战命名实体识别
实战命名实体识别任务
一、命名实体识别简介
-
命名实体识别(Named Entity Recognition, 简称NER)是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。 通常包括两部分:① 实体边界识别 ② 确定实体类别(人名、地名、机构名或其他)。例:“小明在北京上班”:
实体类别 实体 地点 北京 人物 小明 -
数据标注体系:IOB1、IOB2、IOE1、IOE2、IOBES、BILOU
-
IOB2标注:
- I表示实体内部,O表示实体外部,B表示实体开始
- B/I-XXX,XXX表示具体的类别
- 示例:
标记 说明 B-Person 人名开始 I-Person 人名中间 B-Organization 组织名开始 I-Organization 组织名中间 O 非命名实体 -
IOBES标注:
- I表示实体内部,O表示实体外部,B表示实体开始,E表示实体结束,S表示一个词单独形成一个命名实体
- 有时也会用M代替I,但本质是同一含义
-
简单示例

二、代码实战
模型结构(ModelForTokenClassification):
1 | class BertForTokenClassification(BertPreTrainedModel): |
2.1 导入相关包
1 | from transformers import AutoTokenizer, AutoModelForTokenClassification, TrainingArguments, Trainer, DataCollatorForTokenClassification |
2.2 加载数据集
1 | # 如果可以联网,直接使用load_dataset进行加载 |
ner_datasets数据集格式:
1 | {'id': '0', |
其中的ner_tags表示标注的类别,0表示O,1表示B-PER,2表示I-PER,3表示B-ORG,4表示I-ORG,5表示B-LOC,6表示I-LOC(PER:人名,ORG:组织名,LOC:地点名)
可以通过ner_datasets[“train”].features查看数据集的具体格式:
1 | {'id': Value(dtype='string', id=None), |
2.3 数据集预处理
1 | tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-macbert-base") |
划分好的数据集:
1 | DatasetDict({ |
处理过后的第0条数据:
1 | {'id': '0', 'tokens': ['海', '钓', '比', '赛', '地', '点', '在', '厦', '门', '与', '金', '门', '之', '间', '的', '海', '域', '。'], 'ner_tags': [0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 5, 6, 0, 0, 0, 0, 0, 0], 'input_ids': [101, 3862, 7157, 3683, 6612, 1765, 4157, 1762, 1336, 7305, 680, 7032, 7305, 722, 7313, 4638, 3862, 1818, 511, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'labels': [-100, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 5, 6, 0, 0, 0, 0, 0, 0, -100]} |
2.4 创建模型
1 | # 对于所有的非二分类任务,切记要指定num_labels,否则就会device错误 |
2.5 创建评估函数
1 | seqeval = evaluate.load("seqeval") |
2.6 配置训练参数
1 | args = TrainingArguments( |
2.7 创建训练器
1 | trainer = Trainer( |
2.8 模型训练
1 | trainer.train() |
2.9 模型预测
1 | from transformers import pipeline |
参考资料:
[1] 【手把手带你实战HuggingFace Transformers-入门篇】基础知识与环境安装
[2] 【Github项目地址】






