Spacy Matcher 并不总是匹配

Spacy Matcher isn't always matching

我不明白为什么匹配器不工作。这有效:

test = ["14k"]

nlp = spacy.blank("en")
matcher = Matcher(nlp.vocab)

matcher.add("test", [[{"NORM": "14k"}]])

docs = []
for doc in nlp.pipe(test):
    matches = matcher(doc)
    print(matches)

但是如果我在我的匹配器和文本中将 14k 更改为 14K,匹配器什么也找不到。为什么?我只是想了解其中的区别以及为什么这不起作用以及我将来如何自己解决这个问题。我看过文档:

https://spacy.io/api/matcher

并且不知道我哪里出错了。我将“NORM”更改为 ORTH 和 TEXT,但仍然没有找到。感谢您的帮助。

编辑 好的,我这样做了:

for ent in doc:
   print(ent)

对于小写版本,Spacy 将其归类为一个 ent,但是当我将 K 大写时,Spacy 说它是两个不同的 ent。有了这些知识,我做到了,matcher.add("test", [[{"ORTH": "14"}, {"ORTH":"K"}]]) 并且成功了。

我还想知道为什么。为什么Spacy认为14k是一个“字”,而14K是两个“字”?

看起来您可能 运行 遇到了此类序列的标记化差异问题。特别要注意,看起来像温度的东西(所以数字 + [FCK])可能会得到特殊处理。这可能看起来很奇怪,但它通常会导致与现有语料库更好的兼容性。

您可以使用 tokenizer.explain() 找出输入以特定方式标记化的原因,如下所示:

import spacy

nlp = spacy.blank("en")
print(nlp.tokenizer.explain("14K"))
print("...")
print(nlp.tokenizer.explain("14k"))

给出输出:

[('TOKEN', '14'), ('SUFFIX', 'K')]
...
[('TOKEN', '14k')]

您可以在 tokenizer.explain docs 阅读更多相关信息。