【NLP】24. spaCy 教程:自然语言处理核心操作指南(进阶)

spaCy 中文教程:自然语言处理核心操作指南(进阶)

1. 识别文本中带有“百分号”的数字

import spacy# 创建一个空的英文语言模型
nlp = spacy.blank("en")# 处理输入文本
doc = nlp("In 1990, more than 60% of people in East Asia were in extreme poverty. Now less than 4% are.")# 遍历文档中的每个词
for token in doc:if token.like_num:  # 判断该词是否看起来像一个数字# 获取下一个词next_token = doc[token.i + 1]if next_token.text == "%":print("找到百分比:", token.text)

📌 2. 词性标注与依存关系分析

import spacy# 加载英文小模型
nlp = spacy.load("en_core_web_sm")# 输入文本
doc = nlp("She ate the pizza")# 打印每个词的词性标签
for token in doc:print(token.text, token.pos_, token.pos)# 输出依存结构信息(包括该词依赖于哪个词)
for token in doc:print(token.text, token.pos_, token.dep_, token.head.text)

📌 3. 命名实体识别(NER)

# 输出识别出来的命名实体及其类型
for ent in doc.ents:print(ent.text, ent.label_)

📌 4. 比较不同模型之间的差异(词性与依存关系)

# 假设 doc_small 和 doc_medium 是使用不同模型处理的结果
for i in range(len(doc_small)):print("词:", doc_small[i])if doc_small[i].pos_ != doc_medium[i].pos_:print("词性不同:", doc_small[i].pos_, doc_medium[i].pos_)if doc_small[i].dep_ != doc_medium[i].dep_:print("依存关系不同:", doc_small[i].dep_, doc_medium[i].dep_)

📌 5. 使用 Matcher 匹配自定义文本模式

示例一:识别“购买”某物的句子结构

from spacy.matcher import Matcher
import spacynlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)# 定义匹配“购买某物”的结构
pattern = [{"LEMMA": "buy"}, {"POS": "DET", "OP": "?"}, {"POS": "NOUN"}]
matcher.add("BUY_ITEM", [pattern])doc = nlp("I bought a smartphone. Now I'm buying apps.")
matches = matcher(doc)for match_id, start, end in matches:span = doc[start:end]print("匹配结果:", span.text)

示例二:识别“love + 名词”的组合

pattern = [{"LEMMA": "love", "POS": "VERB"}, {"POS": "NOUN"}]
matcher.add("LOVE_PATTERN", [pattern])doc = nlp("I loved vanilla but now I love chocolate more.")
matches = matcher(doc)for match_id, start, end in matches:span = doc[start:end]print("匹配:", span.text)

示例三:匹配 “COLORS10”, “COLORS11” 等结构

text = """After the iOS update you won’t notice big changes. Most of iOS 11's layout remains the same as iOS 10."""matcher = Matcher(nlp.vocab)
pattern = [{"TEXT": "COLORS"}, {"IS_DIGIT": True}]
matcher.add("IOS_VERSION", [pattern])doc = nlp(text)
matches = matcher(doc)for match_id, start, end in matches:span = doc[start:end]print("识别出的版本:", span.text)

示例四:识别“download + 专有名词”的结构

text = """I downloaded Fortnite on my laptop. Should I download WinZip too?"""pattern = [{"LEMMA": "download"}, {"POS": "PROPN"}]
matcher.add("DOWNLOAD_PATTERN", [pattern])doc = nlp(text)
matches = matcher(doc)for match_id, start, end in matches:print("下载内容:", doc[start:end].text)

示例五:匹配“形容词 + 名词”结构


text = "Features include a beautiful design, smart search, and voice responses."pattern = [{"POS": "ADJ"}, {"POS": "NOUN"}, {"POS": "NOUN", "OP": "?"}]
matcher.add("ADJ_NOUN", [pattern])doc = nlp(text)
matches = matcher(doc)for match_id, start, end in matches:print("形容词短语:", doc[start:end].text)

📌 6. 使用 VocabLexeme 操作词汇表


nlp = spacy.blank("en")# 将字符串转换为 hash 值
word_hash = nlp.vocab.strings["hat"]
print("字符串 'hat' 的哈希值为:", word_hash)# 再将 hash 值反向转换为字符串
word_text = nlp.vocab.strings[word_hash]
print("哈希反查:", word_text)# 获取词汇的详细属性
lexeme = nlp.vocab["tea"]
print(lexeme.text, lexeme.orth, lexeme.is_alpha)

✨ 7. 手动创建 Doc 和 Span

在 spaCy 中,Doc 是处理文本的核心对象。我们可以使用 Doc 类手动创建文档,而不是通过 nlp() 处理字符串。

from spacy.tokens import Doc, Span
import spacynlp = spacy.blank("en")  # 创建一个空的英文模型tokens = ["Hello", "world", "!"]
spaces = [True, False, False]  # 单词之间是否有空格doc = Doc(nlp.vocab, words=tokens, spaces=spaces)
print("创建的文档:", doc)

接着我们可以用 Span 创建一个实体片段,并加上标签:

span = Span(doc, 0, 2, label="GREETING")  # "Hello world"
doc.ents = [span]  # 设置 doc 的实体
print("命名实体:", doc.ents)

🛠️ 8. 查看与修改 NLP 管道组件

spaCy 的 NLP 模型是一个管道(pipeline),包含多个组件(如分词、实体识别等)。

print("管道组件名称:", nlp.pipe_names)
print("组件详细信息:", nlp.pipeline)

你也可以向管道中添加自定义组件,例如:

from spacy.language import Language@Language.component("length_logger")
def log_doc_length(doc):print(f"文档长度:{len(doc)}")return docnlp.add_pipe("length_logger", first=True)  # 插入为第一个组件
print("修改后的管道组件:", nlp.pipe_names)doc = nlp("A sample sentence.")

🐛 9. 自定义实体识别器(基于词性和词形)

我们用 Matcher 组件来匹配特定词汇(比如“moth”、“fly”、“mosquito”),并用 Span 标记为实体:

from spacy.matcher import Matchertext = "Qantas flies all sorts of cargo! That includes moths, mosquitos, and even the occasional fly."nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)# 添加匹配规则
for insect in ["moth", "fly", "mosquito"]:matcher.add("INSECT", [[{"LEMMA": insect, "POS": "NOUN"}]])@Language.component("insect_finder")
def mark_insects(doc):matches = matcher(doc)doc.ents = [Span(doc, start, end, label="INSECT") for _, start, end in matches]return docnlp.add_pipe("insect_finder", after="ner")  # 放在命名实体识别之后doc = nlp(text)
print("识别到的昆虫实体:", [(ent.text, ent.label_) for ent in doc.ents])

🔍 10. 文本向量与相似度计算

spaCy 中的 en_core_web_mden_core_web_lg 模型提供了词向量。我们可以比较词、句子的相似度:

nlp = spacy.load("en_core_web_md")doc1 = nlp("I like fast food")
doc2 = nlp("I like pizza")print("句子相似度:", doc1.similarity(doc2))doc = nlp("I like pizza and pasta")
print("词语相似度(pizza vs pasta):", doc[2].similarity(doc[4]))

📚 11. 使用 nlp.pipe 批量处理文本

如果你需要处理大量文本,nlp.pipe() 是更高效的选择:

texts = ["First example!", "Second example."]
for doc in nlp.pipe(texts):print("处理结果:", doc)

🧩 12. 给 Doc 添加自定义属性(Context 扩展)

使用 Doc.set_extension() 可以添加自定义字段,例如 idpage_number

from spacy.tokens import Docdata = [("This is a text", {"id": 1, "page_number": 15}),("And another text", {"id": 2, "page_number": 16}),
]# 只设置一次,重复设置会报错
try:Doc.set_extension("id", default=None)Doc.set_extension("page_number", default=None)
except ValueError:pass# 给每个 doc 添加上下文属性
for doc, context in nlp.pipe(data, as_tuples=True):doc._.id = context["id"]doc._.page_number = context["page_number"]print(f"{doc.text} | ID: {doc._.id} | 页码: {doc._.page_number}")

🔧 13. 控制管道的运行组件(select_pipes)

你可以临时禁用某些组件,加快处理速度或避免不必要的分析:

text = """Chick-fil-A is an American fast food restaurant chain headquartered in 
College Park, Georgia."""with nlp.select_pipes(disable=["tagger", "parser"]):  # 临时关闭组件doc = nlp(text)print("命名实体:", doc.ents)print("词性标注(关闭 tagger 后):", [token.tag_ for token in doc])

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

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

相关文章

关于香橙派OrangePi 5 Ultra 这个开源板子,开发Android

我下载了它资料中的开源Android13 系统SDK, 这个SDK连个git 都没有,把这种代码释放能称为开源吗?? 并且也就是说你买了这个板子,里面是没有任何关于RK3588的开发文档,如果你没玩过其他RK平台,估…

WHAT - React Portal 机制:将子组件渲染到 DOM 的指定节点

文章目录 适合场景基本语法示例:Modal 弹窗1. 创建一个简单的 Modal.tsx2. 在 App 中使用 为什么要用 Portal?TypeScript 中 Portal 类型定义? 适合场景 React Portal 是 React 提供的一种机制,让你可以将子组件渲染到 DOM 的指定…

数据结构---跳表

目录 一、跳表的概念 为什么要使用随机值来确定层高 二、跳表的分析 (1)查找过程 (2)性能分析 三、跳表的实现 四、与红黑树哈希表的对比 skiplist本质上也是一种查找结构,用于解决算法中的查找问题&#xff0c…

PCDN通过个人路由器,用更靠近用户的节点来分发内容,从而达到更快地网络反应速度

PCDN(P2P CDN)的核心思想正是利用个人路由器、家庭宽带设备等分布式边缘节点,通过就近分发内容来降低延迟、提升网络响应速度,同时降低传统CDN的带宽成本。以下是其技术原理和优势的详细分析: 1. 为什么PCDN能更快&…

用excel做九乘九乘法表

公式: IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日,备受瞩目的QCon开发者技术峰会盛大举行,本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题,汇聚了众多鸿蒙生态的领军人物与技术专家,共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…

java HttpServletRequest 和 HttpServletResponse

HttpServletRequest 和 HttpServletResponse 详解 1. HttpServletRequest(HTTP 请求对象) HttpServletRequest 是 Java Servlet API 提供的接口,用于封装客户端的 HTTP 请求信息。它继承自 ServletRequest,并增加了 HTTP 协议相…

HAL TIM PWM产生 蓝桥杯

目录 0.原理 0.1 CNT和CCR关系 0.2 PWM模式1模式2 1. cubemx配置 需求(将PA1输出1Khz的 50%占空比的方波) 1.0 PWM的频率计算: 2.代码 0.原理 0.1 CNT和CCR关系 CNT计数器和CCR比较器进行比较,如果是向上计数,CNT逐渐增加,CCR是虚线位置,也是用户自定义的…

python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)

Python 目前是 AI 开发的首选语言 软件安装 python解释器 官网下载 Python |Python.org 勾选 Add python.exe to PATH 将python.exe添加到PATH 勾选这个选项会将Python的可执行文件路径添加到系统的环境变量PATH中。这样做的好处是,你可以在命令行中从任何位置直…

CMD命令行笔记

CMD命令行笔记,涵盖常用命令及实用技巧,适合快速查阅: 一、基础操作 打开CMD Win R → 输入 cmd → 回车管理员模式:右键开始菜单 → 选择“命令提示符(管理员)” 常用命令 help:查看所有命令…

android中dp和px的关系

关于android的dp和px的关系是我刚开始学习android的第一个知识点,不知不觉学安卓也有一年了,但是偶然间我发现我理解的dp和px的关系一直是错的,真的是有一点搞笑,今天特意写一篇博客纪念一下这个我理解错一年的知识点。 dp和px之间…

(四)机器学习---逻辑回归及其Python实现

之前我们提到了常见的任务和算法,本篇我们使用逻辑回归来进行分类 分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高…

【汽车产品开发项目管理——端到端的汽车产品诞生流程】

MPU:集成运算器、寄存器和控制器的中央处理器芯片 MCU:微控制单元,将中央处理器CPU、存储器ROM/RAM、计数器、IO接口及多种外设模块集成在单一芯片上的微型计算机系统。 汽车产品开发项目属性:临时性、独特性、渐进明细性、以目标…

Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组------元组

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的&#xf…

智慧医院室内导航系统架构拆解:技术选型与性能攻坚指南

本文面向医院信息化团队技术负责人及医疗IoT解决方案开发者,聚焦解决大规模院区导航系统的扩展性、多源数据融合及实时路径规划等技术难点,提供从架构到落地的完整技术路线图。 如需获取智慧医院导航导诊系统解决方案请前往文章最下方获取,如…

医药采购系统平台第4天03:实现根据用户的角色显示不同用户的权限菜单编写拦截器实现权限拦截模块的开发流程和测试流程小节

如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!! 四 权限管理(用户授权)的应用:根据用户的角色显示不同用户的权限菜单 经过上面的与第三方系统的成功的接入,而且在“角色管理”菜单中也对需要授权的角色进行了授权--->给一级…

#2 物联网组成要素

从下至上,则包括了5个要素,包括 设备 / 传感器 / 网络 / 物联网服务 / 数据分析 这五个要素。为了便于理解,我们用思维导图展示 物联网构成架构 设备 能够感测和反馈并连到网络进行物联网服务的装置 传感器 传感器和网关的融合实现了物…

< 自用文 Project-30.6 Crawl4AI > 为AI模型优化的网络爬虫工具 帮助收集和处理网络数据的工具

官方链接: Github :https://github.com/unclecode/crawl4ai 文档主页:https://docs.crawl4ai.com/ 当前版本:Crawl4AI v0.5.0 主要新功能: 可配置策略(广度优先、深度优先、最佳优先)探索整…

【Kafka基础】监控与维护:动态配置管理,灵活调整集群行为

1 基础配置操作 1.1 修改主题保留时间 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-configs.sh --alter \--bootstrap-server 192.168.10.33:9092 \--entity-type topics \--entity-name yourtopic \--add-config retention.ms86400000 参数说明: retention…

04-微服务 面试题-mk

文章目录 1.Spring Cloud 常见的组件有哪些?2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现)3.Nacos配置中心热加载实现原理及关键技术4.OpenFeign在微服务中的远程服务调用工作流程5.你们项目负载均衡如何实现的 ?6.什么是服务雪崩,怎么解决这个问题?…