我正在使用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标记器来支持此功能。)
答案 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的每个语音部分的概率。
答案 1 :(得分:0)
我不知道为英语短语提供多种POS解释的标记器(this is for spanish)其他选项可能是更改或组合标记,我的意思是,在Freeling中使用您自己的示例我得到了您的预期结果
此外,您还可以看到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);