【自然语言处理】扩展命名实体识别器(NER)以使用spaCy标记新实体

news2025/2/4 13:03:07

自我介绍

  • 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【架构师酒馆】和【开发者开聊】,有更多的内容分享,谢谢大家收藏。
  • 企业架构师需要比较广泛的知识面,了解一个企业的整体的业务,应用,技术,数据,治理和合规。之前4年主要负责企业整体的技术规划,标准的建立和项目治理。最近一年主要负责数据,涉及到数据平台,数据战略,数据分析,数据建模,数据治理,还涉及到数据主权,隐私保护和数据经济。 因为需要,比如数据资源入财务报表,另外数据如何估值和货币化需要财务和金融方面的知识,最近在学习财务,金融和法律。打算先备考CPA,然后CFA,如果可能也想学习法律,备战律考。
  • 欢迎爱学习的同学朋友关注,也欢迎大家交流。微信小号【ca_cea】

标记单词的顺序-简洁明了。

NLP

Figure 1: Colour-coded recognised entities

这篇文章假设读者对从文本中提取实体有一些概念,并希望进一步了解新的自定义实体识别的最先进技术以及如何使用这些技术。然而,如果你是NER问题的新手,请在这里阅读。

话虽如此,这篇文章的目的是描述spaCy的预训练自然语言处理(NLP)核心模型用于学习识别新实体的使用。来自spacy的现有核心NLP模型被训练来识别各种实体,如图2所示。

NLP

Figure 2: Existing entity recognised by spaCy core models (source)

尽管如此,用户可能希望构建自己的实体来解决问题需求。在这种情况下,预先存在的实体会使自己变得不足,因此,需要训练NLP模型来完成这项工作。感谢spaCy的文档和预训练模型,这不是很困难。

如果你不想进一步阅读,而是想学习如何使用它,那么请使用这款jupyter笔记本——它是独立的。无论如何,我也建议浏览一下。

数据预处理

就像任何需要输入和输出才能学习的监督学习算法一样,类似地,这里的输入是文本,输出是根据BILOO编码的,如图3所示。然而,尽管存在不同的方案,Ratinov和Roth表明,最小Begin,In,Out(IOB)方案比明确标记边界令牌的BILOO方案更难学习。spaCy提供了一个IOB编码的例子,我发现它与所提供的参数一致。因此,从这里开始,任何提及注释方案的内容都将是BILOO。

NLP

Figure 3: BILUO scheme

下图显示了BILOO编码实体的简短示例。

NLP

要用BILOO方案对您进行编码,有三种可能的方法。其中一种方法是创建一个spaCy-doc表单文本字符串,并将从doc中提取的令牌保存在用新行分隔的文本文件中。然后根据BILOO方案对每个令牌进行标记。人们可以创建自己的令牌并对其进行标记,但可能会降低性能——稍后将对此进行详细介绍。以下是如何标记您的数据,以便以后在NER培训中使用。

import spacy
import numpy as np
import pandas as pd

nlp = spacy.load('en')
text = ("When Sebastian Thrun started working on self-driving cars at "
        "Google in 2007, few people outside of the company took him "
        "seriously. “I can tell you very senior CEOs of major American "
        "car companies would shake my hand and turn away because I wasn’t "
        "worth talking to,” said Thrun, in an interview with Recode earlier "
        "this week.")
doc = nlp(text)
words = []
labels = []

for token in doc:
    words.append(token.text)
    labels.append('O') # As most of token will be non-entity (OUT). Replace this later with actual entity a/c the scheme.

df = pd.DataFrame({'word': words, 'label': labels})
df.to_csv('ner-token-per-line.biluo', index=False) # biluo in extension to indicate the type of encoding, it is ok to keep csv

上面的片段使注释变得更容易,但这不能直接输入到spaCy模型中进行学习。尽管如此,spaCy提供的另一个模块GoldParse解析模型所接受的保存格式。使用下面的snipped从保存的文件中读取数据,并将其解析为模型接受的形式。

dpath = 'ner-token-per-line.biluo'

df = pd.read_csv(dpath, sep=',')
words  = df.word.values
ents = df.label.values
text = ' '.join(words)

from spacy.gold import GoldParse

doc = nlp.make_doc(text)
g = GoldParse(doc, entities=ents)
X = [doc]
Y = [g]

另一种方式是使用每个实体/标签的偏移索引,即实体的开始和结束(即,实体的开始、内部、最后部分结合在一起)的索引与标签一起提供,例如:

text = ("When Sebastian Thrun started working on self-driving cars at "
        "Google in 2007, few people outside of the company took him "
        "seriously. “I can tell you very senior CEOs of major American "
        "car companies would shake my hand and turn away because I wasn’t "
        "worth talking to,” said Thrun, in an interview with Recode earlier "
        "this week.")
g = {'entities': [(5, 20, 'PERSON'), (61, 67, 'ORG'), (71, 75, 'DATE'), (173, 181, 'NORP'), 
          (271, 276, 'PERSON'), (299, 305, 'ORG'), (306, 323, 'DATED')]}

X = [text]
Y = [g]

第三个与第一个类似,只是在这里我们可以修复自己的令牌并标记它们,而不是用NLP模型生成令牌然后标记它们。然而,在我的实验中,虽然这也可以起作用,但我发现这会降低性能。尽管如此,以下是您可以做到的方法:

# words = <list of user token> for example space splitted tokens  
spaces = [True]*len(words)
spaces[-1] = False # so remove space in last
doc = Doc(nlp.vocab, words=words, spaces=spaces) # Custom Doc
g = GoldParse(doc, entities=ents)
X = [doc]
Y = [g]

训练

在对数据进行预处理并准备好进行训练后,我们需要在模型NER管道中进一步添加新实体的词汇表。核心spaCy模型有三个管道:Tagger、Parser和NER。此外,我们需要禁用标记器和解析器管道,因为我们将只训练NER管道,尽管可以同时训练所有其他管道。点击此处了解更多信息。

add_ents = ['DATED'] # The new entity
# Piplines in core pretrained model are tagger, parser, ner. Create new if blank model is to be trained using `spacy.blank('en')` else get the existing one.
if "ner" not in nlp.pipe_names:
    ner = nlp.create_pipe("ner") # "architecture": "ensemble" simple_cnn ensemble, bow # https://spacy.io/api/annotation
    nlp.add_pipe(ner)
else:
    ner = nlp.get_pipe("ner")
prev_ents = ner.move_names # All the existing entities recognised by the model
print('[Existing Entities] = ', ner.move_names)
for ent in add_ents:
    ner.add_label(ent)
    
new_ents = ner.move_names
# print('\n[All Entities] = ', ner.move_names)
print('\n\n[New Entities] = ', list(set(new_ents) - set(prev_ents)))
## Training
model = None # Since we are training a fresh model not a saved model
n_iter = 20
with nlp.disable_pipes(*other_pipes):  # only train ner
    # optimizer = nlp.begin_training()
    if model is None:
        optimizer = nlp.begin_training()
    else:
        optimizer = nlp.resume_training()
    for i in range(n_iter):
        losses = {}
        nlp.update(X, Y,  sgd=optimizer, drop=0.0, losses=losses)
        # nlp.entity.update(d, g)
        print("Losses", losses)

在这里,对于训练,丢弃被指定为0.0,以故意过度拟合模型,并表明它可以学习识别所有新实体。

推论

训练模型的结果:

doc = nlp(text)
for ent in doc.ents:
    print(ent.text, ent.label_)
    
# Output  
Sebastian Thrun PERSON
Google ORG
2007 DATE
American NORP
Thrun PERSON
Recode ORG
earlier this week. DATED

spaCy还提供了一种生成颜色编码实体的方法(如图1所示),可以使用以下片段在web浏览器或笔记本电脑中查看这些实体:

from spacy import displacydisplacy.render(doc, style="ent") # if from notebook else displacy.serve(doc, style="ent") generally

注意事项

这里提供的培训新实体的过程可能看起来有点容易,但它确实带来了警告。在训练时,新训练的模型可能会忘记识别旧实体,因此,强烈建议将一些文本与先前训练的实体中的实体混合,除非旧实体对解决问题并不重要。其次,学习更具体的实体可能比学习广义实体更好。

结论

我们看到,开始学习新的实体并不难,但人们确实需要尝试不同的注释技术,并选择最适合给定问题的方法。

其他注意事项

  • 这篇文章进一步扩展了spaCy在这里提供的例子。
  • 整个代码块可以在这个jupyter笔记本中访问。自述文件还包含如何安装spaCy库以及在安装和加载预训练模型期间调试错误问题。
  • 阅读Akbik等人的这篇论文。它应该有助于理解序列标记背后的算法,即多个单词实体。

本文:【自然语言处理】扩展命名实体识别器(NER)以使用spaCy标记新实体 | 开发者开聊

欢迎收藏  【全球IT瞭望】,【架构师酒馆】和【开发者开聊】.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用C/C++实现MSML协议栈的详细介绍

一、MSML协议简介 MSML&#xff08;Media Server Markup Language&#xff09;是一种基于XML的标记语言&#xff0c;用于控制媒体服务器。它是媒体服务器控制协议的一种&#xff0c;允许第三方应用与媒体服务器进行交互&#xff0c;实现对媒体流的创建、修改和释放等操作。MSM…

Elasticsearch可视化平台Kibana [ES系列] - 第498篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 全…

W3 Total Cache Pro v2.6.0 – WordPress 插件

W3 Total Cache Pro v2.6.0&#xff1a;优化WordPress性能的专业解决方案 一、引言 在数字化的世界中&#xff0c;网站性能对于用户体验和搜索引擎排名至关重要。WordPress作为全球最受欢迎的内容管理系统之一&#xff0c;提供了大量的插件来帮助网站所有者优化其性能。其中&a…

数字人平台哪家好!

数字人是指利用人工智能技术&#xff0c;通过计算机生成或模拟人类的外貌、声音、动作和表情等特征&#xff0c;从而创造出具有一定个性和情感的虚拟角色。数字人可以用于于娱乐、教育、营销、服务等多个领域&#xff0c;为用户提供更加丰富和互动的体验。 目前&#xff0c;市场…

『JavaScript』深入理解JavaScript字符串的基础操作与内置方法

&#x1f4e3;读完这篇文章里你能收获到 学习了JavaScript中字符串的基本操作掌握了JavaScript字符串的多种内置方法了解了JavaScript中的模板字符串和插值表达式熟悉了如何在JavaScript中使用正则表达式与字符串方法结合 文章目录 一、基本操作1. 创建字符串2. 字符串长度3. …

Java架构师系统架构设计实践

目录 1 导语2 架构设计实践本章概述3 架构设计要素概述和规划4 架构设计模式5 架构设计输入6 架构设计输出7 架构设计要素总结 想学习架构师构建流程请跳转&#xff1a;Java架构师系统架构设计 1 导语 Java架构师在进行系统架构设计时&#xff0c;需要综合考虑多个方面&#…

洛谷 P2367 语文成绩 刷题笔记

P2367 语文成绩 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 差分 令a[i]为b[i]数组的前缀和 a[n]b[1]b[2]b[3].....b[n]; a[n-1]b[1]b[2]b[3].....b[n-1]; 构造差分数组 b[i]a[i]-a[i-1]; 有什么好处 当我们想对a[l]--a[r]范围内所有数据加上一个数x 不必循环 for(i…

C++力扣题目150--逆波兰表达式求值

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

前端---html 的基本结构

1. 结构代码 <!DOCTYPE html> <html><head> <meta charset"UTF-8"><title>网页标题</title></head><body>网页显示内容</body> </html>第一行<!DOCTYPE html>是文档声明, 用来指定页…

C# 使用xUnit进行单元测试

目录 写在前面 操作步骤 执行结果 写在前面 xUnit.net 是 NUnit 的作者Jim Newkirk搞的一个新的单元测试框架&#xff0c;目的是解决 NUnit 存在的一些问题和缺点&#xff0c;并在框架中加入一些最佳实践和扩展能力。 主要的改进点如下&#xff1a; 为每个测试方法产生一个…

漏洞复现-泛微OA xmlrpcServlet接口任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

什么是动态IP?静态IP和动态IP有什么区别?

动态IP(Dynamic IP)和静态IP(Static IP)它是指在计算机网络中分配给设备的两种不同类型的IP地址。 动态IP是指每次设备连接到网络时&#xff0c;网络服务提供商(ISP)IP地址的动态分配。当设备重新连接到网络时&#xff0c;它可能会被分配到不同的IP地址。动态IP适用于传统的家…

龙蜥开源操作系统能解决CentOS 停服造成的空缺吗?

龙蜥开源操作系统能解决CentOS 停服造成的空缺吗&#xff1f; 本文图片来源于龙蜥&#xff0c;仅做介绍时引用用途&#xff0c;版权归属龙蜥和相关设计人员。 一、《国产服务器操作系统发展报告&#xff08;2023&#xff09;》称操作系统已步入 2.0 时代&#xff0c;服务器操作…

【Leetcode 25】K 个一组翻转链表 —— 递归

25. K 个一组翻转链表 给你链表的头节点head&#xff0c;每k个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是k的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改…

2024深入评测CleanMyMac X4.14.6破解版新的功能

随着时间的推移&#xff0c;我们的Mac电脑往往会变得越来越慢&#xff0c;存储空间变得越来越紧张&#xff0c;这时候一个优秀的清理工具就显得尤为重要。作为一款备受好评的Mac清理工具&#xff0c;它能够为你的Mac带来全方位的清理和优化。在本文中&#xff0c;我们将深入评测…

Mac 右键拷贝文件失效

问题&#xff1a;Mac 右键拷贝文件失效&#xff0c;有时候拷贝可以成功&#xff0c;有时候拷贝不成功 发现问题所在&#xff1a;开了百度翻译的划词&#xff0c; 解决&#xff1a;把划词关掉就好了&#xff0c;或者设置划词快捷键翻译就好了&#xff0c;反正就不要一划就翻译那…

7.2 uvm_resource_db in UVM

uvm_resource_db是一个类型参数化 type-parameterized的类&#xff0c;它是资源数据库顶部的一个方便层(convenience layer)。这个便利层简化了对低级数据库的访问&#xff0c;并且没有添加新功能。因此&#xff0c;uvm_resource_db不是从uvm_resource类派生的。以下uvm_resour…

点坐标标签的可视化

说明 txt标签中按x&#xff0c;y格式存放点标签&#xff0c;如&#xff1a; 需要将这些点可视化在对应的图片上。 实现 import matplotlib.pyplot as plt# 读取包含点坐标的 txt 文件 file_path E:\projects\json\CDY_2015-berries.txt with open(file_path, r) as file:da…

Tg5032smn:高稳定性105℃高温

TG5032SMN是一款频率范围10MHz ~ 54MHz,具有高稳定的TCXO晶振&#xff0c;可与CMOS或限幅正弦输出。外部尺寸5.0 3.2 1.45mm&#xff0c;超小型,质地轻。该系列晶振的额定工作范围-40℃~&#xfe62;105C内可高稳定性工作&#xff0c;使得信号频率的误差很小。TG5032SMN与其他…

vue虚拟列表展示

效果图 <template><!-- 总体高度区域 --><divref"listWrap"class"m-container"scroll"scrollListener"><div:style"handleContainerHeight()"><!-- 可视区域 --><divclass"m-area":style&…