知识图谱入门——10:使用 spaCy 进行命名实体识别(NER)的进阶应用:基于词袋的实体识别与知识抽取

news2024/10/5 19:40:14

在构建知识图谱的过程中,如何准确地识别和提取实体是关键。spaCy 提供了强大的命名实体识别(NER)功能,我们可以结合自定义规则和工具来实现更精准的实体抽取。本文将详细探讨如何在 spaCy 中实现自定义实体抽取,包括使用词袋、批量添加模式、加载外部文件、使用自定义组件和结合正则表达式进行复杂匹配。

1. 自定义词袋实体抽取

基于 spaCy 的 EntityRuler,我们可以轻松定义特定短语作为整体实体,而不是将其拆分为多个部分。以下示例展示了如何将“出生于中国北京”处理为一个整体实体。

import spacy
from spacy.pipeline import EntityRuler

# 加载中文模型
nlp = spacy.load("zh_core_web_sm")

# 创建EntityRuler
ruler = EntityRuler(nlp)

# 自定义词袋:将“中国北京”识别为一个整体实体
patterns = [{"label": "GPE", "pattern": "中国北京"}]

# 将模式加入ruler
ruler.add_patterns(patterns)

# 注册并添加EntityRuler到pipeline
nlp.add_pipe("entity_ruler", config={"overwrite_ents": True}, last=True)

# 将自定义的ruler实例添加到 pipeline 中
nlp.get_pipe("entity_ruler").add_patterns(patterns)

# 测试
doc = nlp("李华出生于中国北京,他是个很有名的运动员。")
for ent in doc.ents:
    print(ent.text, ent.label_)

解释

  • 通过上述方式,EntityRuler 被成功注册到 pipeline 中,并且我们能够将模式添加到它的实例中。
  • 使用 config={“overwrite_ents”: True} 参数来确保自定义的模式能够覆盖模型识别的实体。
    在这里插入图片描述

2. 使用词典批量添加模式

当需要添加多个实体模式时,可以使用一个外部词典来批量添加模式,这样可以避免手动逐个添加的繁琐过程。

# 批量添加模式
dictionary = {
    "GPE": ["中国北京", "美国纽约", "法国巴黎"],
    "ORG": ["清华大学", "阿里巴巴", "腾讯"]
}

# 将模式加入EntityRuler
for label, patterns in dictionary.items():
    for pattern in patterns:
        ruler.add_patterns([{"label": label, "pattern": pattern}])

解释

  • 我们可以使用字典结构来批量添加多个模式,每个标签对应多个短语,这样的方式高效且简洁。

3. 基于外部文件加载模式

如果实体模式较多,存储在外部文件中可能更为方便。我们可以将这些模式保存在 JSON 文件中并动态加载。

import json

# 加载模式的外部文件
with open('patterns.json', 'r', encoding='utf-8') as f:
    patterns = json.load(f)

# 将模式加入EntityRuler
ruler.add_patterns(patterns)

外部 JSON 文件示例 (patterns.json)

[
    {"label": "GPE", "pattern": "中国北京"},
    {"label": "ORG", "pattern": "清华大学"},
    {"label": "GPE", "pattern": "美国纽约"}
]

解释

  • 这种方法使得模式的管理更加灵活,可以根据需要随时更新和修改外部文件,而不需要重新编译代码。

4. 使用自定义实体识别组件

在某些情况下,标准的实体识别方法可能无法满足需求。这时可以自定义组件,以实现特定的实体识别逻辑。

import spacy
from spacy.tokens import Span
from spacy.language import Language
from spacy.pipeline import EntityRuler

# 加载中文模型
nlp = spacy.load("zh_core_web_sm")

# 创建EntityRuler
ruler = EntityRuler(nlp)

# 自定义模式:将“中国北京”识别为一个整体实体
patterns = [{"label": "GPE", "pattern": "中国北京"}]

# 将模式加入ruler
ruler.add_patterns(patterns)

# 注册 EntityRuler
nlp.add_pipe("entity_ruler", config={"overwrite_ents": True}, last=True)

# 添加 EntityRuler 的模式
nlp.get_pipe("entity_ruler").add_patterns(patterns)

# 使用装饰器注册自定义实体识别组件
@Language.component("custom_entity_recognition")
def custom_entity_recognition(doc):
    # 在 doc 中识别并标记"运动员"实体
    for token in doc:
        if token.text == "运动员":
            start = token.i
            end = token.i + 1  # 识别"运动员"作为一个实体
            ent = Span(doc, start, end, label="PERSON")
            doc.ents += (ent,)  # 将新实体添加到doc中
    return doc

# 将自定义组件加入pipeline
nlp.add_pipe("custom_entity_recognition", after="entity_ruler")

# 测试文本
doc = nlp("李华出生于中国北京,他是个很有名的运动员。")

# 打印识别到的实体
for ent in doc.ents:
    print(ent.text, ent.label_)

解释

  • 这个自定义组件检查每个 token,如果发现“运动员”,则将其作为一个实体添加到文档中。这种方式允许我们灵活地识别不常见的实体。
    在这里插入图片描述

5. 结合正则表达式进行复杂匹配

对于一些复杂的实体模式,正则表达式可以提供更强大的匹配能力。

import re

# 自定义实体识别组件结合正则表达式
def regex_entity_recognition(doc):
    text = doc.text
    pattern = r'出生于(.*?)'
    matches = re.findall(pattern, text)
    for match in matches:
        start = text.index(match)
        end = start + len(match)
        ent = Span(doc, start, end, label="PLACE")
        doc.ents += (ent,)
    return doc

解释

  • 该组件使用正则表达式查找“出生于”后面的地方,并将其作为一个实体识别出来。这种方法适用于动态匹配复杂文本中的模式。

通过以上五种方法,我们可以在 spaCy 中实现灵活的实体抽取和匹配,进一步提高知识图谱构建的准确性和效率。后续博客,我们将探讨如何结合 BERT 等模型进行更复杂的知识抽取任务。

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

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

相关文章

OpenAI 推出 Canvas 工具,助力用户与 ChatGPT 协作写作和编程

OpenAI 近日推出了一款名为 Canvas 的新工具,旨在帮助用户更高效地与 ChatGPT 协作进行写作与编程。 Canvas 允许用户在一个独立窗口中与 ChatGPT 实时协作修改内容。无论是改进文本、调整语言风格、审查代码,还是在不同编程语言间转换,Canv…

Js逆向分析+Python爬虫结合

JS逆向分析Python爬虫结合 特别声明📢:本教程只用于教学,大家在使用爬虫过程中需要遵守相关法律法规,否则后果自负!!! 完整代码地址Github:https://github.com/ziyifast/ziyifast-co…

自闭症干预寄宿学校:为孩子搭建沟通与社交的桥梁

在探索自闭症儿童教育的广阔天地里,一所优秀的寄宿学校不仅是知识的殿堂,更是孩子们学习沟通与社交技能的桥梁。位于广州的星贝育园自闭症儿童寄宿制学校,正是这样一所专注于为自闭症儿童提供全面、个性化教育服务的机构,它以其独…

Linux-du命令使用方法

Linux-du(disk useage)命令 du 命令用于查看文件和目录占用的磁盘空间。 du [选项] [文件或目录]-h (human-readable): 将输出格式转为人类可读的形式,使用 KB、MB 等单位。 du -h /path/to/directory1.5M /path/to/directory…

Pikachu-SSRF(curl / file_get_content)

SSRF SSRF是Server-side Request Forge的缩写,中文翻译为服务端请求伪造。产生的原因是由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。常见的一个场景就是,通过用户输入的URL来获取图片。这个功能如果被恶意使用&am…

Linux 之 安装软件、GCC编译器、Linux 操作系统基础

安装软件、GCC编译器、Linux 操作系统基础 学习任务: 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…

力扣189.轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 :“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令命令解释SHOW DATABASES;展示所有的数据库CREATE DATABASE 数据库名称; 创…

10以内数的分解

// 10以内数的分解.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> using namespace std; int main(int argc, char* argv[]){for (int i 2; i < 10; i){for (int j 1; j < i; j){printf("%d%d%d ",j…

CSS样式基础样式选择器(案例+代码实现+效果图)

目录 1.css样式的规则 2.引入css样式的方式 1)行内式 2)内嵌式 3)外链式 1-link导入 2-import导入 4)总 3.css基础选择器 1)标签选择器 案例&#xff1a;使用标签选择器编写一个圆 1.代码 2.效果 2)类选择器 案例&#xff1a;使用类选择器为div添加背景色 1.代码 2.效果 3)id…

深度探索Kali Linux的精髓与实践应用

Kali Linux简介 Kali Linux作为全球网络安全领域的首选操作系统之一&#xff0c;其强大的功能性及广泛的适用范围令人瞩目。除了上述基础介绍外&#xff0c;让我们深入探究Kali Linux的几个关键特性及其在实际操作中的具体应用案例。 Kali工具集成&#xff1a;全面的安全工具…

加湿器模块(5V STM32)

目录 一、介绍 二、模块原理 1.原理图 2.引脚描述 3.尺寸介绍 三、程序设计 main.c文件 jsq.h文件 jsq.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 加湿器模块通常是指在智能家居设备中负责增加室内空气湿度的部分&#xff0c;这种模块设计旨在改善干燥环…

osg 矩阵相关

下面结果是一样的 osg::Matrix mtrixx;mtrixx.makeRotate(90 / 180.f * osg::PI, osg::Vec3(1, 0, 0));osg::Matrix mtrixx12 osg::Matrix::rotate(90 / 180.f * osg::PI, 1, 0, 0); 备注&#xff1a; rotate或makerotate第一个参数是弧度&#xff0c;可以用 弧度值osg::in…

Pre-trained Natural Language Understanding for Task-Oriented Dialogue

前言 众所周知,预训练BERT语言模型在许多NLP任务重大放异彩,用来文本内容和语义的表征学习很有效果,而且大大降低了下游任务的训练时间。但是由于普通文本和任务型对话之间的语言模式的潜在差异,使得现在的预训练语言模型在实际使用中作用不大。 至于对话领域的预训练语言…

MS-900认证:Microsoft 365 Certified: Fundamentals

一、什么是MS-900认证&#xff1f; MS900认证&#xff0c;全称是 Microsoft 365 Fundamentals&#xff0c;是微软提供的一项认证考试&#xff0c;它旨在验证考生对 Microsoft 365 服务和功能的理解&#xff0c;包括云服务概念、核心服务、安全性、合规性、隐私以及支持和定价信…

【CTF Web】Pikachu CSRF(get) Writeup(CSRF+GET请求+社会工程学)

CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”&#xff0c;在CSRF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;&#xff0c;然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击就完成…

IDEA的lombok插件不生效了?!!

记录一下&#xff0c;防止找不到解决方案&#xff0c;已经遇到好几次了 前面啰嗦的多&#xff0c;可以直接跳到末尾的解决方法&#xff0c;点击一下 问题现场情况 排查过程 确认引入的依赖正常 —》&#x1f197; idea 是否安装了lombok插件 --》&#x1f197; 貌似没有问题…

锐键网络文档链接

锐键网络文档 锐键网络官网锐捷网络官网首页锐捷网络-场景创新&#xff0c;驱动数字未来锐键网络锐键网络产品中心锐键网络产品中心https://www.ruijie.com.cn/cp/锐键网络交换机【锐捷交换机】以太网交换机_网络交换机-锐捷网络锐键网络无线企业无线产品|无线网络设备-无线AP-…

Redis基础二(spring整合redis)

Springboot整合Redis 一、Springboot整合redis ​ redis可以通过使用java代码来实现 第一部分文档中 在终端操作redis的所有命令&#xff0c;Spring已经帮我们封装了所有的操作&#xff0c;所以变得很简单了。 ​ Spring专门提供了一个模块来进行这些操作的封装&#xff0c;这…

文件路径、文件系统操作、字节流字符流、文件内容操作、自己实现文件查找 删除 复制、IO报错:拒绝访问

目录 一、什么是文件 文件的分类 文件路径 二、文件系统操作 四、文件内容操作 字节流字符流 1&#xff09;字节流&#xff08;二进制文件&#xff09; InputStream概述 FileInputStream 概述 OutputStream 概述 2&#xff09;字符流&#xff08;文本文件&#xf…