IT评测·应用市场-qidao123.com技术社区

标题: NLP:定名实体识别及案例(Bert微调) [打印本页]

作者: 忿忿的泥巴坨    时间: 2024-9-23 03:00
标题: NLP:定名实体识别及案例(Bert微调)
1. 定名实体识别

  定名实体识别(Named Entity Recognition, NER)是自然语言处理中的一种技术,旨在从文本中识别并分类特定的实体。实体通常包罗人名、地名、机构名、时间、日期、货币等。这种识别在很多实际应用中非常重要,如信息提取、自动问答、呆板翻译和文本摘要。
2. 利用Bert微调模型进行定名实体识别

2.1 BIO标记

  BIO标记法是定名实体识别中的一种常用数据标注方案,用于标记文本中每个单词的标签,明白它是属于实体的哪部分。BIO 标记法通过B-、I- 和O三个前缀来表示定名实体的边界和布局:

BIO标记方法中通常包含:PER(人名)、ORG(构造名)、LOC(地名)和MISC(变乱、产品、国籍、语言)
2.2 数据集介绍

  这里利用NER使命中常用的数据集:CoNLL-2003,该数据集最早由 CoNLL(Conference on Computational Natural Language Learning)共享使命发布,广泛应用于自然语言处理中的 NER 使命。该数据会集训练集共14041条,验证集共3250条,测试集共3453。训练会集的数据如下:
  1. {
  2.     "chunk_tags": [11, 12, 12, 21, 13, 11, 11, 21, 13, 11, 12, 13, 11, 21, 22, 11, 12, 17, 11, 21, 17, 11, 12, 12, 21, 22, 22, 13, 11, 0],
  3.     "id": "0",
  4.     "ner_tags": [0, 3, 4, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  5.     "pos_tags": [12, 22, 22, 38, 15, 22, 28, 38, 15, 16, 21, 35, 24, 35, 37, 16, 21, 15, 24, 41, 15, 16, 21, 21, 20, 37, 40, 35, 21, 7],
  6.     "tokens": ["The", "European", "Commission", "said", "on", "Thursday", "it", "disagreed", "with", "German", "advice", "to", "consumers", "to", "shun", "British", "lamb", "until", "scientists", "determine", "whether", "mad", "cow", "disease", "can", "be", "transmitted", "to", "sheep", "."]
  7. }
复制代码
关于这个数据集,每个部分的详细含义如下:

  1. {'O': 0, 'B-PER': 1, 'I-PER': 2, 'B-ORG': 3, 'I-ORG': 4, 'B-LOC': 5, 'I-LOC': 6, 'B-MISC': 7, 'I-MISC': 8}
复制代码
依据这个信息,European Commission被标记为ORG。

2.3 数据labels准备

  由于利用BertTokenizer处理数据的tokens时,利用WordPiece分词算法时大概会将一个完整的单词拆分成了多个,全部训练数据会集的ner_tags并不能直接作为后续分类器BertForTokenClassification的labels用于训练。在这种情况下,标签必要与每个子词对齐,可以采用如下规则:

  1. tokens = ['Ap', '##ple', 'is', 'a', 'technology', 'company']
  2. labels = ['B-ORG', 'I-ORG', 'O', 'O', 'O', 'O']
复制代码
2.4 Bert微调

  1. from datasets import load_dataset
  2. from transformers import BertTokenizerFast, BertForTokenClassification
  3. from transformers import TrainingArguments, Trainer
  4. # 加载 CoNLL-2003 数据集
  5. dataset = load_dataset("conll2003")
  6. train_dataset = dataset["train"]
  7. eval_dataset = dataset["validation"]
  8. test_dataset = dataset["test"]
  9. # 加载 BERT tokenizer 和模型
  10. tokenizer = BertTokenizerFast.from_pretrained("bert-base-cased")
  11. label_list = dataset["train"].features["ner_tags"].feature.names
  12. print(train_dataset[0])
  13. def tokenize_and_align_labels(examples):
  14.     tokenized_inputs = tokenizer(examples["tokens"], truncation=True, padding="max_length",
  15.                                  is_split_into_words=True)
  16.     labels= []
  17.     for i, label in enumerate(examples["ner_tags"]):
  18.         word_ids = tokenized_inputs.word_ids(batch_index=i)
  19.         previous_word_idx = None
  20.         label_ids = []
  21.         for word_idx in word_ids:
  22.             if word_idx is None:
  23.                 label_ids.append(-100)
  24.             elif word_idx != previous_word_idx:
  25.                 label_ids.append(label[word_idx])
  26.             else:
  27.                 label_ids.append(label[word_idx])
  28.             previous_word_idx = word_idx
  29.         labels.append(label_ids)
  30.     tokenized_inputs["labels"] = labels
  31.     print(labels[0])
  32.     print(len(tokenized_inputs.input_ids[0]),len(labels[0]))
  33.     return tokenized_inputs
  34. train_dataset = train_dataset.map(tokenize_and_align_labels, batched=True)
  35. eval_dataset = eval_dataset.map(tokenize_and_align_labels, batched=True)
  36. test_dataset = test_dataset.map(tokenize_and_align_labels, batched=True)
  37. model= BertForTokenClassification.from_pretrained("bert-base-cased",
  38.                                                   num_labels=len(label_list))
  39. training_args = TrainingArguments(
  40.     output_dir='./results',          # 输出目录
  41.     eval_strategy="epoch",     # 每个 epoch 进行评估
  42.     learning_rate=2e-5,              # 学习率
  43.     per_device_train_batch_size=16,  # 训练 batch size
  44.     per_device_eval_batch_size=16,   # 评估 batch size
  45.     num_train_epochs=3,              # 训练 epoch 数
  46.     weight_decay=0.01,               # 权重衰减
  47. )
  48. # 使用 Trainer API
  49. trainer = Trainer(
  50.     model=model,                      # 待训练的模型
  51.     args=training_args,               # 训练参数
  52.     train_dataset=train_dataset,  # 训练数据集
  53.     eval_dataset=eval_dataset,  # 验证数据集
  54.     tokenizer=tokenizer               # 使用的 tokenizer
  55. )
  56. trainer.train()
  57. eval_results = trainer.evaluate()
  58. print(eval_results)
  59. pred_results = trainer.predict(test_dataset)
  60. print(pred_results)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4