在 spacy 中,如何确保特定字符始终被视为完整标记?

In spacy, how can I make sure a particular character is always considered a full token?

在 spacy 中,我希望像“€”、“$”或“¥”这样的字符始终被视为标记。然而,有时它们似乎是更大令牌的一部分。 比如这个不错(两个token)

>>> len(nlp("100€"))
2

但以下不是我想要的(我也想在这种情况下获得两个令牌):

>>> len(nlp("N€"))
1

我怎样才能用 spacy 实现它? 顺便说一下,不要太关注货币示例。对于与数字或货币无关的其他类型的字符,我遇到过这种问题。问题是如何确保一个字符始终被视为一个完整的标记,而不是粘在句子中的其他字符串上。

参见 here

Spacy 的标记器通过迭代以空格分隔的子字符串并查找前缀或后缀之类的东西来将这些部分分开。 您可以按照上面 link 中的说明添加自定义前缀和后缀。

我们可以这样使用它:

import spacy
nlp = spacy.load('en_core_web_lg')

doc = nlp("N€")
print([t for t in doc])
#[N€]

suffixes = nlp.Defaults.suffixes + ("€", )

suffix_regex = spacy.util.compile_suffix_regex(suffixes)
nlp.tokenizer.suffix_search = suffix_regex.search


doc = nlp("N€")
print([t for t in doc])
#[N, €]