语言:
- 中文
标签:
- bert
- pytorch
- 中文
- ner
许可证: apache-2.0
管道标签: 标记分类
小部件:
- 文本: 常建良,男,1963年出生,工科学士,高级工程师
中文命名实体识别(BERT)模型
bert4ner-base-chinese
在人民日报测试集上的评估表现:
BERT在人民日报测试集上的整体表现:
|
准确率 |
召回率 |
F1值 |
BertSoftmax |
0.9425 |
0.9627 |
0.9525 |
在人民日报测试集上达到接近最先进水平。
BertSoftmax网络结构(原生BERT):

使用方式
本项目已开源至实体识别项目:nerpy,支持bert4ner模型,可通过以下命令调用:
>>> from nerpy import NERModel
>>> model = NERModel("bert", "shibing624/bert4ner-base-chinese")
>>> 预测结果, 原始输出, 实体 = model.predict(["常建良,男,1963年出生,工科学士,高级工程师"], split_on_space=False)
实体: [('常建良', 'PER'), ('1963年', 'TIME')]
模型文件组成:
bert4ner-base-chinese
├── 配置文件.json
├── 模型参数.json
├── pytorch模型.bin
├── 特殊标记映射.json
├── 分词器配置.json
└── 词汇表.txt
使用方式(HuggingFace Transformers)
若不使用nerpy,可按如下方式使用模型:
首先将输入通过transformer模型处理,然后需应用bio标记获取实体词汇。
安装包:
pip install transformers seqeval
import os
import torch
from transformers import AutoTokenizer, AutoModelForTokenClassification
from seqeval.metrics.sequence_labeling import get_entities
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
分词器 = AutoTokenizer.from_pretrained("shibing624/bert4ner-base-chinese")
模型 = AutoModelForTokenClassification.from_pretrained("shibing624/bert4ner-base-chinese")
标签列表 = ['I-ORG', 'B-LOC', 'O', 'B-ORG', 'I-LOC', 'I-PER', 'B-TIME', 'I-TIME', 'B-PER']
句子 = "王宏伟来自北京,是个警察,喜欢去王府井游玩儿。"
def 获取实体(句子):
分词结果 = 分词器.tokenize(句子)
输入 = 分词器.encode(句子, return_tensors="pt")
with torch.no_grad():
输出 = 模型(输入).logits
预测 = torch.argmax(输出, dim=2)
字符标签 = [(词, 标签列表[预测结果]) for 词, 预测结果 in zip(分词结果, 预测[0].numpy())][1:-1]
print(句子)
print(字符标签)
预测标签 = [i[1] for i in 字符标签]
实体列表 = []
行实体 = get_entities(预测标签)
for i in 行实体:
词汇 = 句子[i[1]: i[2] + 1]
实体类型 = i[0]
实体列表.append((词汇, 实体类型))
print("句子实体:")
print(实体列表)
获取实体(句子)
输出:
王宏伟来自北京,是个警察,喜欢去王府井游玩儿。
[('王', 'B-PER'), ('宏', 'I-PER'), ('伟', 'I-PER'), ('来', 'O'), ('自', 'O'), ('北', 'B-LOC'), ('京', 'I-LOC'), (',', 'O'), ('是', 'O'), ('个', 'O'), ('警', 'O'), ('察', 'O'), (',', 'O'), ('喜', 'O'), ('欢', 'O'), ('去', 'O'), ('王', 'B-LOC'), ('府', 'I-LOC'), ('井', 'I-LOC'), ('游', 'O'), ('玩', 'O'), ('儿', 'O'), ('。', 'O')]
句子实体:
[('王宏伟', 'PER'), ('北京', 'LOC'), ('王府井', 'LOC')]
训练数据集
中文实体识别数据集
CNER中文实体识别数据集格式示例:
美 B-LOC
国 I-LOC
的 O
华 B-PER
莱 I-PER
士 I-PER
我 O
跟 O
他 O
如需训练bert4ner模型,请参考https://github.com/shibing624/nerpy/tree/main/examples
引用
@software{nerpy,
author = {徐明},
title = {nerpy: 命名实体识别工具包},
year = {2022},
url = {https://github.com/shibing624/nerpy},
}