Sto cercando di capire come riscrivere le frasi risolvendo (sostituendo le parole con) le loro coreferenze utilizzando il modulo Coreferenza di Stanford Corenlp.Come sostituire una parola con la sua menzione più rappresentativa utilizzando il modulo Stanford CoreNLP Coreferences
L'idea è quella di riscrivere una frase come la seguente:
John ha spinto a casa di Judy. La fece cenare.
in
John ha spinto a casa di Judy. John ha fatto cena a Judy.
Ecco il codice che ho scherzare con:
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);
}
L'uscita migliore sono stato in grado di ottenere per ora è
John ha spinto a Judy 's' s Judy La casa John ha fatto la cena a Judy.
che non è molto brillante ...
Sono abbastanza sicuro che c'è un modo molto più semplice per fare quello che sto cercando di realizzare.
Idealmente, mi piacerebbe riorganizzare la frase come un elenco di CoreLabels, in modo da poter conservare gli altri dati a cui sono collegati.
Qualsiasi aiuto apprezzato.
Grazie mille per la risposta! Mi aiuta molto. Nella seconda frase, c'è un modo generico per capire che "lei" dovrebbe essere sostituita da "Judy" e non "Judy's". Dopo tutto l'entità target è Judy. Quindi esiste un modo con tag pos o albero di analisi per sbarazzarsi delle "s". Non ho ancora provato molte altre frasi, ma sono sicuro che troverò altri esempi. Grazie ancora. – azpublic
Immagino che potresti farti l'attributo headIndex della citazione rappresentante per trovare il capo del NP. – yvespeirsman