spacy - 使用 spaCy Matcher 的简单示例不起作用

标签 spacy

我正在尝试使用 spaCy Matcher 工作获得以下简单示例:

import en_core_web_sm
from spacy.matcher import Matcher

nlp = en_core_web_sm.load()
matcher = Matcher(nlp.vocab)

pattern1 = [{'IS_DIGIT': True}, {'ORTH': '.'}, {'IS_DIGIT': True}, {'ORTH': '.'}, {'IS_DIGIT': True}, {'ORTH': '.'}, {'IS_DIGIT': True}]
pattern2 = [{'LIKE_NUM': True}, {'ORTH': '.'}, {'LIKE_NUM': True}, {'ORTH': '.'}, {'LIKE_NUM': True}, {'ORTH': '.'}, {'LIKE_NUM': True}]
pattern3 = [{'IS_DIGIT': True}, {'IS_PUNCT': True}, {'IS_DIGIT': True}, {'IS_PUNCT': True}, {'IS_DIGIT': True}, {'IS_PUNCT': True}, {'IS_DIGIT': True}]

matcher.add('IP', None, pattern1, pattern2, pattern3)

doc = nlp(u'This is an IP address: 192.168.1.1')

matches = matcher(doc)

但是,没有任何模式匹配,此代码返回 []matches . spaCy 示例代码中提供的简单“Hello World”示例工作正常。

我究竟做错了什么?

最佳答案

使用 Matcher 时,请记住,模式中的每个字典都代表一个单独的标记。这也意味着它找到的匹配项取决于 spaCy 如何标记您的文本。默认情况下,spaCy 的英语分词器会像这样拆分您的示例文本:

>>> doc = nlp("This is an IP address: 192.168.1.1")
>>> [t.text for t in doc]
['This', 'is', 'an', 'IP', 'address', ':', '192.168.1.1']
192.168.1.1保留一个 token (客观地说,这可能是相当合理的——IP 地址可以被视为一个词)。因此,期望它的一部分是单个标记的匹配模式将不匹配。

为了改变这种行为,你可以 customise the tokenizer有一个额外的规则告诉 spaCy 在数字之间分割周期。但是,这也可能会产生其他意想不到的副作用。

因此,在您的情况下,更好的方法是使用 token 形状,可作为 token.shape_ 使用。属性。形状是描述单个字符的 token 的字符串表示,以及它们是否包含数字、大写/小写字符和标点符号。 IP 地址形状如下所示:
>>> ip_address = doc[6]
>>> ip_address.shape_
'ddd.ddd.d.d'

您可以只过滤您的文档并检查 token.shape_ == 'ddd.ddd.d.d' ,或使用 'SHAPE'作为匹配模式中的键(用于单个标记)以查找包含该形状标记的句子或短语。

关于spacy - 使用 spaCy Matcher 的简单示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582609/

相关文章:

python - 希伯来语中的 spacy 句子标记化错误

python - 如何修改 spacy tokenizer 以将 URL 拆分为单个单词

python - 如何使用 spacy/nltk 生成 bi/tri-grams

python - 如何导出 "Document with entities from spaCy"以在 doccano 中使用

python-3.x - spaCy is_oov 未按预期工作

python - 如何使用 spaCy 创建新实体并仅从关键字列表中学习

python - [ orth , pos , tag , lema 和 text ] 的 spaCy 文档

linux - 无法在 AWS Sagemaker 上安装 spacy

python - 为 OOV 词添加新向量的正确方法

nlp - Java 中的 spaCy 替代方案