2016-03-15 5 views
1

Я студент-информатик, теперь занимаюсь проектом НЛП. Я сделал программу для преобразования данного входного предложения и структуры зависимостей представления, используя следующий кодИзвлечение основных семантических элементов из представления зависимости stlford core nlp

private void nextActionPerformed(java.awt.event.ActionEvent evt) {          
    Properties props = new Properties(); 
    props.put("annotators", "tokenize, ssplit, pos, lemma, parse"); 
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props, false); 
    String text = input.getText(); 
    Annotation document = pipeline.process(text); 
    for(CoreMap sentence: document.get(SentencesAnnotation.class)) 
    { 
     SemanticGraph dependencies = sentence.get(CollapsedDependenciesAnnotation.class); 
     System.out.println(dependencies); 
       }  

}    

Я получаю выход для данного примера предложения «Кошка сидит на столе», как показано в Рисунок -> sitting/VBG (root) -> cat/NN (nsubj) -> A/DT (det) -> is/VBZ (aux) -> table/NN (nmod:on) -> on/IN (case) -> the/DT (det) Теперь я хочу получить основные семантические элементы из данного представления зависимостей. Например, в данном предложении я хочу получить заседание, кошка и стол. Это для простого простого предложения, я хочу получить корневое слово, тему и объект. Любой, пожалуйста, помогите с примерами кодов.

ответ

1

Для простых случаев вы можете определить Semgrex patterns над графиком зависимости. Например, чтобы извлечь предмет/глагол/объект троек можно использовать код ниже:

SemgrexPattern pattern = SemgrexPattern.compile("{$}=root >/.subj(pass)?/ {}=subject >/.obj/ {}=object"); 
SemgrexMatcher matcher = pattern.matcher(new Sentence("A cat is sitting on the table").dependencyGraph()); 
while (matcher.find()) { 
    IndexedWord root = matcher.getNode("root"); 
    IndexedWord subject = matcher.getNode("subject"); 
    IndexedWord object = matcher.getNode("object"); 
    System.err.println(root.word() + "(" + subject.word() + ", " + object.word()); 
} 

Обратите внимание, что даже ваш пример не является в этом простом случае, хотя. У вас есть край nmod:on, а не dobj край между сидя и стол. Как все становится более сложным, было бы целесообразно принять выход Stanford OpenIE по номиналу:

new Sentence("A cat is sitting on the table").openieTriples() 
    .forEach(System.err::println); 

Это поможет вам тройную (cat; is sitting on; table), и, возможно, это проще, пост-процесс это в (cat; sitting; table) или независимо от вашего фактического нисходящее приложение.

 Смежные вопросы

  • Нет связанных вопросов^_^