2016-03-15 1 views
1

Je suis un étudiant en informatique, je suis en train de faire un projet de PNL. Je l'ai fait un programme pour convertir une phrase d'entrée donnée dans la représentation de la structure de dépendance en utilisant le code suivantExtraction d'éléments sémantiques majeurs à partir de la représentation de dépendance nlp de stanford core

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); 
       }  

}    

Je reçois la sortie pour la phrase exemple donné « Un chat est assis sur la table » comme le montre figure -> sitting/VBG (root) -> cat/NN (nsubj) -> A/DT (det) -> is/VBZ (aux) -> table/NN (nmod:on) -> on/IN (case) -> the/DT (det) Maintenant, ce que je veux, c'est extraire les éléments sémantiques majeurs de la représentation de dépendance donnée. Par exemple, dans la phrase donnée je veux récupérer assis, cat et tableau. C'est pour une phrase simple et générale, je veux récupérer le mot racine, le sujet et l'objet. Tout le monde s'il vous plaît aider avec des exemples de codes.

Répondre

1

Pour les cas simples, vous pouvez définir Semgrex patterns sur le graphique de dépendance. Par exemple, pour extraire sujet/verbe/objet que vous pouvez utiliser le triplets du code ci-dessous:

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()); 
} 

Notez que même votre exemple n'est pas dans ce cas simple cependant. Vous avez un bord nmod:on au lieu d'un bord dobj entre et table. Comme les choses deviennent plus complexes, il pourrait être utile de prendre la sortie Stanford OpenIE à leur valeur nominale:

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

Cela vous obtenir un triple (cat; is sitting on; table), et peut-être il est plus facile de post-traiter cela en (cat; sitting; table) ou quel que soit votre réelle l'application en aval est.