Ich versuche, die Möglichkeit zu finden, Sätze durch "Auflösen" (Ersetzen Wörter) mit ihren Koreferenzen mit Stanford Corenlp Coreference-Modul neu zu schreiben.Wie man ein Wort durch seine repräsentativste Erwähnung mit Stanford CoreNLP-Modul
Die Idee ist, einen Satz wie folgt neu schreiben:
John zu Judys Haus fuhr. Er machte ihr Abendessen.
in
John fuhr Haus zu Judys. John machte Judy zum Abendessen.
Hier ist der Code, den ich mit dem herum täuscht habe:
jetztprivate 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);
}
Der beste Ausgang ich in der Lage war, ist
John fuhr nach Judy 's' s Judy zu erreichen 's Haus. John machte Judy ihr Abendessen.
, die nicht sehr brillant ...
Ich bin mir ziemlich sicher, dass es eine viel einfachere Art und Weise zu tun, was ich zu erreichen versuchen.
Idealerweise möchte ich den Satz als eine Liste von CoreLabels reorganisieren, so dass ich die anderen Daten behalten konnte, die sie an sie angehängt haben.
Jede Hilfe wird geschätzt.
Vielen Dank für Ihre Antwort! Es hilft mir sehr. Gibt es im zweiten Satz einen generischen Weg, um herauszufinden, dass "sie" durch "Judy" und nicht "Judy" ersetzt werden sollte? Nach der ganzen Zieleinheit ist Judy. So gibt es einen Weg, entweder mit POS-Tags oder Parse-Tree, um die "s" loszuwerden. Ich habe noch nicht viele andere Sätze getestet, aber ich bin sicher, dass ich andere Beispiele finden werde. Danke noch einmal. – azpublic
Ich denke du könntest das headIndex Attribut des Repräsentanten erwähnen um den Kopf des NP zu finden. – yvespeirsman