命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)任务之一,用于识别文本中的特定类别的实体,如人名、地名、组织名、日期、编号等。
NER 在许多领域都有重要应用,例如:
本教程的目标是:
为了训练NER模型,我们需要准备带标注的文本数据。
数据来源:
CONLL-2003
这样的NER数据集。NER数据通常使用 BIO
(Begin-Inside-Outside)标注方案。
示例文本:
客户的订单号是 ORD-202301,请尽快处理。
BIO格式标注:
客户 O
的 O
订单号 O
是 O
ORD B-NUMBER
- I-NUMBER
202301 I-NUMBER
, O
请 O
尽快 O
处理 O
。 O
Label Studio
(开源、支持NER任务)Prodigy
(商业化工具,适用于大规模标注)spaCy annotation tool
(适用于快速标注小型数据集)BERT
(适用于一般NER任务)RoBERTa
(增强版BERT,适合更复杂任务)DeBERTa
(更强的上下文理解能力)GPT
(适合少量数据的微调)pip install transformers datasets seqeval torch
from datasets import load_dataset
dataset = load_dataset("json", data_files={
"train": "train.json",
"test": "test.json"
})
数据格式示例(train.json):
{
"tokens": ["客户", "的", "订单号", "是", "ORD", "-", "202301", ",", "请", "处理", "。"],
"ner_tags": [0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0]
}
from transformers import AutoModelForTokenClassification, AutoTokenizer, TrainingArguments, Trainer
model_name = "bert-base-uncased"
model = AutoModelForTokenClassification.from_pretrained(model_name, num_labels=3)
tokenizer = AutoTokenizer.from_pretrained(model_name)
training_args = TrainingArguments(
output_dir="./ner_model",
evaluation_strategy="epoch",
save_strategy="epoch",
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=5,
weight_decay=0.01,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset["train"],
eval_dataset=dataset["test"]
)
trainer.train()
使用 seqeval
计算 F1-score。
from seqeval.metrics import classification_report
y_true = [["O", "O", "O", "O", "B-NUMBER", "I-NUMBER", "I-NUMBER", "O"]]
y_pred = [["O", "O", "O", "O", "B-NUMBER", "I-NUMBER", "I-NUMBER", "O"]]
print(classification_report(y_true, y_pred))
pip install fastapi uvicorn
创建 app.py
:
from fastapi import FastAPI
from transformers import pipeline
token_classifier = pipeline("ner", model="./ner_model")
app = FastAPI()
@app.post("/predict/")
def predict(text: str):
return token_classifier(text)
运行:
uvicorn app:app --reload
本教程介绍了如何使用深度学习NER模型 从文本中提取编号,包括 数据标注、模型训练、优化与部署,并提供了详细的代码示例。
如果你对 不同类型的编号 识别有特定需求,如 车牌号、银行账号等,可以微调模型或调整训练数据,进一步提升识别准确率!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。