【发布时间】:2018-06-18 20:22:25
【问题描述】:
我有一个文件
doc = nlp('x-xxmessage-id:')
当我想提取这个标记时,我得到'x'、'xx'、'message'和'id'、':'。一切顺利。 然后我创建一个新文档
test_doc = nlp('id')
如果我尝试提取 test_doc 的标记,我会得到 'i' 和 'd'。有没有办法解决这个问题?因为我想获得与上面相同的令牌,这在文本处理中产生了问题。
【问题讨论】:
我有一个文件
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 或者甚至可能为您自己的自定义“方言”添加Language subclass。如果有固定数量的案例,您希望以不同的方式标记可以通过规则表达,另一种选择是将组件添加到您的管道中 merges the split tokens back together。
最后,您也可以尝试改用language-independent xx / MultiLanguage 类。它仍然包含非常基本的标记化规则,例如标点符号分割,但没有任何特定于英语的规则。
from spacy.lang.xx import MultiLanguage
nlp = MultiLanguage()
【讨论】:
"id")将自动合并。