Я пытаюсь построить алгоритм упрощения предложений на основе Stanford CoreNLP. Одно из упрощений я хочу сделать - преобразовать предложение с однородными частями предложения в несколько предложений. Например.
Я люблю маму, папу и сестру. -> Я люблю свою маму. Я люблю своего папу. Я люблю свою сестру.
Прежде всего я строю семантический граф для входной строки предложения
final Sentence parsed = new Sentence(sentence);
final SemanticGraph dependencies = parsed.dependencyGraph();
График зависимости для этого предложения
-> love/VBP (root)
-> I/PRP (nsubj)
-> mom/NN (dobj)
-> my/PRP$ (nmod:poss)
-> ,/, (punct)
-> dad/NN (conj:and)
-> and/CC (cc)
-> sister/NN (conj:and)
-> dad/NN (dobj)
-> sister/NN (dobj)
Затем я нашел dobj
ребер в графе и nsubj
for (SemanticGraphEdge edge : dependencies.edgeListSorted()) {
if (edge.getRelation().getShortName().startsWith("dobj")) {
modifiers.add(edge);
} else if (edge.getRelation().getShortName().startsWith("nsubj")) {
subj = edge;
}
}
Итак, теперь у меня есть 3 ребра в modifiers
и nsubj
со словом I
. И теперь моя проблема заключается в том, как разделить семантический граф на 3 отдельных графика. Конечно, наивным решением было просто построить базу предложений на основе subj и губернатора/зависимого от dobj
ребер, но я понимаю, что это плохая идея и не будет работать на более сложных примерах.
for (final SemanticGraphEdge edge : modifiers) {
SemanticGraph semanticGraph = dependencies.makeSoftCopy();
final IndexedWord governor = edge.getGovernor();
final IndexedWord dependent = edge.getDependent();
final String governorTag = governor.backingLabel().tag().toLowerCase();
if (governorTag.startsWith("vb")) {
StringBuilder b = new StringBuilder(subj.getDependent().word());
b.append(" ")
.append(governor.word())
.append(" ")
.append(dependent.word())
.append(". ");
System.out.println(b);
}
}
Кто-нибудь может дать мне несколько советов? Может быть, я пропустил что-то полезное в документации coreNLP? Спасибо.