2015-01-09 8 views
5

Come posso ottenere la stessa analisi delle dipendenze a livello di codice utilizzando stanford corenlp come mostrato nella demo online?Come ottenere l'output di analisi delle dipendenze esattamente come demo online?

Sto utilizzando il pacchetto corenlp per ottenere l'analisi delle dipendenze per la seguente frase.

Secondo operatore sanitario in Texas, i test positivi per Ebola, dicono le autorità.

cerco di ottenere il parsing di programmazione utilizzando il codice qui sotto

  Properties props = new Properties(); 
      props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); 
      StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

      String text = "Second healthcare worker in Texas tests positive for Ebola , authorities say ."; // Add your text here! 
      Annotation document = new Annotation(text); 
      pipeline.annotate(document); 
      String[] myStringArray = {"SentencesAnnotation"}; 
      List<CoreMap> sentences = document.get(SentencesAnnotation.class); 
      for(CoreMap sentence: sentences) { 
       SemanticGraph dependencies = sentence.get(BasicDependenciesAnnotation.class); 
       IndexedWord root = dependencies.getFirstRoot(); 
       System.out.printf("root(ROOT-0, %s-%d)%n", root.word(), root.index()); 
       for (SemanticGraphEdge e : dependencies.edgeIterable()) { 
        System.out.printf ("%s(%s-%d, %s-%d)%n", e.getRelation().toString(), e.getGovernor().word(), e.getGovernor().index(), e.getDependent().word(), e.getDependent().index()); 
       } 
      } 

    } 

ottengo il seguente output utilizzando il corenlp Stanford 3.5.0 pacchetto.

root(ROOT-0, worker-3) 
amod(worker-3, Second-1) 
nn(worker-3, healthcare-2) 
prep(worker-3, in-4) 
amod(worker-3, positive-7) 
dep(worker-3, say-12) 
pobj(in-4, tests-6) 
nn(tests-6, Texas-5) 
prep(positive-7, for-8) 
pobj(for-8, ebola-9) 
nsubj(say-12, authorities-11) 

Ma la demo online dà una risposta diversa che segna dicono come la radice e ha altre relazioni come Ccomp tra le parole del parsing.

amod(worker-3, Second-1) 
nn(worker-3, healthcare-2) 
nsubj(tests-6, worker-3) 
prep(worker-3, in-4) 
pobj(in-4, Texas-5) 
ccomp(say-12, tests-6) 
acomp(tests-6, positive-7) 
prep(positive-7, for-8) 
pobj(for-8, Ebola-9) 
nsubj(say-12, authorities-11) 
root(ROOT-0, say-12) 

Come posso risolvere il risultato in modo che corrisponda alla demo online?

+0

Credo che il parser sia deterministico. Assicurati di eseguire la stessa versione di CoreNLP come demo online e di utilizzare lo stesso modello. Potrebbe essere necessario inviare per e-mail il team di Stanford e chiedere quale versione/modello sono in esecuzione sul sito Web, non è sicuro che lo menzionino effettivamente. – mbatchkarov

risposta

9

Il motivo per il diverso output è che se si utilizza parser demo, viene utilizzata la distribuzione parser autonoma e il codice utilizza l'intera distribuzione CoreNLP. Sebbene entrambi utilizzino lo stesso parser e gli stessi modelli, la configurazione predefinita di CoreNLP esegue un tagger di parte vocale (POS) prima di eseguire il parser e il parser incorpora le informazioni POS che possono portare a risultati diversi in alcuni casi.

Al fine di ottenere gli stessi risultati è possibile disattivare il tagger POS modificando l'elenco dei commentatori:

props.put("annotators", "tokenize, ssplit, parse, lemma, ner, dcoref"); 

Si noti, tuttavia, che il lemma, ner e commentatori dcoref tutti richiedono i tag POS, in modo da devi cambiare l'ordine degli annotatori.

C'è anche uno CoreNLP demo che dovrebbe sempre produrre lo stesso output del codice.

+0

Grazie per la spiegazione. Ho verificato che utilizzando gli annotatori che hai menzionato, sono stato in grado di ottenere l'output di analisi delle dipendenze esattamente come quello della demo online per l'esempio che ho citato. Segnalo come la risposta giusta. –

Problemi correlati