AbstractSequenceClassifier.classifyAndWriteAnswersKBest
允许传递文件名和ObjectBank<List<IN>>
,但ObjectBank
的文档中不清楚如何创建此类ObjectBank
不涉及文件。
我使用CoreNLP 3.7.0和Java 8。
答案 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));
如果您有更多问题,请告诉我,我可以帮忙!