【问题标题】:spaCy: what is NORM-part of tokenizer_exceptions?spaCy:tokenizer_exceptions 的 NORM 部分是什么?
【发布时间】:2017-09-23 07:13:16
【问题描述】:

我正在为我的语言添加tokenizer_exceptions。我正在查看'gonna' 的英语示例,因此将规则编写如下:

'т.п.': [
    {ORTH: "т.", NORM: "тому", LEMMA: "тот"},
    {ORTH: "п.", NORM: "подобное", LEMMA: "подобный"}
],

然后当我标记化时,我希望 NORM-parts of rule 将在 token.norm_ 中(尽管没有任何关于 Token.norm_ 的文档)。但相反,我在token.norm_ 中看到了ORTH-part,而在token-instance 中却看不到NORM-part of rule。

那么Token.norm_-member 是什么,NORM-part of tokenizer_exceptions-rule 的作用是什么?

【问题讨论】:

    标签: python nlp tokenize spacy


    【解决方案1】:

    更笼统地回答这个问题:在 spaCy v1.x 中,NORM 主要用于提供标记的“规范化”形式,例如,如果标记文本“不完整”(如在gonna 示例中),或替代拼写。 v1.x 中规范的主要目的是使其可作为.norm_ 属性访问以供将来参考。

    但是,在 v2.x 中,currently in alphaNORM 属性变得更加相关,因为它也被用作模型中的一个特征。这使您可以将具有不同拼写的单词标准化为一种常见的拼写,并确保这些单词接收到相似的表示——即使其中一个单词在您的训练数据中出现的频率较低。这方面的例子是英语中的美式和英式拼写,或货币符号,它们都被规范化为$。为了使这更容易,v2.0 引入了一个新的语言数据组件,norm exceptions

    如果您正在开发自己的语言模型,我绝对建议您查看 v2.0 alpha(现在非常接近第一个候选版本)。

    【讨论】:

    • OK tnx。明白了。
    • 因此,如果NORM 属性是某种同义词(严格来说显然不是),那么对于'gonna' 示例NORM 属性在v 1.x 中是多余的,对? :)
    • @AlexMedveshchek 在 v1.x 中,模型中未使用 NORM,但在标记器异常中设置它对于提供其他属性未涵盖的信息仍然很有价值。在许多情况下,规范化形式与引理相同,因此是多余的——例如[{ORTH: 'ca', LEMMA: 'can'}, {ORTH: "n't", LEMMA: 'not'}]。但是,在“gonna”示例中,第一个标记如下所示:{ORTH: 'gon', LEMMA: 'go', NORM: 'going'} – 如果没有 NORM,您将无法理解“gonna” == “going to”。
    • 谢谢。我同意:NORM 属性在许多情况下可能非常有用,对我来说,很明显对于“gonna” - 它是至关重要的属性。但我担心的是,在对文本进行标记后,我在 Token 实例中的任何地方都看不到 NORM-attribute 的值。换句话说,当我用英文标记器标记文本“gonna”时,token[0].norm_ 的值不等于“going”,而是 ==“gon”(即ORTH)。 token[0] 中没有任何成员包含“going”的值。那么“去”去哪儿了? :)
    【解决方案2】:

    您可以绑定nlp.vocab.lex_attr_getters 中的任何函数,它将针对该词汇条目进行计算。每个标记都有一个指向其词汇项的指针,因此它们都将引用这个计算值。

    import spacy
    from spacy.attrs import NORM
    
    nlp = spacy.blank('ru') # In spacy 1, just spacy.load() here.
    
    doc = nlp(u'a a b c b')
    
    [(w.norm_, w.text) for w in doc]
    # (a, a), (a, a), (b, b), (c, c), (b, b)
    
    nlp.vocab.lex_attr_getters[NORM] = lambda string: string.upper()
    # This part should be done automatically, but isn't yet.
    for lexeme in nlp.vocab:
        lexeme.norm_ = nlp.vocab.lex_attr_getters[NORM](lexeme.orth_)
    [(w.norm_, w.text) for w in doc]
    # (a, A), (a, A), (b, B), (c, C), (b, B)
    

    您可以将这些词法属性绑定到您想要的任何东西。我不确定该绑定如何用于俄语,但您可以在源代码中更改它,或者在运行时通过重置词法属性函数来更改它。

    【讨论】:

    • 你的意思是我可以通过另外在 vocab 中设置token.norm_ 属性来设置它?例如,在加载词汇时或在我的 Language 类的 __init__() 方法中?我只是不明白您在lex_attr_getters 中的示例 - 它可以涵盖什么样的问题,因为您在 python-comment 中写道,这部分不能自动工作?
    猜你喜欢
    • 2012-06-18
    • 2020-03-17
    • 1970-01-01
    • 2010-11-17
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多