对于这两种情况,令牌化的工作方式不同。

Tokenization not working the same for both case.

我有一个文件

doc = nlp('x-xxmessage-id:')

当我想提取这个的标记时,我得到 'x'、'xx'、'message' 和 'id'、':'。一切顺利。 然后我创建一个新文档

test_doc = nlp('id')

如果我尝试提取 test_doc 的标记,我将得到 'i' 和 'd'。有什么办法可以解决这个问题吗?因为我想获得与上面相同的标记,这在文本处理中造成了问题。

就像语言本身一样,标记化是上下文相关的,language-specific data 定义了告诉 spaCy 如何根据周围字符拆分文本的规则。 spaCy 的默认值也针对通用文本进行了优化,例如新闻文本、网络文本和其他现代写作。

在您的示例中,您遇到了一个有趣的案例:抽象字符串 "x-xxmessage-id:" 根据标点符号拆分,而孤立的小写字符串 "id" 拆分为 "i""d",因为在书面文本中,它最常见的是 "I'd" 或 "i'd" 的替代拼写("I could"、"I would" 等)。您可以找到相应的规则 here.

如果您要处理与常规自然语言文本有很大不同的特定文本,您通常需要 customise the tokenization rules or possibly even add a Language subclass for your own custom "dialect". If there's a fixed number of cases you want to tokenize differently that can be expressed by rules, another option would be to add a component to your pipeline that

最后,您也可以尝试使用 language-independent xx / MultiLanguage class 代替。它仍然包含非常基本的标记化规则,例如标点符号拆分,但 none 特定于英语的规则。

from spacy.lang.xx import MultiLanguage
nlp = MultiLanguage()