OpenNLP允许获得最佳的 POS 标记:
一些应用程序需要检索 n-best pos 标签序列,而不仅仅是最佳序列。topKSequences 方法能够返回顶部序列。它可以以与标签类似的方式调用。
Sequence topSequences[] = tagger.topKSequences(sent);
每个 Sequence 对象包含一个序列。可以通过 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_scores 以及 spaCy 的标签映射中每个词性的概率。
来源:https ://github.com/explosion/spaCy/issues/2087