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

在构建知识图谱的过程中,如何准确地识别和提取实体是关键。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.mfbz.cn/a/887338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型

文章目录 服务(Service)和服务实例(Instance)定义服务服务元数据定义实例实例元数据持久化属性 集群定义集群 生命周期服务的生命周期实例的生命周期集群的生命周期元数据的生命周期 服务(Service)和服务实…

[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入

信息收集 IP AddressOpening Ports10.10.11.28TCP:22,80 $ nmap -p- 10.10.11.28 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 e3:54:…

计算机视觉——图像修复综述篇

目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …

第 21 章 一条记录的多幅面孔——事务的隔离级别与 MVCC

21.1 事前准备 CREATE TABLE hero ( number INT, NAME VARCHAR ( 100 ), country VARCHAR ( 100 ), PRIMARY KEY ( number ) ) ENGINE INNODB CHARSET utf8;INSERT INTO hero VALUES ( 1, 刘备, 蜀 );21.2 事务隔离级别 在保证事务隔离性的前提下,使用不同的隔…

RTX4060+ubuntu22.04+cuda11.8.0+cuDNN8.6.0 如何根据显卡型号和系统配置cuda和cuDNN所需的安装环境

文章目录 🌕电脑原配置🌕安装cuda和cuDNN前的环境选择🌙cuDNN与CUDA tookit和nvidia driver的对应关系🌙cuda版本选择⭐查看自己的nvidia driver版本和最大支持的CUDA版本⭐最小支持版本 🌙查看11.8.0版本的cuda和ubun…

Redis:hash类型

Redis:hash类型 hash命令设置与读取HSETHGETHMGETHSETNX 哈希操作HEXISTSHDELHKEYSHVALSHGETALLHLENHINCRBYHINCRBYFLOAT 内部编码ziplisthashtable 目前主流的编程语言中,几乎都提供了哈希表相关的容器,Redis自然也会支持对应的内容&#xf…

数据结构之树(4)

摘要:本篇主要讲哈夫曼树、并查集、二叉排序树、平衡二叉树等,非常非常非常重要!!! 一、哈夫曼树 基于霍夫曼树,利用霍夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,…

OpenCV透视变换

#透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(coins.jpg,1)imgInfo img.shape height imgInfo[0] width imgInfo[1] #src 4->dst 4 (左上角 左下角 右上角 右下角) matSrc np.float32([[200,100],[200,400],[600,100],[wid…

Linux:进程间通信之信号量

system V的进程间通信除了共享内存,还有消息队列和信号量 IPC(进程间通信的简称) 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同…

Ray_Tracing_The_Next_Week下

5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性,但其实并没有使用,而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片,通过std_image库stbi_load(path)…

Kubernetes云原生存储解决方案之 Rook Ceph实践探究

Kubernetes云原生存储解决方案之 Rook Ceph实践探究 除了手动部署独立的 Ceph 集群并配置与Kubernetes进行对接外,Rook Ceph 支持直接在 Kubernetes 集群上部署 Ceph 集群。 通过Rook Ceph云原生存储编排平台,使得 Kubernetes 集群中启用高可用的 Ceph…

【记录】Excel|Excel 打印成 PDF 页数太多怎么办

【记录】Excel|解决 Excel 打印成 PDF 页数过多的问题 文章目录 【记录】Excel|解决 Excel 打印成 PDF 页数过多的问题方法一:调整页边距WPS OfficeMicrosoft Excel 方法二:优化页面布局调整列宽和行高使用“页面布局”视图合并单…

蓝牙定位的MATLAB仿真程序(基于信号强度,平面内的定位,四个蓝牙基站)

这段代码通过RSSI信号强度实现了蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出,用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原理蓝牙定位的原理优缺…

实验5 累加器实验

实验5 累加器实验 6.1实验目的 1、理解累加器的概念和作用。 2、连接运算器、存储器和累加器,熟悉计算机的数据通路。 3、掌握使用微命令执行各种操作的方法。 6.2实验要求 1、做好实验预习,读懂实验电路图,熟悉实验元器件的功能特性和使用…

网络基础 【HTTP】

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux初窥门径⏪   🚚代码仓库:Linux代码练习🚚 💻操作环境: CentOS 7.6 华为云远程服务器 🌹关注我🫵带你学习更多Linux知识…

保险丝基础知识

一、简介 保险丝(fuse)也被称为电流保险丝,它能够在电流异常升高到一定的高度和热度时,自动熔断切断电流,从而保护电路安全运行。 IEC127标准将它定义为“熔断体(fuse-link)”。熔断体是由电阻率比较大而熔…

【Linux】进程间关系与守护进程

超出能力之外的事, 如果永远不去做, 那你就永远无法进步。 --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组2 会话3 控制终端4 作业控制5 守护进程 1 进程组 之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(P…

计算机网络的整体认识---网络协议,网络传输过程

计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网WAN: 将远隔千里的计算机都连在一起;所谓 "局域网" 和 "广域网" 只是一个相…

MetaJUI v0.4 遇到的一些问题及解决办法记录

1、Unity3d 版本 2022.3.29f1。 2、MetaJUI v0.4 的下载,https://download.csdn.net/download/xingchengaiwei/89334848 3、将MetaJUI v0.4解压,用Unity3d 打开项目,会出现如下问题,按照图中提示操作即可。 4、打开工程后会出现…

【2024年最新】基于Spring Boot+vue的旅游管理系统lw+ppt

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…