2012-12-18 10 views
6

Czy ktoś ma jakieś doświadczenia z użyciem StanfordCoreNLP (http://nlp.stanford.edu/software/corenlp.shtml przez rJava w R? Byłem stara się zmusić go do pracy przez dwa dni teraz, i myślę, że wyczerpałem Google i poprzednie pytania na temat StackOverflow.Korzystanie z bibliotek Stanford NLP od wewnątrz R, przy użyciu pakietu rJava

Zasadniczo próbuję korzystać z bibliotek StanfordNLP z poziomu R. Mam zerowe doświadczenie z językiem Java, ale doświadczenie z innymi językami, więc rozumiem podstawy dotyczące klas i obiekty itp.

Z tego co widzę plik demo .java że pochodzi z bibliotek wydaje się wskazywać, że aby skorzystać z klas od wewnątrz Java, można importować biblioteki, a następnie utworzyć nowy obiekt, wzdłuż linii:

import java.io.*; 
import java.util.*; 

import edu.stanford.nlp.io.*; 
import edu.stanford.nlp.ling.*; 
import edu.stanford.nlp.pipeline.*; 
import edu.stanford.nlp.trees.*; 
import edu.stanford.nlp.util.*; 

    public class demo { 

     etc. 
     etc. 

     StanfordCoreNLP pipeline = new StanfordCoreNLP(); 

     etc. 

od wewnątrz R, próbowałem wywoływanie niektórych standardowych funkcji java; działa to dobrze, co sprawia, że ​​myślę, że to jest sposób, w jaki próbuję uzyskać dostęp do bibliotek Stanford, które powodują ten problem.

Wyodrębniono plik Stanford ZIP do h: \ stanfordcore, więc pliki .jar znajdują się w katalogu głównym tego katalogu. Jak również różne inne pliki zawarte w zamek błyskawiczny, zawiera główne .jar:

  • Joda-time.jar
  • Stanford-corenlp-1.3.4.jar
  • Stanford-corenlp- 1.3.4-javadoc.jar
  • stanford-corenlp-1.3.4-models.jar
  • Joda czasie-2,1-sources.jar
  • jollyday-0.4.7-sources.jar
  • stanford- corenlp-1.3.4-sources.jar
  • xom.jar
  • jollyday.jar

Gdy próbuję uzyskać dostęp do narzędzi NLP z linii poleceń, to działa dobrze.

Od wewnątrz R, I initalized JVM i ustawić zmienną ścieżce klasy:

.jinit(classpath = " h:/stanfordcore", parameters = getOption("java.parameters"),silent = FALSE, force.init = TRUE) 

Po tym, jeśli mam użyć polecenia

.jclassPath() 

To pokazuje, że katalog zawierający wymaganą .jar pliki zostały dodane i daje to wyjście w R:

[1] "H: \ RProject-2.15.1 \ biblioteka \ rJava \ java" "h: \ stanfordcore"

Jednak gdy próbuję utworzyć nowy obiekt (nie wiem, czy jest to właściwa terminologia Java), pojawia się błąd.

Próbowałem tworzenia obiektu w dziesiątki różnych sposobów (w zasadzie filmowania w ciemności choć), ale najbardziej obiecujące (tylko dlatego, że wydaje się rzeczywiście znaleźć klasę jest):

pipeline <- .jnew(class="edu/stanford/nlp/pipeline/StanfordCoreNLP",check=TRUE,silent=FALSE) 

I Wiem, że to znajduje klasę, ponieważ jeśli zmienię parametr klasy na coś, co nie jest wymienione w interfejsie API, otrzymam komunikat, że nie można znaleźć błędu klasy.

W obecnej jednak, pojawia się błąd:

Błąd w .jnew (class = "edu/Stanford/NLP/rurociąg/StanfordCoreNLP" check = TRUE: java.lang.NoClassDefFoundError : Nie można zainicjować klasy edu.stanford.nlp.pipeline.StanfordCoreNLP

Moje googlowanie wskazuje, że może to mieć związek z brakiem wymaganego pliku .jar, ale całkowicie utknąłem. Czy brakuje mi czegoś oczywistego ?

Jeśli ktoś może wskazać mi choć trochę we właściwym kierunku, byłbym niewiarygodnie wdzięczny.

Z góry dziękuję!

Peter

+0

Nie, ale odniosłem sukces z openNLP, który wydaje się robić to, o co prosisz: http://cran.r-project.org/web/packages/openNLP/openNLP.pdf. Pomiędzy tym i pakietem 'tm', wydaje mi się, że będziesz miał sporo narzędzi, które zostały przetestowane i pracują z R raczej łatwo. –

+0

Nie posiadam doświadczenia rjava i moja pierwsza próba również nie powiodła się. (Widziałem w pomocy dla rjava, że ​​zalecał używanie pakietu .jpackage, a nie .jinit, jak to jest.) Ale jest to tylko ogólny błąd, gdy nie można znaleźć klasy. Twój problem nie jest specyficzny dla StanfordCoreNLP, ale raczej kwestia nauki, jak uzyskać rjava, aby załadować dowolną bibliotekę zewnętrzną w pliku jar .... –

+0

Dzięki @TylerRinker. Właściwie mam już instalację, która używa tm, OpenNLP i Wordnet, która działa dobrze. Jednak w moim nowym projekcie naprawdę potrzebuję syntaktycznego parsera, który wydaje się nadal być w fazie eksperymentalnej z OpenNLP (przynajmniej to, co mówią doktorzy na swojej stronie internetowej). Biblioteki Stanford mają świetny parser, który obejmuje wstępnie wyszkolone modele, więc byłoby idealnie, gdybym mógł je uruchomić z R ... –

Odpowiedz

1

Twoja ścieżka klasy jest błędna - korzystasz z katalogu, ale masz pliki JAR. Musisz rozpakować wszystkie pliki JAR w określonym katalogu (nietypowym) lub musisz dodać wszystkie pliki JAR do ścieżki klasy (bardziej powszechne). [Oczywiście, będziesz musiał poprawić swoje literówki, ale zakładam, że wynikają one z faktu, że nie używasz kopiowania/wklejania).

PS: użyj listy mailingowej stats-rosuda-devel, jeśli chcesz uzyskać bardziej aktualne odpowiedzi.

+1

Dziękujemy! Próbowałem bezpośrednio dodać plik JAR StanfordCore do ścieżki klasy, ale nie zdawałem sobie sprawy, że muszę dodać inne pliki JAR ... Raczej naiwny, jak sądzę. Właśnie przetestowałem mój kod R z poprawną ścieżką klasową i teraz działa, więc jeszcze raz dziękuję! –

0

Sukces!

Po godzinach majsterkowania udało mi się znaleźć obejście. Jeśli ktoś jest zainteresowany, to właśnie zrobiłem:

  • Za pomocą Eclipse, rozpocząłem nowy projekt.

  • Następnie utworzyłem katalog o nazwie 'lib' w katalogu głównym projektu i skopiowałem wszystkie pliki .jar ze Stanford do tego katalogu.

  • Po tym, edytowałem właściwości projektu w Eclipse, przeszedłem do "Java Build Path", kliknąłem kartę biblioteki.

  • Następnie wybieram do importu bibliotek systemu Java.

  • Kliknąłem również "Dodaj zewnętrzne słoiki" i wybrałem wszystkie słoiki Stanford z katalogu lib.

  • Następnie utworzyłem intentermediary klasy Java, aby wywoływać klasy Stanford (zamiast próbować wywoływać je bezpośrednio z R).

Przykład:

import java.lang.Object; 
import java.util.Properties; 
import java.io.*; 
import java.util.*; 

import edu.stanford.nlp.io.*; 
import edu.stanford.nlp.ling.*; 
import edu.stanford.nlp.pipeline.*; 
import edu.stanford.nlp.trees.*; 
import edu.stanford.nlp.util.*; 


public class NLP { 

    public static void main(String[] args) { 

     Properties props = new Properties(); 
     props.put("annotators", "tokenize"); 
     StanfordCoreNLP coreNLP = new StanfordCoreNLP(props); 
     } 

} 

To nic nie wróci, ale pokazuje, jak obiekt Stanford mogą być tworzone.

  • Utwórz projekt za pomocą środowiska Eclipse.

  • Z poziomu R, ustaw katalog roboczy na katalog projektu Java/bin (nie jest to bezwzględnie konieczne, ponieważ można zamiast tego dodać katalog ścieżki klasy, ale upraszcza to).

Następnie obiekt może zostać stworzony w R z:

.jinit(classpath = ".") // This initilizes the JVM 
obj = .jnew("NLP") 

Po tym utworzonych w ramach klas Javy pośrednictwa jakichkolwiek metod może być wywołana z:

Name_of_var_to_store_return_value = . jcall(class name, signature type, method, paramters) 

I wciąż nie rozumiem, dlaczego nie mogę nazwać klas Stanford bezpośrednio z R, ale ta metoda działa. Podejrzewam, że @ChristopherManning ma rację i mój problem polega na wywołaniu zewnętrznego słoja z R. Budując go od zera, słoiki Stanford są połączone podczas kompilacji, więc myślę, że to właśnie naprawiło.