最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

基于深度学习的NER(命名实体识别)教程 —— 识别文本中的编号

网站源码admin3浏览0评论

基于深度学习的NER(命名实体识别)教程 —— 识别文本中的编号

1. 任务介绍

1.1 什么是NER(命名实体识别)

命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)任务之一,用于识别文本中的特定类别的实体,如人名、地名、组织名、日期、编号等。

NER 在许多领域都有重要应用,例如:

  • 金融行业:识别发票号、交易编号等。
  • 电商行业:提取订单号、物流单号。
  • 法律行业:识别案件编号、法规条款。

本教程的目标是:

  • 从文本中提取代表特定含义的编号(如订单号、合同编号、身份证号等)。
  • 解决编号格式多样的问题(如ORD-202301、A-123456、#456-XY 等)。
  • 使用深度学习NER模型进行训练和部署

2. 数据准备

2.1 数据来源与标注

为了训练NER模型,我们需要准备带标注的文本数据

数据来源

  • 企业历史数据:如订单记录、合同文本。
  • 公开数据集:可以参考 CONLL-2003 这样的NER数据集。
  • 人工标注数据:使用工具进行数据标注。

2.2 标注数据格式

NER数据通常使用 BIO(Begin-Inside-Outside)标注方案。

示例文本:

代码语言:javascript代码运行次数:0运行复制
客户的订单号是 ORD-202301,请尽快处理。

BIO格式标注:

代码语言:javascript代码运行次数:0运行复制
客户 O
的 O
订单号 O
是 O
ORD B-NUMBER
- I-NUMBER
202301 I-NUMBER
, O
请 O
尽快 O
处理 O
。 O

2.3 标注工具推荐

  • Label Studio(开源、支持NER任务)
  • Prodigy(商业化工具,适用于大规模标注)
  • spaCy annotation tool(适用于快速标注小型数据集)

3. 选择预训练模型

3.1 适用于NER任务的模型

  • BERT(适用于一般NER任务)
  • RoBERTa(增强版BERT,适合更复杂任务)
  • DeBERTa(更强的上下文理解能力)
  • GPT(适合少量数据的微调)

3.2 预训练模型的优势

  • 减少训练时间:无需从零开始训练。
  • 适应多种文本格式:可以泛化不同的编号类型。
  • 支持微调:可以在小数据集上继续训练。

4. 训练NER模型

4.1 安装必要的库

代码语言:javascript代码运行次数:0运行复制
pip install transformers datasets seqeval torch

4.2 加载数据集

代码语言:javascript代码运行次数:0运行复制
from datasets import load_dataset

dataset = load_dataset("json", data_files={
    "train": "train.json",
    "test": "test.json"
})

数据格式示例(train.json):

代码语言:javascript代码运行次数:0运行复制
{
    "tokens": ["客户", "的", "订单号", "是", "ORD", "-", "202301", ",", "请", "处理", "。"],
    "ner_tags": [0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0]
}

4.3 加载预训练模型并进行微调

代码语言:javascript代码运行次数: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)

4.4 训练NER模型

代码语言:javascript代码运行次数:0运行复制
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()

5. 评估与优化

5.1 评估指标

使用 seqeval 计算 F1-score。

代码语言:javascript代码运行次数:0运行复制
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))

5.2 误识别优化

  • 增加训练数据:涵盖更多编号格式。
  • 数据增强:如替换编号前缀(ORD→INV)。
  • 调整超参数:优化学习率、批量大小等。
  • 尝试CRF层:可以提升模型的序列识别能力。

6. 部署模型

6.1 使用 FastAPI 部署 API

代码语言:javascript代码运行次数:0运行复制
pip install fastapi uvicorn

创建 app.py

代码语言:javascript代码运行次数:0运行复制
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)

运行:

代码语言:javascript代码运行次数:0运行复制
uvicorn app:app --reload

7. 结论

本教程介绍了如何使用深度学习NER模型 从文本中提取编号,包括 数据标注、模型训练、优化与部署,并提供了详细的代码示例。

如果你对 不同类型的编号 识别有特定需求,如 车牌号、银行账号等,可以微调模型或调整训练数据,进一步提升识别准确率!

发布评论

评论列表(0)

  1. 暂无评论