首页 > 解决方案 > 当两个单词仅设置为单独的“TEXT”条件对象时,spacy 匹配器返回正确答案。为什么?

问题描述

我正在尝试设置一个匹配器来查找单词“iPhone X”。

示例代码说我应该在下面遵循。

import spacy

# Import the Matcher
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")
doc = nlp("Upcoming iPhone X release date leaked as Apple reveals pre-orders")

# Initialize the Matcher with the shared vocabulary
matcher = Matcher(nlp.vocab)

# Create a pattern matching two tokens: "iPhone" and "X"
pattern = [{"TEXT": "iPhone"}, {"TEXT": "X"}]

# Add the pattern to the matcher
matcher.add("IPHONE_X_PATTERN", None, pattern)

# Use the matcher on the doc
matches = matcher(doc)
print("Matches:", [doc[start:end].text for match_id, start, end in matches])

我尝试了另一种方法,如下所示。

# Create a pattern matching two tokens: "iPhone" and "X"
pattern = [{"TEXT": "iPhone X"}]

# Add the pattern to the matcher
matcher.add("IPHONE_X_PATTERN", None, pattern)

为什么第二种方法不起作用?我假设如果我将两个单词“iPhone”和“X”放在一起,它可能会以相同的方式工作,因为它将中间带空格的单词视为一个长的唯一单词。但事实并非如此。

我能想到的可能原因是,匹配器条件应该是一个没有空格的单词。我对吗?还是第二种方法不起作用的另一个原因?

谢谢你。

标签: pythonnlpspacy

解决方案


答案在于 Spacy 如何标记字符串:

>>> print([t.text for t in doc])
['Upcoming', 'iPhone', 'X', 'release', 'date', 'leaked', 'as', 'Apple', 'reveals', 'pre', '-', 'orders']

如您所见,iPhoneandX是单独的标记。请参阅Matcher参考资料:

添加到 Matcher 的模式由字典列表组成。每个字典描述一个标记及其属性。

因此,您不能在一个令牌定义中同时使用它们。


推荐阅读