自然语言处理中的命名实体识别

自然语言处理NLP)领域,命名实体识别(NER)是一项基本任务,它涉及识别文本中的具体实体,如人名、组织名或地点等。本文将详细介绍如何使用Python库spaCy来执行这一任务,包括spaCy的基本用法、模型训练以及如何自定义训练NER模型。

spaCy简介

spaCy是一个开源的Python库,专为大规模文本数据处理而设计,能够理解文本并从中提取信息。它适用于构建信息抽取(IE)或自然语言理解(NLU)系统,也可以用于深度学习文本预处理。spaCy支持分词、词性标注、依存句法分析等功能。

spaCy模型

spaCy提供了许多预训练模型,这些模型能够识别文本中的各种命名实体。由于这些模型是基于统计的,并且极度依赖于训练样本,因此它们可能不适用于所有类型的实体,可能需要根据具体用例进行模型调整。

spaCy的使用示例

首先,需要导入spaCy并加载一个英文模型,例如`en_core_web_sm`。模型的命名约定包括语言代码(例如,`en`表示英语),后面跟着三个部分:类型(`core`表示通用模型,包含词汇、句法、实体和词向量;`depent`表示只包含词汇、句法和实体)、文本类型(网络或新闻)和模型大小(`sm`表示小型,`md`表示中型,`lg`表示大型)。

import spacy nlp = spacy.load('en_core_web_sm') text = "When Sebastian Thrun started working on self-driving cars at Google in 2007, few people outside of the company took him seriously." doc = nlp(text) for entity in doc.ents: print(entity.text, entity.label_)

上述代码展示了如何使用spaCy模型来识别文本中的命名实体。

spaCy的可视化工具

可以使用spaCy的displacy库来可视化命名实体识别的结果。

from spacy import displacy displacy.render(doc, style="ent", jupyter=True)

如果在使用Jupyter Notebook或Google Colab,需要将`jupyter`参数设置为True。

spaCy的处理流程

当使用spaCy模型对象`nlp`处理文本时,spaCy首先将文本分词生成一个`Doc`对象,然后该对象会经过管道中的各个阶段进行处理。默认模型的管道包括词性标注、句法分析和实体识别(NER)三个阶段。每个管道组件处理`Doc`对象后,将其传递给下一个组件/阶段。

自定义训练spaCy NER管道

要训练spaCy的NER管道,需要遵循以下五个步骤:准备训练数据、将数据转换为.spacy格式、创建训练模型的配置文件、填充配置文件所需的参数以及运行训练。

在spaCy中,模型训练是一个迭代过程,模型的预测与标签(真实值)进行比较以计算损失梯度。然后使用损失梯度通过反向传播算法更新模型权重。梯度指示应如何调整权重值,以便模型的预测随着时间的推移更接近或更接近提供的标签。

数据准备

数据准备阶段,可以使用NER标注工具来定义实体类型,并粘贴需要标注的原始数据,选择所需实体的单词并点击`Mark as completed`。完成样本后,复制标注的数据。

("An average-sized strawberry has about 200 seeds on its outer surface and are quite edible.",{"entities":[(17,27,"Fruit")]})

将数据转换为.spacy格式,需要创建一个DocBin对象来存储数据。将遍历数据,并将示例和实体标签添加到DocBin对象中,并将对象保存为.spacy文件。

db = DocBin() # 创建一个DocBin对象 for text, annot in tqdm(train): # 数据在之前的格式 doc = nlp.make_doc(text) # 从文本创建doc对象 ents = [] for start, end, label in annot["entities"]: # 添加字符索引 span = doc.char_span(start, end, label=label, alignment_mode="contract") if span is None: print("Skipping entity") else: ents.append(span) doc.ents = ents # 使用ents标记文本 db.add(doc) db.to_disk("./train.spacy") # 保存docbin对象

创建配置文件,需要访问spaCy训练快速入门指南。在配置页面,选择`ner`作为组件和基于系统可用性的硬件,还可以优化效率(更快的推理,更小的模型,更低的内存消耗)或更高的准确性(可能更大且更慢的模型),这将影响架构、预训练权重和超参数的选择。

完成后,点击右下角的下载按钮下载配置文件。

填充配置文件

保存配置文件到`base_config.cfg`后,可以使用以下命令填充剩余字段。

!python -m spacy init fill-config base_config.cfg config.cfg

该命令将创建一个`config.cfg`文件,将使用它来训练NER管道。配置文件包含训练所需的多个参数,如学习率、优化器、最大步数等。根据需要的配置和知识进行更改。

训练

要训练自定义管道,运行以下命令。

!python -m spacy train config.cfg --output ./output --paths.train ./train.spacy --paths.dev ./train.spacy

由于没有创建验证集,将使用训练文件作为验证,但对于更大的数据集,应该创建一个单独的验证集来验证模型性能。

在Google Colab中,`en_core_web_sm`已经安装,如果本地运行,则可以使用以下命令在笔记本中安装它。

!python -m spacy download en_core_web_sm

如果上述命令由于`en_core_web_lg`向量而抛出错误,则打开`config.cfg`文件并将向量参数更改为`en_core_web_sm`。

[paths] train = null dev = null vectors = "en_core_web_sm" init_tok2vec = null

如果想使用大型模型,可以使用以下命令下载它。

!python -m spacy download en_core_web_lg

一旦管道训练完成,它将把最佳模型存储在输出目录中,可以加载它来测试其他示例。

要加载模型,需要使用spaCy的load函数。

nlp1 = spacy.load(r"./output/model-best") # 加载最佳模型 doc = nlp1("Strawberry is a luscious, red fruit grown on plants belonging to the Rose or Rosaceae family.") # 输入示例文本 doc.ents colors = {'Fruit': "#85C1E9"} options = {"ents": ['Fruit'], "colors": colors} spacy.displacy.render(doc, style="ent", jupyter=True, options=options)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485