Nlp 标记化在两种情况下的工作方式不同。

Nlp 标记化在两种情况下的工作方式不同。,nlp,spacy,Nlp,Spacy,我有一份文件 doc = nlp('x-xxmessage-id:') test_doc = nlp('id') 当我想提取这个标记时,我会得到'x','xx','message'和'id',':'。一切顺利。 然后我创建一个新文档 doc = nlp('x-xxmessage-id:') test_doc = nlp('id') 如果我试图提取test_doc的令牌,我将得到'I'和'd'。有没有办法克服这个问题?因为我想获得与上面相同的令牌,这会在文本处理中产生问题 就像语言本身一样

我有一份文件

doc = nlp('x-xxmessage-id:')
test_doc = nlp('id')
当我想提取这个标记时,我会得到'x','xx','message'和'id',':'。一切顺利。 然后我创建一个新文档

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

如果我试图提取test_doc的令牌,我将得到'I'和'd'。有没有办法克服这个问题?因为我想获得与上面相同的令牌,这会在文本处理中产生问题

就像语言本身一样,标记化依赖于上下文,定义了告诉spaCy如何根据周围字符分割文本的规则。spaCy的默认设置也针对通用文本进行了优化,如新闻文本、网络文本和其他现代写作

在您的示例中,您遇到了一个有趣的例子:抽象字符串
“x-xxmessage-id:
在标点符号上被拆分,而孤立的小写字符串
“id”
被拆分为
“i”
“d”
,因为在书面文本中,它通常是“i'd”或“i'd”(“i can”,“i will”)的替代拼写等等)。您可以找到相应的规则

如果你处理的特定文本与常规自然语言文本有很大的不同,你通常会想要,甚至可能会为你自己的习惯“方言”添加一个。如果有固定数量的案例需要以不同的方式标记,而这些案例可以用规则表示,那么另一种选择是向管道中添加一个组件

最后,您还可以尝试改用该类。它仍然包括非常基本的标记化规则,比如标点符号拆分,但没有一条规则是针对英语的

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

我懂了。问题是,我的文本并不仅仅来自一个特定的类别。一旦它可能是像id一样的识别,而在另一种情况下,它可能是像我一样的id。目前,我把它作为一个特例添加,因为不管怎样,即使我只得到“I”,我也会把它作为一个停止词跳过。目前我已经将它添加为一个特例:special_case=[{ORTH:u'id',LEMMA:u'id',POS:u'NOUN'}]nlp.tokenizer.add_special_case(u'id',special_case)是的,仅用基于规则的标记来解决这个问题肯定很棘手。在即将到来的v2.1中,解析器将能够学习合并令牌。这主要适用于中文、日文、韩文等语言,但也可能对您的用例有所帮助。然后,您可以使用这两种类型的示例对模型进行后期训练,并且过分割的标记(如
“id”
“id”上下文中的)将自动合并。