如何匹配 spacy 中的重复模式?

How to match repeating patterns in spacy?

我有一个与 提问者类似的问题:How to define a repeating pattern consisting of multiple tokens in spacy? 我的案例与链接的 post 是我的模式是由 POS 和依赖标签定义的。因此,我不认为我可以轻松地使用正则表达式来解决我的问题(正如链接 post 的接受答案中所建议的那样)。

例如,假设我们分析以下句子:

“她告诉我她的狗又大又黑又壮。”

下面的代码可以让我匹配句子末尾的形容词列表:

import spacy # I am using spacy 2
from spacy.matcher import Matcher
nlp = spacy.load('en_core_web_sm')

# Create doc object from text
doc = nlp(u"She told me that her dog was big, black and strong.")

# Set up pattern matching
matcher = Matcher(nlp.vocab)
pattern = [{"POS": "ADJ"}, {"IS_PUNCT": True}, {"POS": "ADJ"}, {"POS": "CCONJ"}, {"POS": "ADJ"}]
matcher.add("AdjList", [pattern])


matches = matcher(doc)

运行 此代码将匹配“big, black and strong”。但是,这种模式不会在以下句子“她告诉我她的狗又大又黑”或“她告诉我她的狗又大又黑,强壮又好玩”中找到形容词列表。

我如何为 spacy 的匹配器定义一个(单个)模式才能找到这样一个包含任意数量形容词的列表?换句话说,我正在寻找一种模式的正确语法,其中 {"POS": "ADJ"}, {"IS_PUNCT": True} 部分可以在列表以模式 {"POS": "ADJ"}, {"POS": "CCONJ"}, {"POS": "ADJ"}.

结束之前任意重复

感谢任何提示。

解决方案/问题与链接到的问题没有根本区别,在这样的匹配中没有重复 multi-token 模式的工具。您可以使用 for 循环构建多个模式来捕获您想要的内容。

patterns = []
for ii in range(1, 5):
    pattern = [{"POS": "ADJ"}, {"IS_PUNCT":True}] * ii
    pattern += [{"POS": "ADJ"}, {"POS": "CCONJ"}, {"POS": "ADJ"}]
    patterns.append(pattern)

或者您可以使用依赖匹配器做一些事情。在你的例句中它不是那么干净,但是对于像“这是一只大的,棕色的,顽皮的狗”这样的句子,形容词都有直接将它们连接到名词的依存弧。

单独说明,您没有处理带有连续逗号的句子。