spacy - Spacy(短语)匹配多个属性
问题描述
我希望匹配短语“教育计划”,但两者之间有任何单词。所以假设我有以下文本:
text = "Education is a way to program life. This sentence has nothing to do with education"
我将模式设置为:
pattern = [{'LOWER': {'LEMMA': 'education'}}, {'IS_SENT_START': False, 'OP': '*'},{'LOWER': {'LEMMA': 'program'}}]
但是,当我执行以下操作时,我会得到大量的匹配项:
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_lg")
matcher = Matcher(nlp.vocab)
matcher.add('edu', None, pattern)
doc = nlp(text)
matches = matcher(doc)
for match_id, start, end in matches:
string_id = nlp.vocab.strings[match_id] # Get string representation
span = doc[start:end] # The matched span
print("Match ID: {}\nString ID: {}\nStart: {}\nEnd: {}\nText: {}\nSentence: {}".format(
match_id, string_id, start, end, span.text, span.sent))
只是想知道我在这里做错了什么?我也尝试切换 LOWER 和 LEMMA ,但没有任何运气。
编辑1:
给定的解决方案有效,但不适用于以下文本:
text = 'This account was created by a prior staff member for our county Tobacco Education Program.'
. 我有 spacy 版本2.2.4
。
解决方案
{'LOWER': {'LEMMA': 'education'}}
不是一个有效的模式,除非你打开验证(见下文),否则会Matcher
默默地丢弃格式错误的属性,所以实际上这个模式被视为{}
匹配任何标记,这就是你得到这么多结果的原因。
你可以使用
{'LOWER': 'education'}
{'LEMMA': 'education'}
但它们不能嵌套。
Matcher(nlp.vocab, validate=True)
在编写模式时用于更彻底的验证。(默认情况下它是关闭的,因为它会使添加模式变得更慢。)
推荐阅读
- dart - Flutter/dart-从mysql服务器数据库下载数据
- node.js - 表示为我的多语言 Angular 应用程序的服务器端渲染的中间件
- php - Laravel Eloquent - 用关系构建“哪里不是”查询
- java - WildFly 13 迁移 - 仅允许具有 bean 管理的事务划分的会话和消息驱动的 bean 访问 UserTransaction
- java - select exists(select from table where condition) 会返回 0 还是 1?
- c# - 异常'元素应该被选择但是 div' C# selenium
- node.js - Node.js 无法使用 mongoose 设置默认 UUID
- adobe - 如何将 Psd 转换为 psf?
- python - python3 - 未使用更新的全局变量值,而是使用旧值
- amazon-web-services - 应用程序负载均衡器的 AWS 完全访问策略