我正在尝试设置匹配器查找单词'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])
我尝试了另一种方法,把like放在下面。
# 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"one_answers"X"两个单词放在一起,它可能会以同样的方式工作,因为它会把中间有空格的单词视为一个长而独特的单词。但它没有。
我能想到的可能原因是,匹配器条件应该是一个没有空格的单词。我说的对吗?或者还有其他原因导致第二种方法不起作用?
谢谢。
答案在于space如何标记字符串:
>>> print([t.text for t in doc])
['Upcoming', 'iPhone', 'X', 'release', 'date', 'leaked', 'as', 'Apple', 'reveals', 'pre', '-', 'orders']
如您所见,iPhone
和X
是单独的令牌。参见Matcher
参考:
添加到Matcher中的模式由一个字典列表组成。每个字典描述一个标记和它的属性。
因此,不能在一个令牌定义中同时使用它们。