使用Stanford POS Tagger获取多个标签

时间:2013-05-28 12:09:55

标签: nlp stanford-nlp pos-tagger

我正在使用Stanford POS Tagger执行POS标记。标记器仅为输入句子返回一个可能的标记。例如,当提供输入句子“小丑哭泣”时,POS标记器会产生(错误的)“The_DT clown_NN weeps_NNS ._。”。

但是,我的应用程序将尝试解析结果,并可能拒绝POS标记,因为无法解析它。因此,在此示例中,它将拒绝“The_DT clown_NN weeps_NNS ._”。但会接受“The_DT clown_NN weeps_VBZ ._。”我假设它是解析器的低置信度标记。

因此,我希望POS标记器为每个单词的标记提供多个假设,并通过某种置信度值进行注释。通过这种方式,我的应用程序可以选择具有最高置信度的POS标记,从而实现有效的解析。

我发现没有办法要求Stanford POS Tagger为每个单词(甚至整个句子)产生多个(最好的)标记假设。有没有办法做到这一点? (或者,我也可以使用具有相同性能的另一个POS标记器来支持此功能。)

3 个答案:

答案 0 :(得分:1)

OpenNLP可使POS标签获得最佳效果:

某些应用程序需要检索n个最佳pos标签序列,然后 不仅是最佳顺序。 topKSequences方法能够 返回顶部序列。可以通过类似于标签的方式来调用它。

Sequence topSequences[] = tagger.topKSequences(sent);

每个序列对象包含一个序列。可以通过Sequence.getOutcomes()检索序列,该序列返回一个标签数组,然后 Sequence.getProbs()返回此序列的概率数组。

此外,还有一种方法可以使spaCy执行以下操作:

Doc.set_extension('tag_scores', default=None)
Token.set_extension('tag_scores', getter=lambda token: token.doc._.tag_scores[token.i])

class ProbabilityTagger(Tagger):
    def predict(self, docs):
        tokvecs = self.model.tok2vec(docs)
        scores = self.model.softmax(tokvecs)
        guesses = []
        for i, doc_scores in enumerate(scores):
            docs[i]._.tag_scores = doc_scores
            doc_guesses = doc_scores.argmax(axis=1)

            if not isinstance(doc_guesses, numpy.ndarray):
                doc_guesses = doc_guesses.get()
            guesses.append(doc_guesses)
        return guesses, tokvecs


Language.factories['tagger'] = lambda nlp, **cfg: ProbabilityTagger(nlp.vocab, **cfg)

然后,每个令牌都将具有tag_score,其中包含来自spaCy的tag map的每个语音部分的概率。

来源:https://github.com/explosion/spaCy/issues/2087

答案 1 :(得分:0)

我不知道为英语短语提供多种POS解释的标记器(this is for spanish)其他选项可能是更改或组合标记,我的意思是,在Freeling中使用您自己的示例我得到了您的预期结果

enter image description here

此外,您还可以看到Freeling在其上下文中显示了某些单词的其他可能POS解释。

  

注意:也许如果您使用过Freeling,您知道为了机器可读性,您可以使用xml输出(在结果下面)并且为了自动化,您可以将Freeling与python / java集成,但通常我更喜欢只需通过命令行调用它。

答案 2 :(得分:-1)

我们发现POS taggin的默认模型不够好。原来,使用不同的模型更好的标签。我们目前正在使用wsj-0-18-bidirectional-distsim,性能足以满足大多数任务的需要。我这样包括它:

props.put("pos.model",
    "edu/stanford/nlp/models/pos-tagger/wsj-bidirectional/wsj-0-18-bidirectional-distsim.tagger");
props.put("annotators", "tokenize, ssplit, pos, ...");
pipeline = new StanfordCoreNLP(props);