Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用SpaCy构建自定义 NER 模型

使用SpaCy构建自定义 NER 模型

作者头像
deephub
发布于 2021-11-23 08:28:50
发布于 2021-11-23 08:28:50
3.5K04
代码可运行
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA
运行总次数:4
代码可运行

点击上方“Deephub Imba”,关注公众号,好文章不错过 !

什么是NER?

命名实体识别(NER)是一种自然语言处理技术,用于在给定的文本内容中提取适当的实体,并将提取的实体分类到预定义的类别下。简单来说,NER 是一种用于从给定文本中提取诸如人名、地名、公司名称等实体的技术。在信息检索方面,NER 有其自身的重要性。

NER是如何工作的?

在阅读文本后人类可以识别一些常见的实体,如人名、日期等。但是要让计算机做同样的事情,我们必须帮助计算机进行学习才能为我们完成任务。这里就需要需要利用自然语言处理 (NLP) 和机器学习 (ML) 了。NLP 的作用是让计算机通过了解语言的模式和规则来阅读文本、与人类交流、理解他们并对其进行解释。而机器学习的作用是帮助机器及时学习和改进。

我们将 NER 的工作定义为两步过程,1. 识别命名实体 2. 对命名实体进行分类。

让我们举个例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doc = nlp('Mr.Sundar Pichai, the CEO of Google Inc. was born in 1972 in India')
print([(X.text, X.label_) for X in doc.ents])

输出是这样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[('Sundar Pichai', 'PERSON'), ('Google Inc.', 'ORG'), ('1972', 'DATE'), ('India', 'GPE')]

NER 算法可以突出显示和提取给定文本中的特定实体。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
displacy.render(doc, style='ent', jupyter=True)

Spacy 库允许我们通过根据特定上下文更新现有模型来训练 NER,也可以训练新的 NER 模型。在本文中,我们将探讨如何构建自定义 NER 模型以从简历数据中提取教育详细信息。

构建自定义 NER 模型

导入必要的库

就像在启动新项目之前执行仪式一样,我们必须导入必要的库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from __future__ import unicode_literals, print_function

import random
from pathlib import Path
import spacy
from tqdm import tqdm
from spacy.training.example import Example
import pickle

训练数据

首先,我们需要创建实体类别,例如学位、学校名称、位置、百分比和日期,并将相关训练数据提供给 NER 模型。

Spacy 库以包含文本数据和字典的元组形式接收训练数据。字典应该在命名实体的文本和类别中包含命名实体的开始和结束索引。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TRAIN_DATA = [(“Higher School Certificate, Parramatta Marist High School, Westmead (1998),{“entities”:[(0,25,”degree”),(27,56,”school_name”),(58,66,”location”),(68,72,”date”)]}),

(“Bachelor of Business, University of Western Sydney (2005),{“entities”:[(0,20,”degree”),(22,43,”school_name”),(44,50,”location”),(52,56,”date”)]}),

(20072010 BCA (Bachelor of Computer Application) from Khalsa college for women, Amritsar (Affiliated to Guru Nanak Dev University (G.N.D.U) India “,{“entities”:[(0,9,”date”),(12,50,”degree”),(54,78,”school_name”),(80,88,”location”)]}),

(20102013 MCA (Masters in Computer Applications) from Amritsar College of Engineering, Amritsar (Affiliated to Punjab Technical University (P.T.U) India.,{“entities”:[(0,9,”date”),(10,48,”degree”),(54,85,”school_name”),(87,95,”location”)]})]

创建模型

构建自定义模型的第一步是创建一个空白的“en”模型。该空白模型是为了进行NER过程而建立的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = None
output_dir=Path("ner/")
n_iter=100

#load the model

if model is not None:
    nlp = spacy.load(model)  
    print("Loaded model '%s'" % model)
else:
    nlp = spacy.blank('en')  
    print("Created blank 'en' model")

构建流水线

下一步是使用create_pipe函数只使用NER设置操作步骤。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if 'ner' not in nlp.pipe_names:
    ner = nlp.create_pipe('ner')
    nlp.add_pipe(ner, last=True)
else:
    ner = nlp.get_pipe('ner')

训练模型

在开始训练模型之前,我们必须使用ner.add_label()方法将命名实体(标签)的类别添加到' ner ',然后我们必须禁用除' ner '之外的其他组件,因为这些组件在训练时不应该受到影响。我们通过使用nlp.disable_pipes()方法在训练时禁用这些组件。

为了训练“ner”模型,模型必须在训练数据上循环,以获得足够的迭代次数。为此,我们使用n_iter,它被设置为100。为了确保模型不会根据示例的顺序进行泛化,我们将在每次迭代之前使用random.shuffle()函数随机打乱训练数据。

我们使用tqdm()函数来创建进度条。示例中保存训练过程的信息。它存储两个对象,一个用于保存管道的预测,另一个用于保存引用数据。Example.from_dict(doc,annotations)方法用于从预测的文档(doc)和作为字典提供的引用注解(annotation)构造一个Example对象。nlp_update()函数可用于训练识别器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for _, annotations in TRAIN_DATA:
    for ent in annotations.get('entities'):
        ner.add_label(ent[2])
example = []
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
with nlp.disable_pipes(*other_pipes):  # only train NER
    optimizer = nlp.begin_training()
    for itn in range(n_iter):
        random.shuffle(TRAIN_DATA)
        losses = {}
        for text, annotations in tqdm(TRAIN_DATA):
            doc = nlp.make_doc(text)
            example = Example.from_dict(doc, annotations)
            nlp.update(
                [example], 
                drop=0.5,  
                sgd=optimizer,
                losses=losses)
        print(losses)

保存模型

训练完成后变量中的模型会保存在output_dir,并将模型导出为pkl文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if output_dir is not None:
    output_dir = Path(output_dir)
    if not output_dir.exists():
        output_dir.mkdir()
    nlp.to_disk(output_dir)
    print("Saved model to", output_dir)
pickle.dump(nlp, open( "education nlp.pkl", "wb" ))

测试训练的模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doc=nlp("•2015-2017, BE Chemical Engineering, Coimbatore Institute of Technology , India")
for ent in doc.ents:
    print(ent.label_+ '  ------>   ' + ent.text)

输出是这样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
date  ------>   2015-2017
degree  ------>   BE Chemical Engineering
school_name  ------>   Coimbatore Institute of Technology
location  ------>   India

以上使用SpaCy可以快速的训练我们的自定义模型,它的优点是:

  1. SpaCy NER模型只需要几行注释数据就可以快速学习。训练数据越多,模型的性能越好。
  2. 有许多开源注释工具可用于为SpaCy NER模型创建训练数据。

但也会有一些缺点

  1. 歧义和缩写——识别命名实体的主要挑战之一是语言。识别有多种含义的单词是很困难的。
  2. 现在不太常用的词汇。比如人名、地名等,可能会有一些问题

总结

对于从简历中提取实体,我们更喜欢定制的NER而不是预先训练的NER。这是因为预训练的NER模型将只有常见的类别,如PERSON,ORG,GPE等。但是,当我们构建一个定制的NER模型时,我们可以拥有自己的一组类别,这组类别适合于我们正在处理的上下文,比如以下的应用:

  1. 从非结构化文本数据中提取结构-从简历中提取像教育和其他专业信息的实体。
  2. 推荐系统——NER可以通过从一个文档中提取实体并将这些实体存储在关系数据库中来帮助推荐算法。数据科学团队可以创建工具,推荐其他有类似实体的文档。
  3. 客户支持- NER可用于对客户登记的投诉进行分类,并将其分配给组织内应处理该投诉的相关部门。
  4. 高效的搜索算法- NER可以在所有文档上运行,提取实体并单独存储。下一次用户搜索一个词时,该搜索词将与每个文档中更小的实体列表相匹配,这将提高的搜索执行速度。

作者:Abhishek Ravichandran

喜欢就关注一下吧:

点个 在看 你最好看!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5分钟NLP:快速实现NER的3个预训练库总结
在文本自动理解的NLP任务中,命名实体识别(NER)是首要的任务。NER模型的作用是识别文本语料库中的命名实体例如人名、组织、位置、语言等。
deephub
2022/03/12
1.6K0
5分钟NLP:快速实现NER的3个预训练库总结
如何使用 Neo4J 和 Transformer 构建知识图谱
在这篇文章中,我将展示如何使用经过优化的、基于转换器的命名实体识别(NER)以及 spaCy 的关系提取模型,基于职位描述创建一个知识图谱。这里介绍的方法可以应用于其他任何领域,如生物医学、金融、医疗保健等。
深度学习与Python
2022/04/19
2.4K0
如何使用 Neo4J 和 Transformer 构建知识图谱
利用BERT和spacy3联合训练实体提取器和关系抽取器
NLP技术最有用的应用之一是从非结构化文本(合同、财务文档、医疗记录等)中提取信息,这使得自动数据查询能够有用武之地。
磐创AI
2021/08/05
3K0
利用BERT和spacy3联合训练实体提取器和关系抽取器
[自然语言处理|NLP] 命名实体识别(NER)
自然语言处理(NLP)领域中的命名实体识别(NER)是一项关键任务,旨在从文本中提取具有特定意义的实体,如人名、地名、组织机构、日期等。这项技术在信息提取、问答系统、机器翻译等应用中扮演着重要角色。本文将深入探讨NER的定义、工作原理、应用场景,并提供一个基于Python和spaCy库的简单示例代码。
数字扫地僧
2023/11/10
2.8K0
spaCy 2.1 中文模型下载
spaCy是最流行的开源NLP开发包之一,它有极快的处理速度,并且预置了词性标注、句法依存分析、命名实体识别等多个自然语言处理的必备模型,因此受到社区的热烈欢迎。中文版预训练模型包括词性标注、依存分析和命名实体识别,由汇智网提供
用户1408045
2019/07/28
4.2K0
NLP研究者的福音—spaCy2.0中引入自定义的管道和扩展
以前版本的spaCy很难拓展。尤其是核心的Doc,Token和Span对象。他们没有直接实例化,所以创建一个有用的子类将涉及很多该死的抽象(想想FactoryFactoryConfigurationFactory类)。继承无法令人满意,因为它没有提供自定义组合的方法。我们希望让人们开发spaCy的扩展,并确保这些扩展可以同时使用。如果每个扩展都需要spaCy返回一个不同Doc子集,那就没办法实现它了。为了解决这个问题,我们引入了一个新的动态字段(dynamic field),允许在运行时添加新的特性,属性和
AiTechYun
2018/03/05
2.2K0
基于模板的中文命名实体识别数据增强
本文将介绍一种基于模板的中文命名实体识别数据增强方法,自然语言处理中最常见的一个领域就是文本分类。文本分类是给定一段文本,模型需要输出该文本所属的类别。对文本分类进行数据增强较为简单的一种是对文本中的词进行同义词替换、随机删除、随机插入、打乱顺序等。命名实体识别不同于文本分类,但又和文本分类密切相关,因为实体识别是对每一个字或者词进行分类,我们要识别出的是一段字或词构成的短语,因此,上述文本分类中的数据增强可能会让实体进行切断而导致标签和实体不一致。这里,介绍一种基于模板得实体增强方法,能够解决上述得问题的同时,使得模型的性能进一步得到提升。
西西嘛呦
2022/09/23
7990
基于模板的中文命名实体识别数据增强
用维基百科的数据改进自然语言处理任务
自然语言处理(NLP)正在兴起。计算语言学和人工智能正在加入它们的力量,促进突破性发现。虽然研究集中在显著提高NLP技术上,但企业正在把这项技术视为一项战略资产。这种由NLP引导的突破性创新的主要作用是大量可用的文本数据。谈到数字化时,尤其是对于企业来说,重要的是要记住文档是知识的主要来源。
deephub
2021/04/30
1.1K0
基于深度学习的NER(命名实体识别)教程 —— 识别文本中的编号
命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)任务之一,用于识别文本中的特定类别的实体,如人名、地名、组织名、日期、编号等。
IT蜗壳-Tango
2025/03/18
1350
独家 | 快速掌握spacy在python中进行自然语言处理(附代码&链接)
本文简要介绍了如何使用spaCy和Python中的相关库进行自然语言处理(有时称为“文本分析”)。以及一些目前最新的相关应用。
数据派THU
2019/10/29
3.4K0
独家 | 快速掌握spacy在python中进行自然语言处理(附代码&链接)
Qwen2大模型微调入门实战-命名实体识别(NER)任务
以Qwen2作为基座大模型,通过指令微调的方式做高精度的命名实体识别(NER),是学习入门LLM微调、建立大模型认知的非常好的任务。
用户9029617
2024/06/20
1K0
Qwen2大模型微调入门实战-命名实体识别(NER)任务
Qwen2大模型微调入门实战-命名实体识别(NER)任务
以Qwen2作为基座大模型,通过指令微调的方式做高精度的命名实体识别(NER),是学习入门LLM微调、建立大模型认知的非常好的任务。
zenRRan
2024/07/04
2K0
Qwen2大模型微调入门实战-命名实体识别(NER)任务
解码语言:命名实体识别(NER)技术
探索机器如何识别人名、地点和物体 —— 并学习如何打造你自己的命名实体识别(NER)应用程序!
数据科学工厂
2024/12/30
1060
解码语言:命名实体识别(NER)技术
NLP项目:使用NLTK和SpaCy进行命名实体识别
命名实体识别(NER)是信息提取的第一步,旨在在文本中查找和分类命名实体转换为预定义的分类,例如人员名称,组织,地点,时间,数量,货币价值,百分比等。NER用于自然语言处理(NLP)的许多领域,它可以帮助回答许多现实问题,例如:
AiTechYun
2018/09/26
7.4K0
NLP项目:使用NLTK和SpaCy进行命名实体识别
自然语言处理的奥秘与应用:从基础到实践
自然语言处理(Natural Language Processing,NLP)是人工智能领域中备受关注的研究领域之一,它旨在使计算机能够理解、处理和生成自然语言文本。从智能助手到情感分析,NLP技术已经在各种领域中取得了巨大的成功。本文将带您深入探讨NLP的核心原理、常见任务以及如何使用Python和NLP库来实现这些任务。我们将从基础开始,逐步深入,帮助您了解NLP的奥秘。
海拥
2023/09/20
2850
自然语言处理的奥秘与应用:从基础到实践
【他山之石】python从零开始构建知识图谱
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
马上科普尚尚
2020/12/15
4K0
【他山之石】python从零开始构建知识图谱
入门 | 自然语言处理是如何工作的?一步步教你构建 NLP 流水线
计算机非常擅长使用结构化数据,例如电子表格和数据库表。但是我们人类通常用文字交流,而不是使用电子表格来交流。这对计算机来说不是一件好事。
机器之心
2018/08/21
1.7K0
入门 | 自然语言处理是如何工作的?一步步教你构建 NLP 流水线
5分钟NLP - SpaCy速查表
SpaCy 是一个免费的开源库,用于 Python 中的高级自然语言处理包括但不限于词性标注、dependency parsing、NER和相似度计算。它可帮助构建处理和理解大量文本的应用程序可用于多种方向,例如信息提取、自然语言理解或为深度学习提供文本预处理。
deephub
2022/03/12
1.5K0
5分钟NLP - SpaCy速查表
从“London”出发,8步搞定自然语言处理(Python代码)
【新智元导读】自然语言处理是AI的一个子领域,从人们日常沟通所用的非结构化文本信息中提取结构化数据,以便计算机理解。本文用通俗易懂的语言深入浅出的介绍了自然语言处理,并用Python实现了几个非常有趣的实例。
新智元
2018/08/16
9420
从“London”出发,8步搞定自然语言处理(Python代码)
探秘Transformers:用Hugging Face预训练模型实现命名实体识别!
命名实体识别(NER)是自然语言处理中的一项关键任务,旨在从文本中识别并提取出具有特定意义的实体,如人名、地名、组织机构名等。通过NER,计算机可以更好地理解文本,帮助我们从海量文本数据中快速获取有用信息,是许多NLP应用的基础,如信息提取、问答系统等。
Tom2Code
2024/03/02
1.4K0
探秘Transformers:用Hugging Face预训练模型实现命名实体识别!
推荐阅读
相关推荐
5分钟NLP:快速实现NER的3个预训练库总结
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验