📜  构建 spacy 自定义 ner 模型 stackoverflow - Python (1)

📅  最后修改于: 2023-12-03 15:26:35.141000             🧑  作者: Mango

构建 SpaCy 自定义 NER 模型 StackOverflow - Python

在本文中,我们将介绍如何使用 SpaCy 库构建自定义 NER(命名实体识别)模型。

SpaCy

SpaCy 是一个用于自然语言处理(NLP)的 Python 库,可帮助您执行各种 NLP 任务,例如词性标注、命名实体识别、句法分析等。

安装 SpaCy

要安装 SpaCy,请使用以下命令:

pip install spacy

使用以下命令下载模型:

python -m spacy download en_core_web_sm
训练自定义 NER 模型

在此之前,需要将数据集生成 spacy 支持的 jsonl格式,例如:

{"text":"Good morning", "ents": [{"start": 0, "end": 4, "label": "GREETING"}], "title": "Some Title", "date": "2021-07-01"}

下一步,我们需要将数据集分为训练集和测试集。然后,我们将使用训练集来训练我们的自定义 NER 模型,并使用测试集对其进行评估。

import spacy
import random
import json

with open('dataset.jsonl', 'r') as f:
    TRAIN_DATA = json.load(f)

nlp = spacy.load('en_core_web_sm')

if 'ner' not in nlp.pipe_names:
    ner = nlp.create_pipe('ner')
    nlp.add_pipe(ner, last=True)
else:
    ner = nlp.get_pipe('ner')

for _, annotations in TRAIN_DATA:
    for ent in annotations.get('ents'):
        ner.add_label(ent['label'])

# train model
n_iter = 100

for i in range(n_iter):
    random.shuffle(TRAIN_DATA)
    losses = {}

    for text, annotations in TRAIN_DATA:
        nlp.update(
            [text], # text to process
            [annotations], # annotations (ner tags)
            drop=0.5, 
            losses=losses
        )

    print('Iteration:', i, 'Losses', losses)

该模型将在 n_iter=100 次迭代中进行训练,但这个值可以根据您的数据集大小和计算能力进行调整。

评估模型
from spacy.gold import GoldParse
from spacy.scorer import Scorer

with open('test_dataset.jsonl', 'r') as f:
    TEST_DATA = json.load(f)

scorer = Scorer()

for input_, annot in TEST_DATA:
    
    doc_gold_text = nlp.make_doc(input_)
    gold = GoldParse(doc_gold_text, entities=annot['entities'])

    pred_value = nlp(input_)
    scorer.score(pred_value, gold)
    
print(scorer.scores)

结果将返回以下评估指标:

  • 命名实体准确度(Precision)
  • 命名实体召回率(Recall)
  • 命名实体 F1 值(F1-score)
应用自定义 NER 模型

当您的模型训练完成并通过测试后,您可以将其应用于你的自然语言文本。

import spacy

nlp = spacy.load('<path_to_model>')
doc = nlp(u'San Francisco considers banning sidewalk delivery robots')
print([(ent.text, ent.label_) for ent in doc.ents])

结果将返回以下命名实体:

[('San Francisco', 'GPE')]
结论

SpaCy 是一款强大的自然语言处理库,可用于各种 NLP 任务,比如命名实体识别。在本文中,我们介绍了如何使用 SpaCy 构建自定义 NER 模型并将其应用于自然语言文本。