transformers命名体识别

命名体识别(Named Entity Recognition,简称NER)是自然语言处理(Natural Language Processing, NLP)领域中的一项关键技术,其主要任务是从非结构化的文本数据中自动识别并抽取具有特定意义的实体信息。这些实体通常是指人名、地名、组织机构名、日期时间、货币金额、百分比等具有特定类别属性的词汇或短语。

在实际应用中,命名实体识别有助于构建更丰富的信息索引,对于信息检索、问答系统、机器翻译、情感分析和知识图谱构建等领域都至关重要。例如,在新闻文章中,通过命名实体识别技术可以抽取出事件涉及的人物、地点及时间;在医疗文本中,可以定位病人的疾病名称、药物名称以及医学检查项目等关键信息。

实现命名实体识别的方法通常包括基于规则的方法、统计模型方法以及近年来广泛应用的深度学习方法。现代的命名实体识别系统常利用神经网络模型如双向长短期记忆网络(Bi-LSTM)、条件随机场(CRF)以及BERT等预训练模型来提升识别精度。这些模型能够根据上下文信息对词语进行标注,从而准确地识别出文本中的各类命名实体及其类别标签。

下面介绍简单如何使用transformers解决命名体识别任务:

# 命名体识别任务 **ForTokenClassification
import numpy as np
import evaluate
from datasets import load_dataset, DatasetDict
from transformers import AutoTokenizer, AutoModelForTokenClassification, TrainingArguments, Trainer, DataCollatorForTokenClassification
# 加载数据集
datasets = DatasetDict.load_from_disk("/ner_data")
# 数据预处理
tokenizer = AutoTokenizer.from_pretrained("../models/chinese-macbert-base")

# 借助word_ids 实现标签映射
def process_function(examples):
    tokenized_exmaples = tokenizer(examples["tokens"], max_length=128, truncation=True, is_split_into_words=True)
    labels = []
    for i, label in enumerate(examples["ner_tags"]):
        word_ids = tokenized_exmaples.word_ids(batch_index=i)
        label_ids = []
        for word_id in word_ids:
            if word_id is None:
                label_ids.append(-100)
            else:
                label_ids.append(label[word_id])
        labels.append(label_ids)
    tokenized_exmaples["labels"] = labels
    return tokenized_exmaples
# 数据处理
tokenized_datasets = datasets.map(process_function, batched=True)
tokenized_datasets
# 创建模型
# 获取标签
label_list = datasets["train"].features["ner_tags"].feature.names
print(label_list)
# 对于所有的非二分类任务,切记要指定num_labels,否则就会device错误
model = AutoModelForTokenClassification.from_pretrained("../models/chinese-macbert-base", num_labels=len(label_list))
# 创建评估函数 需要先下载 seqeval模块
seqeval = evaluate.load("../metrics/seqeval")

def eval_metric(pred):
    predictions, labels = pred
    predictions = np.argmax(predictions, axis=-1)

    # 将id转换为原始的字符串类型的标签
    true_predictions = [
        [label_list[p] for p, l in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels) 
    ]

    true_labels = [
        [label_list[l] for p, l in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels) 
    ]

    result = seqeval.compute(predictions=true_predictions, references=true_labels, mode="strict", scheme="IOB2")

    return {
        "f1": result["overall_f1"]
    }
# 配置训练参数
args = TrainingArguments(
    output_dir="models_for_ner",
    per_device_train_batch_size=16,
    per_device_eval_batch_size=32,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    metric_for_best_model="f1",
    load_best_model_at_end=True,
    logging_steps=5,
    num_train_epochs=2
)
# 创建训练器
trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    compute_metrics=eval_metric,
    data_collator=DataCollatorForTokenClassification(tokenizer=tokenizer)
)
# 模型训练
trainer.train()
# 模型预测
from transformers import pipeline
# 使用pipeline进行推理,要指定id2label
model.config.id2label = {idx: label for idx, label in enumerate(label_list)}
print(model.config)
# 如果模型是基于GPU训练的,那么推理时要指定device
# 对于NER任务,可以指定aggregation_strategy为simple,得到具体的实体的结果,而不是token的结果
ner_pipe = pipeline("token-classification", model=model, tokenizer=tokenizer, aggregation_strategy="simple")

ner_pipe("铭铭在重庆上班。")
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯下夜无眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值