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

使用SpaCy构建自定义 NER 模型

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

点击上方“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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )
将 下载的 Linux 内核源码 linux-5.6.14.tar.gz 拷贝到 Ubuntu 虚拟机中 , 执行
韩曙亮
2023/03/30
87.7K0
【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )
关于如何使用包管理器APT(Advanced Package Tool)进行内核升级更换Ubuntu内核版本
sudo apt install linux-image-5.15.0-91-generic
Tadeic
2024/12/28
2010
【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827
韩曙亮
2023/03/27
2.6K0
【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
【错误记录】编译 Linux 内核报错 ( fatal error: openssl/opensslv.h: No such file or directory )
文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 编译 Linux 内核 , 执行 sudo make 命令 , 开始正式编译 Linux 内核 , 报如下错误 : root@ubuntu:~/kernel/linux-5.6.14# sudo make SYSTBL arch/x86/include/generated/asm/syscalls_32.h SYSHDR arch/x86/include/generated/asm/unistd_32_ia32.h SYSHDR
韩曙亮
2023/03/30
1.8K0
【错误记录】编译 Linux 内核报错 ( fatal error: openssl/opensslv.h: No such file or directory )
Ubuntu Linux 内核版本升级指南:mainline
本篇文章,分享如何使用开源工具,轻松实现包括容器在内的 Ubuntu 环境中的内核版本升级,更好地适配新硬件和解锁内核的新特性。
soulteary
2025/02/06
6130
Ubuntu Linux 内核版本升级指南:mainline
如何在Ubuntu 22.04上安装Linux 内核 6.0?
内核是任何基于 Linux 的操作系统的核心部分,它充当计算机系统软件和硬件之间的桥梁,还提供用户和应用程序与计算机交互所需的接口。内核提供了许多功能,包括进程调度、资源分配、设备管理、中断处理、内存管理和进程。
网络技术联盟站
2022/11/16
4.4K3
如何在Ubuntu 22.04上安装Linux 内核 6.0?
centos 6 编译安装内核
一、基础环境配置 1、配置yum源(centos6官方已经下架,不在维护,yum源需要配置到备用源) [root@centos6 ~]# cat /etc/yum.repos.d/CentOS- CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo [root@centos6 ~]# cd /etc/yum.repos.d/ [root@cen
用户6792968
2022/08/30
1.7K0
centos 6 编译安装内核
构建Linux内核调试环境
构建Linux内核调试步骤 系统版本 当前宿主机内核版本 // 目前的环境是ubuntu[root@ubuntu ~]$ uname -a Linux ubuntu 5.15.0-41-generic #44-Ubuntu SMP Wed Jun 22 14:20:53 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux 调试的内核版本 linux-4.19.25 安装系统组件 qemu-kvm [root@ubuntu ~]$ sudo apt install libvi
用户4700054
2023/02/26
2.8K0
构建Linux内核调试环境
来尝试一下linux内核编译的“苦”
5、内核源码(网络)阅读:tcp_input.c tcp_out.c tcp_ipv4.c tcp.c
用户6280468
2022/03/21
3580
来尝试一下linux内核编译的“苦”
【Linux 内核】编译 Linux 内核 ⑥ ( 安装 OpenSSL | 安装其它依赖库 | 内核编译完成 )
参考 【错误记录】编译 Linux 内核报错 ( fatal error: openssl/opensslv.h: No such file or directory ) 博客 , 编译内核时 , 由于没有安装 OpenSSL 报错 ;
韩曙亮
2023/03/30
22.7K0
【Linux 内核】编译 Linux 内核 ⑥ ( 安装 OpenSSL | 安装其它依赖库 | 内核编译完成 )
【Linux 内核】编译 Linux 内核 ③ ( 安装 ncurses | 安装 flex | 安装 bison | 打开 Linux 内核编译配置菜单 )
命令 , 打开 Linux 内核编译配置菜单 , 进行 编译配置 ; 执行上述命令后 各种报错 , 最终排查完毕后 , 需要安装 ncurses , flex , bison 这
韩曙亮
2023/03/30
24K0
【Linux 内核】编译 Linux 内核 ③ ( 安装 ncurses | 安装 flex | 安装 bison | 打开 Linux 内核编译配置菜单 )
CentOS6.5升级内核到3.10.28
本文适用于CentOS 6.4, CentOS 6.5,估计也适用于其他Linux发行版。
孙杰
2019/10/29
2.1K1
Linux 内核编译(三天吐血经历!)[通俗易懂]
本人大二,东南大学一个软工狗,正在修一门名为《操作系统原理》的坑爹课!前几天做一个实验:编译Linux内核并向其增加一个系统调用。这个实验实在是太让人无语了,各种坑!昨天这个时候,我还在苦苦煎熬中。在今天凌晨四点才做好。为了让其他人少走一些弯路,鄙人就把自己的经验以及教训写下来。里面会有一些不足,希望大家多多指教~
全栈程序员站长
2022/09/15
3.5K0
【错误记录】编译 Linux 内核报错 ( Unable to find the ncurses package. )
文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 编译 Linux 内核 , 执行 make menuconfig 配置菜单命令 , 报如下错误 : root@ubuntu:~/kernel/linux-5.6.14# make menuconfig HOSTCC scripts/basic/fixdep * * Unable to find the ncurses package. * Install ncurses (ncurses-devel or libncurses-dev *
韩曙亮
2023/03/30
1.5K0
【错误记录】编译 Linux 内核报错 ( Unable to find the ncurses package. )
【Linux 内核 内存管理】Linux 内核内存布局 ① ( 查看 Linux 操作系统位数 | 查看 Linux 操作系统软硬件信息 )
命令 , 可以查看 " Linux 内核位数 “ 和 ” 系统的软硬件信息 " ;
韩曙亮
2023/03/30
32.1K0
【Linux 内核 内存管理】Linux 内核内存布局 ① ( 查看 Linux 操作系统位数 | 查看 Linux 操作系统软硬件信息 )
双机调试Linux内核
这种方式调试内核需要两台机器,一台用来运行Linux内核,另一台对内核进行调试。一般有以下三种常用的方案,可以根据电脑的性能或资金状况来选择。可以开两个Linux系统的虚拟机;也可以在物理机系统是linux上面装虚拟机,然后虚拟机运行一个linux;再就是买开发板来调试内核。以下是在windows上开两个虚拟机的流程描述。
yifei_
2022/11/14
4.9K0
双机调试Linux内核
Android Linux内核编译
Android5.0 可以到这里下载: 115网盘礼包码:5lbd7crtk1wz http://115.com/lb/5lbd7crtk1wz
全栈程序员站长
2022/07/05
5K0
【错误记录】编译 Linux 内核报错 ( /bin/sh: 1: flex: not found )
文章目录 一、报错信息 二、解决方案 一、报错信息 ---- 编译 Linux 内核 , 执行 make menuconfig 配置菜单命令 , 报如下错误 : root@ubuntu:~/kernel/linux-5.6.14# make menuconfig UPD scripts/kconfig/mconf-cfg HOSTCC scripts/kconfig/mconf.o HOSTCC scripts/kconfig/lxdialog/checklist.o HOSTC
韩曙亮
2023/03/30
2.7K0
【错误记录】编译 Linux 内核报错 ( /bin/sh: 1: flex: not found )
linux内核编译过程的最终总结版
本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36);然后,配置GNU的启动引导工具grub,成功运行编译成功的内核。
全栈程序员站长
2022/09/15
1.7K0
PVE开启硬件显卡直通功能
接着添加模块(驱动)黑名单,即让GPU设备在下次系统启动之后不使用这些驱动,把设备腾出来给vfio驱动用:
小陈运维
2021/11/19
7.5K0
推荐阅读
相关推荐
【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验