📅  最后修改于: 2023-12-03 15:26:35.141000             🧑  作者: Mango
在本文中,我们将介绍如何使用 SpaCy 库构建自定义 NER(命名实体识别)模型。
SpaCy 是一个用于自然语言处理(NLP)的 Python 库,可帮助您执行各种 NLP 任务,例如词性标注、命名实体识别、句法分析等。
要安装 SpaCy,请使用以下命令:
pip install spacy
使用以下命令下载模型:
python -m spacy download en_core_web_sm
在此之前,需要将数据集生成 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)
结果将返回以下评估指标:
当您的模型训练完成并通过测试后,您可以将其应用于你的自然语言文本。
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 模型并将其应用于自然语言文本。