【问题标题】:Tokenization not working the same for both case.对于这两种情况,标记化的工作方式不同。
【发布时间】:2018-06-18 20:22:25
【问题描述】:

我有一个文件

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

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

test_doc = nlp('id')

如果我尝试提取 test_doc 的标记,我会得到 'i' 和 'd'。有没有办法解决这个问题?因为我想获得与上面相同的令牌,这在文本处理中产生了问题。

【问题讨论】:

    标签: nlp spacy


    【解决方案1】:

    就像语言本身一样,标记化是依赖于上下文的,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,而在另一种情况下,它可能像我一样是 id。目前我将其添加为特例,因为无论如何即使我只得到“我”,我也会将其作为停用词跳过。目前我已将其添加为特例:special_case = [{ORTH: u'id', LEMMA: u'id', POS: u'NOUN'}] nlp.tokenizer.add_special_case(u'id', special_case )
    • 是的,仅使用基于规则的标记化来解决这个问题肯定很棘手。在即将发布的 v2.1 中,解析器将能够学习合并标记。这主要用于中文、日文、韩文等语言,但也可能对您的用例有所帮助。然后,您可以使用这两种类型的示例对模型进行后训练,并且过度分割的标记(如“ID”上下文中的"id")将自动合并。
    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2015-05-03
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多