2015-01-09 9 views
5

Jak mogę programowo uzyskać ten sam pakiet zależności przy użyciu stanuford corenlp, jak widać w demo online?Jak uzyskać zależność od analizowania danych wyjściowych dokładnie tak, jak w wersji online?

Używam pakietu corenlp do uzyskania analizy zależności dla następującego zdania.

Drugi pracownik opieki zdrowotnej w Teksasie pozytywnie ocenia Ebola, mówią władze.

próbuję uzyskać parse programowo za pomocą poniższego

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

    } 

I uzyskać następujące dane wyjściowe przy użyciu corenlp Stanford 3.5.0 pakietu kod.

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) 

Ale demo online daje inną odpowiedź, która oznacza, jak root i ma inne relacje, takie jak ccomp między słowami w analizie.

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) 

Jak mogę rozwiązać moje wyniki, aby dopasować je do wersji demonstracyjnej online?

+0

Wierzę, że analizator składni jest deterministyczny. Upewnij się, że korzystasz z tej samej wersji CoreNLP, co wersja demonstracyjna online, i że używasz tego samego modelu. Być może będziesz musiał wysłać e-mail do zespołu Stanford i zapytać, która wersja/model jest uruchomiony na stronie internetowej - nie wiesz, czy rzeczywiście o tym wspominają. – mbatchkarov

Odpowiedz

9

Powód dla różnych danych wyjściowych jest taki, że jeśli używasz parser demo, używana jest autonomiczna dystrybucja parsera, a twój kod wykorzystuje całą dystrybucję CoreNLP. Podczas gdy obydwa używają tego samego parsera i tych samych modeli, domyślna konfiguracja CoreNLP uruchamia tagger z częściami mowy (POS) przed uruchomieniem analizatora składni, a analizator składniowy zawiera informacje POS, które w niektórych przypadkach mogą prowadzić do różnych wyników.

Aby uzyskać takie same wyniki można wyłączyć tagger POS zmieniając listę adnotatory:

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

jednak pamiętać, że lemat, ner i dcoref adnotatory wszystkie wymagają tagów POS, więc zmienić kolejność adnotatorów.

Istnieje również CoreNLP demo, który zawsze powinien dawać takie same wyniki jak kod.

+0

Dzięki za wyjaśnienie. Potwierdziłem, że używając wspomnianych anotatorów, udało mi się uzyskać wynik analizy zależności tak, jak w przykładzie demonstracyjnym online, o którym wspomniałem. Zaznaczam to jako właściwą odpowiedź. –

Powiązane problemy