python - 当两个单词仅设置为单独的“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”放在一起,它可能会以相同的方式工作,因为它将中间带空格的单词视为一个长的唯一单词。但事实并非如此。
我能想到的可能原因是,匹配器条件应该是一个没有空格的单词。我对吗?还是第二种方法不起作用的另一个原因?
谢谢你。
解决方案
答案在于 Spacy 如何标记字符串:
>>> print([t.text for t in doc])
['Upcoming', 'iPhone', 'X', 'release', 'date', 'leaked', 'as', 'Apple', 'reveals', 'pre', '-', 'orders']
如您所见,iPhone
andX
是单独的标记。请参阅Matcher
参考资料:
添加到 Matcher 的模式由字典列表组成。每个字典描述一个标记及其属性。
因此,您不能在一个令牌定义中同时使用它们。
推荐阅读
- python - 在 python 中,如何处理许多在 numpy 或列表中不按顺序排列的矩形?
- java - OpenStack 项目列表 HTTP 请求忽略分页 "limit=" 参数
- python - Python - 来自单个列表的加权平均值
- java - 以原子方式跨算子清除 flink 状态
- javascript - 如何在具有函数的对象中创建新对象?
- powershell - 如何使用 PowerShell 查找 DNS 信息?
- html - Jquery将表的第一列复制到下一列
- java - 我的 Android 应用程序在模拟器中崩溃
- json - 在flutter中将forEach List转换为json列表
- ranorex - Ranorex,无法绑定变量和数据源