首页 > 解决方案 > 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

标签: spacy

解决方案


{'LOWER': {'LEMMA': 'education'}}不是一个有效的模式,除非你打开验证(见下文),否则会Matcher默默地丢弃格式错误的属性,所以实际上这个模式被视为{}匹配任何标记,这就是你得到这么多结果的原因。

你可以使用

{'LOWER': 'education'}
{'LEMMA': 'education'}

但它们不能嵌套。

Matcher(nlp.vocab, validate=True)在编写模式时用于更彻底的验证。(默认情况下它是关闭的,因为它会使添加模式变得更慢。)


推荐阅读