我有一个与本文中提出的问题类似的问题:如何在spacy中定义由多个令牌组成的重复模式与链接帖子相比,我的案例的不同之处在于,我的模式是由POS和依赖标签定义的。因此,我不认为我可以轻易地使用regex来解决我的问题(正如链接文章的公认答案中所建议的那样(。
例如,假设我们分析以下句子:
"她告诉我她的狗又大又黑又强壮">
下面的代码可以让我匹配句子末尾的形容词列表:
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)
运行此代码将匹配";大、黑、壮";。然而,这种模式在下面的句子中找不到形容词列表"她告诉我她的狗又大又黑;或";她告诉我,她的狗很大,黑色,强壮,顽皮"。
我必须如何为spacy的matcher定义一个(单个(模式,才能找到这样一个包含任意数量形容词的列表?换句话说,我正在为一个模式寻找正确的语法,在列表以模式{"POS": "ADJ"}, {"POS": "CCONJ"}, {"POS": "ADJ"}
结束之前,部分{"POS": "ADJ"}, {"IS_PUNCT": True}
可以经常任意重复。
谢谢你的提示。
解决方案/问题与链接到的问题没有根本区别,在这样的匹配中没有重复多令牌模式的功能。您可以使用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)
或者,您可以使用依赖匹配器做一些事情。在你的例句中,它不是那么干净,但对于像";这是一只棕色的顽皮大狗",形容词都有直接连接名词的依存弧。
作为一个单独的注意事项,您不是在处理带有连续逗号的句子。