Я пытаюсь выяснить способ перезаписи предложений путем "разрешения" (замены слов) их связей с помощью модуля Stanford Corenlp Coreference.
Идея состоит в том, чтобы переписать предложение следующим образом:
Джон поехал в дом Джудиуса. Он обедал.
в
Джон поехал в дом Джудиуса. Джон приготовил обед Джуди.
Вот код, с которым я обманывал:
private void doTest(String text){
Annotation doc = new Annotation(text);
pipeline.annotate(doc);
Map<Integer, CorefChain> corefs = doc.get(CorefChainAnnotation.class);
List<CoreMap> sentences = doc.get(CoreAnnotations.SentencesAnnotation.class);
List<String> resolved = new ArrayList<String>();
for (CoreMap sentence : sentences) {
List<CoreLabel> tokens = sentence.get(CoreAnnotations.TokensAnnotation.class);
for (CoreLabel token : tokens) {
Integer corefClustId= token.get(CorefCoreAnnotations.CorefClusterIdAnnotation.class);
System.out.println(token.word() + " --> corefClusterID = " + corefClustId);
CorefChain chain = corefs.get(corefClustId);
System.out.println("matched chain = " + chain);
if(chain==null){
resolved.add(token.word());
}else{
int sentINdx = chain.getRepresentativeMention().sentNum -1;
CoreMap corefSentence = sentences.get(sentINdx);
List<CoreLabel> corefSentenceTokens = corefSentence.get(TokensAnnotation.class);
String newwords = "";
CorefMention reprMent = chain.getRepresentativeMention();
System.out.println(reprMent);
for(int i = reprMent.startIndex; i<reprMent.endIndex; i++){
CoreLabel matchedLabel = corefSentenceTokens.get(i-1); //resolved.add(tokens.get(i).word());
resolved.add(matchedLabel.word());
newwords+=matchedLabel.word()+" ";
}
System.out.println("converting " + token.word() + " to " + newwords);
}
System.out.println();
System.out.println();
System.out.println("-----------------------------------------------------------------");
}
}
String resolvedStr ="";
System.out.println();
for (String str : resolved) {
resolvedStr+=str+" ";
}
System.out.println(resolvedStr);
}
Лучший результат, который я смог достичь на данный момент, -
Джон поехал в дом Джуди Джуди. Джон заставил Джуди поужинать.
который не очень близок...
Я уверен, что есть более простой способ сделать то, что я пытаюсь достичь.
В идеале я хотел бы реорганизовать предложение как список CoreLabels, чтобы я мог сохранить другие данные, которые они привязали к ним.
Любая помощь была оценена.