如何在CoreNLP中将String传递给AbstractSequenceClassifier.classifyAndWriteAnswersKBest?

时间:2017-03-18 10:40:02

标签: java stanford-nlp

AbstractSequenceClassifier.classifyAndWriteAnswersKBest允许传递文件名和ObjectBank<List<IN>>,但ObjectBank的文档中不清楚如何创建此类ObjectBank不涉及文件。

我使用CoreNLP 3.7.0和Java 8。

1 个答案:

答案 0 :(得分:1)

您应该只使用此方法:

Counter<List<IN>> classifyKBest(List<IN> doc, Class<? extends CoreAnnotation<String>> answerField, int k)

它将返回返回序列到分数的映射。

使用这行代码,您可以将该计数器转换为已排序的序列列表:

List<List<IN>> sorted = Counters.toSortedList(kBest);

我不确定你到底想要做什么,但通常IN是CoreLabel。这里的关键是将您的String转换为IN列表。这应该是CoreLabel,但我不知道您正在使用的AbstractSequenceClassifier的完整细节。

如果要在句子上运行序列分类器,可以先用管道对其进行标记,然后将令牌列表传递给classifyKBest(...)

例如,如果在您的示例中,您尝试获取k-best命名实体标记:

// set up pipeline
Properties props = new Properties();
props.setProperty("annotators", "tokenize");
StanfordCoreNLP tokenizerPipeline = new StanfordCoreNLP(props);

// get list of tokens for example sentence
String exampleSentence = "...";
// wrap sentence in an Annotation object
Annotation annotation = new Annotation(exampleSentence);
// tokenize sentence
tokenizerPipeline.annotate(annotation);
// get the list of tokens
List<CoreLabel> tokens = annotation.get(CoreAnnotations.TokensAnnotation.class);

//...
// classifier should be an AbstractSequenceClassifier

// get the k best sequences from your abstract sequence classifier
Counter<List<CoreLabel>> kBestSequences = classifier.classifyKBest(tokens,CoreAnnotations.NamedEntityTagAnnotation.class, 10)
// sort the k-best examples
List<List<CoreLabel>> sortedKBest = Counters.toSortedList(kBestSequences);
// example: getting the second best list
List<CoreLabel> secondBest = sortedKBest.get(1);
// example: print out the tags for the second best list
System.out.println(secondBest.stream().map(token->token.get(CoreAnnotations.NamedEntityTagAnnotation.class)).collect(Collectors.joining(" ")));
// example print out the score for the second best list
System.out.println(kBestSequences.getCount(secondBest));

如果您有更多问题,请告诉我,我可以帮忙!