【问题标题】:how to get rid of NOUN tag for unknown words in Spacy POS tag?如何摆脱 Spacy POS 标签中未知单词的名词标签?
【发布时间】:2020-12-30 06:02:47
【问题描述】:

我正在为一些文本做 POS 标签。我使用 spacy 来获取 POS 标签。为什么我得到未知单词的名词标签?例如,如果我通过 sbxdata,我会得到名词标签。我希望没有像 sbxdata 这样有意义的词。我想要的是,我不应该获得任何未知单词的标签,或者我只想获得常见英语单词的 POS 标签。有任何库/任何可用的方法吗?

例如,我有下面的句子。

value大列sbxdata实际最大ptsavatar

为此,我得到了以下 POS 标签。

如何去掉 sbxdata 和 ptsavatar 的名词标签。同样,我需要摆脱未知单词的任何随机标签。另外,我怀疑,默认情况下它是名词。任何帮助将不胜感激。

这是我的代码。

import spacy
nlp = spacy.load('en', disable=['parser', 'ner'])
doc = nlp(" ".join("value large column sbxdata actual maximum ptsavatar"))
print('NLP doc :::', doc)
for token in doc:                    
  print('token :::',token,' --> token.pos_ :::',token.pos_)

【问题讨论】:

    标签: python spacy


    【解决方案1】:

    遗憾的是,我在spacy documentation 中没有找到关于此的明确通知 但看起来,您对 NOUN 的默认分配的猜测是正确的。

    有一些建议使用 spacy 的向量来确定一个单词是否是一个真正的英语单词。但是,这对我不起作用。

    使用普通的旧拼写检查器怎么样?至少可以使用pyspellchecker 过滤掉您示例中的两个明显案例。

    import spacy
    from spellchecker import SpellChecker
    
    nlp = spacy.load('en', disable=['parser', 'ner'])
    
    spell = SpellChecker()
    
    if __name__ == '__main__':
        doc = nlp("He who values value large column sbxdata actual maximum ptsavatar")
    
        known = set(spell.known([token.text.lower() for token in doc]))
    
        for token in doc:
            if token.text.lower() in known:
                pos = token.pos_
            else:
                pos = ""
    
            print(f'{pos:5s} {token}')
    
    

    给我

    PRON  He
    PRON  who
    VERB  values
    VERB  value
    ADJ   large
    NOUN  column
          sbxdata
    ADJ   actual
    ADJ   maximum
          ptsavatar
    

    【讨论】:

      【解决方案2】:

      词性标注器尝试为每个标记(或单词)找到最适合单词的标签。如果您在句子中使用 sbxdata 之类的未知词,则更有可能将其用作名词。从句法而不是语义上考虑它。这是一个示例:“我想摆脱 sbxdata。”虽然在这个句子中 sbxdata 没有已知的含义,但它实际上在句子中用作名词。所以实际上并不是那么随机。

      另外请记住,因为词性标注器必须为任何给定单词找到一个标签,如果标注器很难找到正确的标签,这是正常的,它只会返回一个默认标签,如名词。

      【讨论】:

      • 你能提供一个链接NOUN是默认的吗?
      • 我不确定 spacy 是否默认使用名词,但我认为这是个好主意,因为名词是大多数语料库中最有可能的标签。查看nltk.org/book/ch05.html(第 4.1 节默认标记器)了解更多信息。
      【解决方案3】:

      澄清一些误解。

      SpaCy 没有默认TAG 的概念,除了作为词汇外可能会在模型预测中产生偏差。 spaCy 为TAG 分配所做的工作正在使用:

      使用具有残差连接、层归一化和 maxout 非线性的卷积层,比标准 BiLSTM 解决方案提供更好的效率。

      预测多标签类概率:

      这个卷积层在标注器、解析器和 NER 之间共享,也将由未来的神经词元分析器共享。因为解析器与标注器共享这些层,所以解析器不需要标注特征。我从 David Weiss 的“Stack Combination”论文中得到了这个技巧。

      为了增强表示,标注器实际上预测了一个带有 POS、形态和依赖标签的“超级标签”5。标注器通过在卷积层上添加一个 softmax 层来预测这些超级标签——因此,我们正在教卷积层给我们一个表示,它是来自这个信息丰富的词汇信息的一个仿射变换。这显然对解析器有好处(它也反向支持卷积)。解析器模型通过连接其上下文标记的向量表示来生成状态向量。 source

      你可以找到预测的源代码here

      从多标签概率中选择某些 TAG 的神奇之处发生在 here

      doc_guesses = doc_scores.argmax(axis=1)
      

      这是一组预测中的简单argmax。一般来说,在机器学习中不会有“默认”值,除非有非常充分的理由这样做。

      回到 OP:

      如何去掉 sbxdata 和 ptsavatar 的名词标签。

      标记的分配是基于向量的模型的合理选择,包括 OOV 向量全为零,以及有关周围标记的信息(请参阅上面的链接)。如果你出于某种原因不喜欢它们,我可以想到两种情况:

      1. 要么用虚拟令牌 删除/替换你不喜欢的东西,要么
      2. 通过在原始文本输入中分配看起来很奇怪的词 从头开始​​重新训练您的模型

      注意,在这两种情况下,您都需要定义什么是可接受的,什么是不可接受的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-05
        • 2022-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多