如何摆脱Spacy POS标签中未知单词的NOUN标签?

时间:2020-12-29 11:14:30

标签: python spacy

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

例如,我有以下句子。

value 大列 sbxdata 实际最大 ptsavatar

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

enter image description here

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

这是我的代码。

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_)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

澄清一些误解。

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

<块引用>

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

预测多标签类概率:

<块引用>

这个卷积层在标注器、解析器和 NER 之间共享,也将被未来的神经词形还原器共享。因为解析器与标记器共享这些层,所以解析器不需要标记特征。我从 David Weiss 的“堆栈组合”论文 4 中得到了这个技巧。

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

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

从多标签概率中选择特定 TAG 的神奇发生here

doc_guesses = doc_scores.argmax(axis=1)

这是一系列预测中的一个简单的 argmax。通常在机器学习中不会有“默认”值,除非有非常强烈的理由这样做。

回到 OP:

<块引用>

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

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

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

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