Dieser Link muss sichtbarer sein. Vielleicht sollte die Top-Antwort bearbeitet werden, um dies zu erwähnen?
Lalo Sánchez
1
Nur eine Randnotiz hier Jungs. Stellen Sie sicher, dass Ihr Java für Stanford NLP auf dem neuesten Stand ist und JAVA_HOME ordnungsgemäß eingerichtet ist. Manchmal bekommen Leute "seltsame" Fehler, die darauf zurückzuführen sind.
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Versuchen Sie Folgendes in Python:
import os
from nltk.parse import stanford
os.environ['STANFORD_PARSER']='/path/to/standford/jars'
os.environ['STANFORD_MODELS']='/path/to/standford/jars'
parser = stanford.StanfordParser(model_path="/location/of/the/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.","What is your name?"))print sentences
# GUIfor line in sentences:for sentence in line:
sentence.draw()
Anmerkung 1:
In diesem Beispiel befinden sich sowohl die Parser- als auch die Modellgläser im selben Ordner.
Anmerkung 2:
Der Dateiname des Stanford-Parsers lautet: stanford-parser.jar
Der Dateiname der Stanford-Modelle lautet: stanford-parser-xxx-models.jar
Hinweis 3:
Die Datei englishPCFG.ser.gz befindet sich in der Datei models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Bitte verwenden Sie den Archivmanager, um die Datei models.jar zu entpacken.
Hinweis 4:
Stellen Sie sicher, dass Sie Java JRE (Runtime Environment) 1.8 verwenden, das auch als Oracle JDK 8 bezeichnet wird. Andernfalls erhalten Sie: Nicht unterstützte major.minor-Version 52.0.
Extrahieren Sie die Datei standford-parser-full-20xx-xx-xx.zip.
Erstellen Sie einen neuen Ordner (in meinem Beispiel 'Gläser'). Legen Sie die extrahierten Dateien in diesem JAR-Ordner ab: stanford-parser-3.xx-models.jar und stanford-parser.jar.
Wie oben gezeigt, können Sie die Umgebungsvariablen (STANFORD_PARSER & STANFORD_MODELS) verwenden, um auf diesen Ordner "jars" zu verweisen. Ich verwende Linux. Wenn Sie also Windows verwenden, verwenden Sie bitte Folgendes: C: // Ordner // Gläser.
Öffnen Sie die Datei stanford-parser-3.xx-models.jar mit einem Archivmanager (7zip).
Durchsuchen Sie die JAR-Datei. edu / stanford / nlp / models / lexparser. Extrahieren Sie erneut die Datei 'englishPCFG.ser.gz'. Merken Sie sich den Speicherort, an dem Sie diese ser.gz-Datei extrahieren.
Beim Erstellen einer StanfordParser-Instanz können Sie den Modellpfad als Parameter angeben. Dies ist der vollständige Pfad zum Modell, in unserem Fall /location/of/englishPCFG.ser.gz.
Probieren Sie mein Beispiel! (Vergessen Sie nicht, die JAR-Pfade und den Modellpfad zum ser.gz-Speicherort zu ändern.)
Welche Version des nltk wurde hinzugefügt nltk.parse.stanford? Ich habe nur nltk.tag.stanfordin NLTK 2.0.4.
Alexis
1
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
Nick Retallack
5
@alexis: Laden Sie nltk 3.0 von hier herunter. @Nick Retallack: Es sollte geändert werden inraw_parse_sents()
Rasika Perera
1
OK du hast recht. NLTK ändert die Funktion in: raw_parse_sents (). Siehe Dokumentation: nltk.org/_modules/nltk/parse/stanford.html Wenn Sie raw_parse () verwenden, rufen Sie einen Iter (Tree) als Rückgabewert ab. Das heißt, das obige Beispiel von draw () sollte funktionieren. Wenn Sie raw_parse_sents () verwenden, benötigen Sie anscheinend eine Doppelschleife. Es wird ein Iter (Iter (Baum)) zurückgegeben. Also Codebeispiel: for line in sentences: for sentence in line: sentence.draw() Sie können draw () nur für ein Tree-Objekt ausführen;)
gefahr89
1
@ Hazard89, Entschuldigung, dass Sie Ihre Antwort mit der EDITED-Notiz überschrieben haben. Vor kurzem haben sich die Leute darüber beschwert, dass der Stanford Dependency Parser erst seit NLTK v3.1 hinzugefügt wurde, und ich denke, sie haben hier und da einige Codeausschnitte aus den veralteten Antworten hier dupliziert. Um Verwirrung zu vermeiden, hielt ich es für das Beste, allen Antworten hier Haftungsausschlüsse hinzuzufügen, um die Anweisungen aus der NLTK official 3rd party toolsDokumentation zu befolgen.
Hinweis: Die folgende Antwort funktioniert nur bei:
NLTK-Version> = 3.2.4
Stanford Tools seit dem 20.04.2015 zusammengestellt
Python 2.7, 3.4 und 3.5 (Python 3.6 wird noch nicht offiziell unterstützt)
Da sich beide Tools ziemlich schnell ändern und die API 3-6 Monate später möglicherweise sehr unterschiedlich aussieht. Bitte behandeln Sie die folgende Antwort als zeitlich und nicht als ewige Lösung.
cd $HOME
# Update / Install NLTK
pip install -U nltk
# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip# Extract the zip file.
unzip stanford-ner-2015-04-20.zip
unzip stanford-parser-full-2015-04-20.zip
unzip stanford-postagger-full-2015-04-20.zip
export STANFORDTOOLSDIR=$HOME
export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers
Dann:
>>>from nltk.tag.stanford importStanfordPOSTagger>>> st =StanfordPOSTagger('english-bidirectional-distsim.tagger')>>> st.tag('What is the airspeed of an unladen swallow ?'.split())[(u'What', u'WP'),(u'is', u'VBZ'),(u'the', u'DT'),(u'airspeed', u'NN'),(u'of', u'IN'),(u'an', u'DT'),(u'unladen', u'JJ'),(u'swallow', u'VB'),(u'?', u'.')]>>>from nltk.tag importStanfordNERTagger>>> st =StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split())[(u'Rami', u'PERSON'),(u'Eid', u'PERSON'),(u'is', u'O'),(u'studying', u'O'),(u'at', u'O'),(u'Stony', u'ORGANIZATION'),(u'Brook', u'ORGANIZATION'),(u'University', u'ORGANIZATION'),(u'in', u'O'),(u'NY', u'O')]>>>from nltk.parse.stanford importStanfordParser>>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")>>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog"))[Tree('ROOT',[Tree('NP',[Tree('NP',[Tree('DT',['the']),Tree('JJ',['quick']),Tree('JJ',['brown']),Tree('NN',['fox'])]),Tree('NP',[Tree('NP',[Tree('NNS',['jumps'])]),Tree('PP',[Tree('IN',['over']),Tree('NP',[Tree('DT',['the']),Tree('JJ',['lazy']),Tree('NN',['dog'])])])])])])]>>>from nltk.parse.stanford importStanfordDependencyParser>>> dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")>>>print[parse.tree()for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")][Tree('jumps',[Tree('fox',['The','quick','brown']),Tree('dog',['over','the','lazy'])])]
In Long:
Zunächst muss beachtet werden, dass die Stanford NLP-Tools in Java und NLTK in Python geschrieben sind . Die Art und Weise, wie NLTK das Tool verbindet, erfolgt über den Aufruf des Java-Tools über die Befehlszeilenschnittstelle.
Zweitens dieNLTK API für die Stanford NLP-Tools seit Version 3.1 erheblich geändert. Es ist daher ratsam, Ihr NLTK-Paket auf Version 3.1 zu aktualisieren.
Für den Stanford Parser ist es ein Sonderfall, in dem sowohl der Stanford Parser als auch der Stanford Core NLP behandelt werden (persönlich habe ich letzteren nicht mit NLTK verwendet, ich würde lieber die Demonstration von @ dimazest auf http: //www.eecs verfolgen . qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )
Beachten Sie, dass ab NLTK v3.1, die STANFORD_JARund STANFORD_PARSERVariablen ist veraltet und nicht mehr verwendet
Länger:
SCHRITT 1
Angenommen, Sie haben Java ordnungsgemäß auf Ihrem Betriebssystem installiert.
( Hinweis : Die oben genannten Importe stellen NUR sicher, dass Sie eine korrekte NLTK-Version verwenden, die diese APIs enthält. Wenn beim Import keine Fehler angezeigt werden, bedeutet dies nicht, dass Sie die NLTK-API erfolgreich für die Verwendung der Stanford Tools konfiguriert haben.)
SCHRITT 2
Nachdem Sie überprüft haben, ob Sie die richtige Version von NLTK haben, die die erforderliche Schnittstelle für Stanford NLP-Tools enthält. Sie müssen alle erforderlichen Stanford NLP-Tools herunterladen und extrahieren.
TL; DR unter Unix:
cd $HOME
# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip# Extract the zip file.
unzip stanford-ner-2015-04-20.zip
unzip stanford-parser-full-2015-04-20.zip
unzip stanford-postagger-full-2015-04-20.zip
Richten Sie die Umgebungsvariablen so ein, dass NLTK den relevanten Dateipfad automatisch findet. Sie müssen folgende Variablen einstellen:
Fügen Sie .jarder CLASSPATHUmgebungsvariablen die entsprechende Stanford NLP- Datei hinzu .
zB für die NER wird es sein stanford-ner-2015-04-20/stanford-ner.jar
zB für den POS wird es sein stanford-postagger-full-2015-04-20/stanford-postagger.jar
zB für den Parser wird es sein stanford-parser-full-2015-04-20/stanford-parser.jarund die Parser-Modell-JAR-Datei,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
Fügen Sie der STANFORD_MODELSVariablen das entsprechende Modellverzeichnis hinzu (dh das Verzeichnis, in dem Sie die vorab trainierten Modelle speichern können).
zB für die NER wird es in sein stanford-ner-2015-04-20/classifiers/
zB für den POS wird es in sein stanford-postagger-full-2015-04-20/models/
Zum Beispiel für den Parser gibt es kein Modellverzeichnis.
Stellen Sie im Code sicher, dass nach dem STANFORD_MODELSVerzeichnis gesucht wird, bevor Sie den Modellnamen anhängen. Beachten Sie auch, dass die API automatisch versucht, die Betriebssystemumgebungen nach CLASSPATH zu durchsuchen )
Beachten Sie, dass ab NLTK v3.1 die STANFORD_JARVariablen veraltet sind und NICHT MEHR verwendet werden . Codefragmente in den folgenden Stackoverflow-Fragen funktionieren möglicherweise nicht:
Sie MÜSSEN die Variablen wie oben festlegen, bevor Sie Python starten, dann:
>>>from nltk.tag.stanford importStanfordPOSTagger>>> st =StanfordPOSTagger('english-bidirectional-distsim.tagger')>>> st.tag('What is the airspeed of an unladen swallow ?'.split())[(u'What', u'WP'),(u'is', u'VBZ'),(u'the', u'DT'),(u'airspeed', u'NN'),(u'of', u'IN'),(u'an', u'DT'),(u'unladen', u'JJ'),(u'swallow', u'VB'),(u'?', u'.')]>>>from nltk.tag importStanfordNERTagger>>> st =StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split())[(u'Rami', u'PERSON'),(u'Eid', u'PERSON'),(u'is', u'O'),(u'studying', u'O'),(u'at', u'O'),(u'Stony', u'ORGANIZATION'),(u'Brook', u'ORGANIZATION'),(u'University', u'ORGANIZATION'),(u'in', u'O'),(u'NY', u'O')]>>>from nltk.parse.stanford importStanfordParser>>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")>>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog"))[Tree('ROOT',[Tree('NP',[Tree('NP',[Tree('DT',['the']),Tree('JJ',['quick']),Tree('JJ',['brown']),Tree('NN',['fox'])]),Tree('NP',[Tree('NP',[Tree('NNS',['jumps'])]),Tree('PP',[Tree('IN',['over']),Tree('NP',[Tree('DT',['the']),Tree('JJ',['lazy']),Tree('NN',['dog'])])])])])])]
Alternativ können Sie versuchen, die Umgebungsvariablen in Python hinzuzufügen, wie in den vorherigen Antworten vorgeschlagen, aber Sie können den Parser / Tagger auch direkt anweisen, den direkten Pfad zu initialisieren, in dem Sie die gespeichert haben .jar Datei und Ihre Modelle gespeichert haben.
Es ist NICHT erforderlich, die Umgebungsvariablen festzulegen, wenn Sie die folgende Methode verwenden, ABER wenn die API ihre Parameternamen ändert, müssen Sie sie entsprechend ändern. Aus diesem Grund ist es ratsamer, die Umgebungsvariablen festzulegen, als den Python-Code an die NLTK-Version anzupassen.
Zum Beispiel ( ohne Umgebungsvariablen festzulegen ):
# POS tagging:from nltk.tag importStanfordPOSTagger
stanford_pos_dir ='/home/alvas/stanford-postagger-full-2015-04-20/'
eng_model_filename= stanford_pos_dir +'models/english-left3words-distsim.tagger'
my_path_to_jar= stanford_pos_dir +'stanford-postagger.jar'
st =StanfordPOSTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar)
st.tag('What is the airspeed of an unladen swallow ?'.split())# NER Tagging:from nltk.tag importStanfordNERTagger
stanford_ner_dir ='/home/alvas/stanford-ner/'
eng_model_filename= stanford_ner_dir +'classifiers/english.all.3class.distsim.crf.ser.gz'
my_path_to_jar= stanford_ner_dir +'stanford-ner.jar'
st =StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar)
st.tag('Rami Eid is studying at Stony Brook University in NY'.split())# Parsing:from nltk.parse.stanford importStanfordParser
stanford_parser_dir ='/home/alvas/stanford-parser/'
eng_model_path = stanford_parser_dir +"edu/stanford/nlp/models/lexparser/englishRNN.ser.gz"
my_path_to_models_jar = stanford_parser_dir +"stanford-parser-3.5.2-models.jar"
my_path_to_jar = stanford_parser_dir +"stanford-parser.jar"
parser=StanfordParser(model_path=eng_model_path, path_to_models_jar=my_path_to_models_jar, path_to_jar=my_path_to_jar)
Ich schlage vor, Sie spielen nicht mit Jython, JPype. Lassen Sie Python Python-Sachen machen und lassen Sie Java Java-Sachen machen, und holen Sie sich die Stanford Parser-Ausgabe über die Konsole.
Nachdem Sie den Stanford Parser in Ihrem Home-Verzeichnis installiert haben ~/, verwenden Sie einfach dieses Python-Rezept, um die Analyse in flachen Klammern zu erhalten:
import os
sentence ="this is a foo bar i want to parse."
os.popen("echo '"+sentence+"' > ~/stanfordtemp.txt")
parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines()
bracketed_parse =" ".join([i.strip()for i in parser_out if i.strip()[0]=="("])print bracketed_parse
Dies funktionierte für mich, außer dass ich eine Bedingung hinzufügen musste, um zu überprüfen, ob len(i.strip()) > 0ein Indexfehler aufgetreten ist. Ich denke, meine Parser-Ausgabe hatte mindestens eine Zeile, die nur aus Leerzeichen bestand.
Sei vorsichtig damit. Wenn Ihre Eingabe 's enthält , werden einige seltsame Fehler angezeigt. Es gibt bessere Möglichkeiten , Dinge auf der Kommandozeile aufzurufen
Nick Garvey
20
Ab NLTK v3.3, Benutzer sollten vermeiden , die Stanford NER oder POS - Tagger aus nltk.tagund vermeiden Stanford tokenizer / segmenter ausnltk.tokenize .
Verwenden Sie stattdessen die neue nltk.parse.corenlp.CoreNLPParserAPI.
(Vermeiden Sie die Antwort nur mit Links. Ich habe die Dokumente aus dem NLTK-Github-Wiki unten eingefügt.)
Aktualisieren Sie zunächst Ihr NLTK
pip3 install -U nltk # Make sure is >=3.3
Laden Sie dann die erforderlichen CoreNLP-Pakete herunter:
cd ~
wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-02-27.zip
unzip stanford-corenlp-full-2018-02-27.zip
cd stanford-corenlp-full-2018-02-27# Get the Chinese model
wget http://nlp.stanford.edu/software/stanford-chinese-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-chinese.properties
# Get the Arabic model
wget http://nlp.stanford.edu/software/stanford-arabic-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-arabic.properties
# Get the French model
wget http://nlp.stanford.edu/software/stanford-french-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-french.properties
# Get the German model
wget http://nlp.stanford.edu/software/stanford-german-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-german.properties
# Get the Spanish model
wget http://nlp.stanford.edu/software/stanford-spanish-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-spanish.properties
Englisch
stanford-corenlp-full-2018-02-27Starten Sie den Server noch im Verzeichnis:
>>>from nltk.parse importCoreNLPParser# Lexical Parser>>> parser =CoreNLPParser(url='http://localhost:9000')# Parse tokenized text.>>> list(parser.parse('What is the airspeed of an unladen swallow ?'.split()))[Tree('ROOT',[Tree('SBARQ',[Tree('WHNP',[Tree('WP',['What'])]),Tree('SQ',[Tree('VBZ',['is']),Tree('NP',[Tree('NP',[Tree('DT',['the']),Tree('NN',['airspeed'])]),Tree('PP',[Tree('IN',['of']),Tree('NP',[Tree('DT',['an']),Tree('JJ',['unladen'])])]),Tree('S',[Tree('VP',[Tree('VB',['swallow'])])])])]),Tree('.',['?'])])])]# Parse raw string.>>> list(parser.raw_parse('What is the airspeed of an unladen swallow ?'))[Tree('ROOT',[Tree('SBARQ',[Tree('WHNP',[Tree('WP',['What'])]),Tree('SQ',[Tree('VBZ',['is']),Tree('NP',[Tree('NP',[Tree('DT',['the']),Tree('NN',['airspeed'])]),Tree('PP',[Tree('IN',['of']),Tree('NP',[Tree('DT',['an']),Tree('JJ',['unladen'])])]),Tree('S',[Tree('VP',[Tree('VB',['swallow'])])])])]),Tree('.',['?'])])])]# Neural Dependency Parser>>>from nltk.parse.corenlp importCoreNLPDependencyParser>>> dep_parser =CoreNLPDependencyParser(url='http://localhost:9000')>>> parses = dep_parser.parse('What is the airspeed of an unladen swallow ?'.split())>>>[[(governor, dep, dependent)for governor, dep, dependent in parse.triples()]for parse in parses][[(('What','WP'),'cop',('is','VBZ')),(('What','WP'),'nsubj',('airspeed','NN')),(('airspeed','NN'),'det',('the','DT')),(('airspeed','NN'),'nmod',('swallow','VB')),(('swallow','VB'),'case',('of','IN')),(('swallow','VB'),'det',('an','DT')),(('swallow','VB'),'amod',('unladen','JJ')),(('What','WP'),'punct',('?','.'))]]# Tokenizer>>> parser =CoreNLPParser(url='http://localhost:9000')>>> list(parser.tokenize('What is the airspeed of an unladen swallow?'))['What','is','the','airspeed','of','an','unladen','swallow','?']# POS Tagger>>> pos_tagger =CoreNLPParser(url='http://localhost:9000', tagtype='pos')>>> list(pos_tagger.tag('What is the airspeed of an unladen swallow ?'.split()))[('What','WP'),('is','VBZ'),('the','DT'),('airspeed','NN'),('of','IN'),('an','DT'),('unladen','JJ'),('swallow','VB'),('?','.')]# NER Tagger>>> ner_tagger =CoreNLPParser(url='http://localhost:9000', tagtype='ner')>>> list(ner_tagger.tag(('Rami Eid is studying at Stony Brook University in NY'.split())))[('Rami','PERSON'),('Eid','PERSON'),('is','O'),('studying','O'),('at','O'),('Stony','ORGANIZATION'),('Brook','ORGANIZATION'),('University','ORGANIZATION'),('in','O'),('NY','STATE_OR_PROVINCE')]
Chinesisch
Starten Sie den Server ein wenig anders, immer noch aus dem Verzeichnis `stanford-corenlp-full-2018-02-27:
>>> pos_tagger =CoreNLPParser('http://localhost:9003', tagtype='pos')>>> pos_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())[('Barack','PROPN'),('Obama','PROPN'),('salió','VERB'),('con','ADP'),('Michael','PROPN'),('Jackson','PROPN'),('.','PUNCT')]>>> ner_tagger =CoreNLPParser('http://localhost:9003', tagtype='ner')>>> ner_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())[('Barack','PERSON'),('Obama','PERSON'),('salió','O'),('con','O'),('Michael','PERSON'),('Jackson','PERSON'),('.','O')]
Danke, das ist sehr nützlich. Die arabische Analyse ist jedoch nicht korrekt. Es
teilt
Verwenden Sie list(parser.raw_parse(text))oder list(parser.parse(parser.tokenize(text)). Das Beispiel wurde korrigiert;)
Alvas
1
Ich kann nicht glauben, dass dies nicht mehr beworben wird !!
Nimitz14
1
Leider haben NLTK nicht genug Leute meetups geht um Vorträge zu halten oder die Ressourcen , um Host - pfiffigen Entwickler Konferenz haben , um das Werkzeug zu fördern = (Fühlen Sie sich frei um diese Funktion oder NLTK in die Gemeinschaft um Ihnen vorstellen.
alvas
7
Es gibt eine Python-Schnittstelle für Stanford Parser
Wenn ich mich gut erinnere, ist der Stanford-Parser eine Java-Bibliothek, daher muss auf Ihrem Server / Computer ein Java-Interpreter ausgeführt werden.
Ich habe es einmal als Server benutzt, kombiniert mit einem PHP-Skript. Das Skript verwendete die exec () - Funktion von php, um einen Befehlszeilenaufruf an den Parser zu senden:
Ich erinnere mich nicht an alle Details dieses Befehls. Er öffnete im Grunde die Datei ToParse, analysierte sie und schrieb die Ausgabe in die Ergebnisdatei. PHP würde dann die Ergebnisdatei zur weiteren Verwendung öffnen.
Das Ende des Befehls leitet den ausführlichen Parser an NULL weiter, um zu verhindern, dass unnötige Befehlszeileninformationen das Skript stören.
Ich weiß nicht viel über Python, aber es gibt möglicherweise eine Möglichkeit, Befehlszeilenaufrufe zu tätigen.
Es ist vielleicht nicht die genaue Route, auf die Sie gehofft haben, aber hoffentlich gibt es Ihnen Inspiration. Viel Glück.
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Hier ist eine Anpassung des Codes von gefahr98, der mit nltk3.0.0 auf windoze und vermutlich auch auf den anderen Plattformen funktioniert. Passen Sie die Verzeichnisnamen entsprechend Ihrem Setup an:
import os
from nltk.parse import stanford
os.environ['STANFORD_PARSER']='d:/stanford-parser'
os.environ['STANFORD_MODELS']='d:/stanford-parser'
os.environ['JAVAHOME']='c:/Program Files/java/jre7/bin'
parser = stanford.StanfordParser(model_path="d:/stanford-grammars/englishPCFG.ser.gz")
sentences = parser.raw_parse_sents(("Hello, My name is Melroy.","What is your name?"))print sentences
Beachten Sie, dass sich der Parsing-Befehl geändert hat (siehe Quellcode unter www.nltk.org/_modules/nltk/parse/stanford.html) und dass Sie die Variable JAVAHOME definieren müssen. Ich habe versucht, die Grammatikdatei vor Ort im Glas zu lesen, habe dies aber bisher nicht getan.
Ich bin von 1989 nicht 98, aber danke für dein Beispiel;)
Gefahr89
4
Mit der Ausgabe von Stanford Parsers können Sie einen Baum in nltk (nltk.tree.Tree) erstellen.
Angenommen, der Stanford-Parser gibt Ihnen eine Datei, in der es für jeden Satz genau einen Analysebaum gibt. Dann funktioniert dieses Beispiel, obwohl es möglicherweise nicht sehr pythonisch aussieht:
f = open(sys.argv[1]+".output"+".30"+".stp","r")
parse_trees_text=[]
tree =""for line in f:if line.isspace():
parse_trees_text.append(tree)
tree =""elif"(. ...))"in line:#print "YES"
tree = tree+')'
parse_trees_text.append(tree)
tree =""else:
tree = tree + line
parse_trees=[]for t in parse_trees_text:
tree = nltk.Tree(t)
tree.__delitem__(len(tree)-1)#delete "(. .))" from tree (you don't need that)
s = traverse(tree)
parse_trees.append(tree)
+1, damit Java Java-Sachen macht und Python Python-Sachen macht. Je nachdem, wie Sie den Java-Befehl aufrufen und welche Optionen Sie verwenden, kann das Parsen der Ausgabedatei vom Stanford-Parser unterschiedlich sein. Es wäre gut, wenn Sie auch Details hinzufügen würden, wie Sie die Stanford-Analyse aufgerufen haben, um Ihre Ausgabedatei zu erhalten.
Alvas
4
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Da niemand wirklich erwähnt hat und es mich irgendwie sehr beunruhigt hat, gibt es hier eine alternative Möglichkeit, den Stanford-Parser in Python zu verwenden:
Ich bin auf einem Windows-Computer und Sie können den Parser einfach normal ausführen, wie Sie es über den Befehl tun, aber wie in einem anderen Verzeichnis, sodass Sie die Datei lexparser.bat nicht bearbeiten müssen. Geben Sie einfach den vollständigen Pfad ein.
Der schwierige Teil für mich war zu erkennen, wie man ein Java-Programm von einem anderen Pfad aus ausführt. Es muss einen besseren Weg geben, aber das funktioniert.
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Ein kleines Update (oder einfach eine Alternative) zu der umfassenden Antwort von gefahr89 zur Verwendung von Stanford Parser in NLTK und Python
Mit stanford-parser-full-2015-04-20, JRE 1.8 und nltk 3.0.4 (Python 2.7.6) müssen Sie die englische Datei PCFG.ser.gz anscheinend nicht mehr aus stanford-parser-xxx-Modellen extrahieren .jar oder Einrichten einer os.environ
from nltk.parse.stanford importStanfordParser
english_parser =StanfordParser('path/stanford-parser.jar','path/stanford-parser-3.5.2-models.jar')
s ="The real voyage of discovery consists not in seeking new landscapes, but in having new eyes."
sentences = english_parser.raw_parse_sents((s,))print sentences #only print <listiterator object> for this version#draw the treefor line in sentences:for sentence in line:
sentence.draw()
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Hier ist die Windows-Version von Alvas 'Antwort
sentences =('. '.join(['this is sentence one without a period','this is another foo bar sentence '])+'.').encode('ascii',errors ='ignore')
catpath =r"YOUR CURRENT FILE PATH"
f = open('stanfordtemp.txt','w')
f.write(sentences)
f.close()
parse_out = os.popen(catpath+r"\nlp_tools\stanford-parser-2010-08-20\lexparser.bat "+catpath+r"\stanfordtemp.txt").readlines()
bracketed_parse =" ".join([i.strip()for i in parse_out if i.strip()if i.strip()[0]=="("])
bracketed_parse ="\n(ROOT".join(bracketed_parse.split(" (ROOT")).split('\n')
aa = map(lambda x :ParentedTree.fromstring(x),bracketed_parse)
ANMERKUNGEN:
In müssen lexparser.bat Sie alle Pfade in absolute Pfade ändern, um Java-Fehler wie "Klasse nicht gefunden" zu vermeiden.
Ich empfehle Ihnen dringend, diese Methode unter Windows anzuwenden, da ich mehrere Antworten auf der Seite ausprobiert habe und alle Methoden, mit denen Python mit Java kommuniziert, fehlschlagen.
Ich möchte von Ihnen hören, wenn Sie unter Windows erfolgreich sind, und Sie können mir sagen, wie Sie all diese Probleme überwinden.
Durchsuchen Sie den Python-Wrapper nach Stanford CoreNLP, um die Python-Version zu erhalten
Ich habe viele Stunden gebraucht und endlich eine einfache Lösung für Windows-Benutzer gefunden. Grundsätzlich ist es eine zusammengefasste Version einer vorhandenen Antwort von alvas, die jedoch (hoffentlich) für diejenigen, die neu in Stanford NLP sind und Windows-Benutzer sind, leicht zu befolgen ist.
3) Legen Sie die Umgebungsvariablen (classpath und stanford_modules) aus dem entpackten Ordner fest.
import os
os.environ['CLASSPATH']="C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar"
os.environ['STANFORD_MODELS']="C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"
4) Stellen Sie die Umgebungsvariablen für JAVA so ein, wie Sie JAVA installiert haben. für mich war es unten
6) Rufen Sie das vorab trainierte Modell auf, das sich im Klassifikatorordner im entpackten Ordner befindet. Fügen Sie am Ende ".gz" für die Dateierweiterung hinzu. Für mich war das Modell, das ich verwenden wollteenglish.all.3class.distsim.crf.ser
st =StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
7) Führen Sie nun den Parser aus !! und wir sind fertig !!
st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
Hinweis: Die folgende Antwort funktioniert nur bei:
NLTK-Version == 3.2.5
Stanford Tools seit dem 31.10.2016 zusammengestellt
Python 2.7, 3.5 und 3.6
Da sich beide Tools ziemlich schnell ändern und die API 3-6 Monate später möglicherweise sehr unterschiedlich aussieht. Bitte behandeln Sie die folgende Antwort als zeitlich und nicht als ewige Lösung.
>>>from nltk.tag.stanford importCoreNLPPOSTagger,CoreNLPNERTagger>>>from nltk.parse.corenlp importCoreNLPParser>>> stpos, stner =CoreNLPPOSTagger(),CoreNLPNERTagger()>>> stpos.tag('What is the airspeed of an unladen swallow ?'.split())[(u'What', u'WP'),(u'is', u'VBZ'),(u'the', u'DT'),(u'airspeed', u'NN'),(u'of', u'IN'),(u'an', u'DT'),(u'unladen', u'JJ'),(u'swallow', u'VB'),(u'?', u'.')]>>> stner.tag('Rami Eid is studying at Stony Brook University in NY'.split())[(u'Rami', u'PERSON'),(u'Eid', u'PERSON'),(u'is', u'O'),(u'studying', u'O'),(u'at', u'O'),(u'Stony', u'ORGANIZATION'),(u'Brook', u'ORGANIZATION'),(u'University', u'ORGANIZATION'),(u'in', u'O'),(u'NY', u'O')]>>> parser =CoreNLPParser(url='http://localhost:9000')>>> next(... parser.raw_parse('The quick brown fox jumps over the lazy dog.')...).pretty_print()# doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______________|__________________________
| VP || _________|___ ||| PP ||| ________|___ |
NP || NP |
____|__________ || _______|____ |
DT JJ JJ NN VBZ IN DT JJ NN .||||||||||The quick brown fox jumps over the lazy dog .>>>(parse_fox,),(parse_wolf,)= parser.raw_parse_sents(...[...'The quick brown fox jumps over the lazy dog.',...'The quick grey wolf jumps over the lazy fox.',...]...)>>> parse_fox.pretty_print()# doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______________|__________________________
| VP || _________|___ ||| PP ||| ________|___ |
NP || NP |
____|__________ || _______|____ |
DT JJ JJ NN VBZ IN DT JJ NN .||||||||||The quick brown fox jumps over the lazy dog .>>> parse_wolf.pretty_print()# doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______________|__________________________
| VP || _________|___ ||| PP ||| ________|___ |
NP || NP |
____|_________ || _______|____ |
DT JJ JJ NN VBZ IN DT JJ NN .||||||||||The quick grey wolf jumps over the lazy fox .>>>(parse_dog,),(parse_friends,)= parser.parse_sents(...[..."I 'm a dog".split(),..."This is my friends ' cat ( the tabby )".split(),...]...)>>> parse_dog.pretty_print()# doctest: +NORMALIZE_WHITESPACE
ROOT
|
S
_______|____
| VP
| ________|___
NP | NP
|| ___|___
PRP VBP DT NN
||||
I 'm a dog
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Ich kann dies aufgrund des guten Rufs nicht als Kommentar hinterlassen, aber da ich einige Zeit damit verbracht habe, dies zu lösen, möchte ich lieber mein Problem / meine Lösung teilen, damit dieser Parser in NLTK funktioniert.
Zum Beispiel für den Parser gibt es kein Modellverzeichnis.
Dies führte mich fälschlicherweise zu:
Sei nicht vorsichtig mit dem Wert, den ich lege STANFORD_MODELS (und kümmere dich nur um meinen CLASSPATH)
lass ../path/tostanford-parser-full-2015-2012-09/models directory* praktisch leer * (oder mit einer JAR-Datei, deren Name nicht mit nltk regex übereinstimmt)!
Wenn das OP, wie ich, nur den Parser verwenden wollte, kann es verwirrend sein, dass beim Herunterladen von nichts anderem (kein POStagger, kein NER, ...) und Befolgen all dieser Anweisungen immer noch eine Fehlermeldung angezeigt wird.
Letztendlich CLASSPATHwürde ich für jeden Fall (folgende Beispiele und Erklärungen in den Antworten aus diesem Thread) immer noch den Fehler erhalten:
NLTK konnte keinen Stanford-Parser finden - (\ d +) (. (\ D +)) + - models.jar! Legen Sie die Umgebungsvariable CLASSPATH fest. Weitere Informationen zum Stanford-Parser - (\ d +) (. (\ D +)) + - models.jar,
NLTK konnte stanford-parser.jar nicht finden! Legen Sie die Umgebungsvariable CLASSPATH fest. Weitere Informationen zu stanford-parser.jar finden Sie unter: http://nlp.stanford.edu/software/lex-parser.shtml
Obwohl , was wichtig ist, konnte ich richtig laden und verwenden Sie den Parser , wenn ich die Funktion mit allen Argumenten und Pfad vollständig spezifiziert, wie in genannt:
Daher kam der Fehler von NLTKund wie es nach Jars sucht, die die bereitgestellten STANFORD_MODELSund CLASSPATHUmgebungsvariablen verwenden. Um dies zu lösen, muss sich das *-models.jarmit der richtigen Formatierung (um dem NLTKregulären Ausdruck im Code zu entsprechen, also kein -corenlp -.... jar) in dem durch bezeichneten Ordner befinden STANFORD_MODELS.
Und schließlich durch Kopieren stanford-parser-3.6.0-models.jar(oder entsprechende Version) in:
path/to/stanford-parser-full-2015-12-09/models/
Ich könnte StanfordParsermit dem Klassiker CLASSPATH, der darauf hinweist, reibungslos in Python laden stanford-parser.jar. Als solches können Sie StanfordParserohne Parameter aufrufen , die Standardeinstellung funktioniert nur.
Ich benutze nltk Version 3.2.4. Und der folgende Code hat bei mir funktioniert.
from nltk.internals import find_jars_within_path
from nltk.tag importStanfordPOSTaggerfrom nltk import word_tokenize
# Alternatively to setting the CLASSPATH add the jar and model via their
path:
jar ='/home/ubuntu/stanford-postagger-full-2017-06-09/stanford-postagger.jar'
model ='/home/ubuntu/stanford-postagger-full-2017-06-09/models/english-left3words-distsim.tagger'
pos_tagger =StanfordPOSTagger(model, jar)# Add other jars from Stanford directory
stanford_dir = pos_tagger._stanford_jar.rpartition('/')[0]
stanford_jars = find_jars_within_path(stanford_dir)
pos_tagger._stanford_jar =':'.join(stanford_jars)
text = pos_tagger.tag(word_tokenize("Open app and play movie"))print(text)
Ich denke, dies ist der Tagger und nicht der Parser
Nadav B
1
Eine neue Entwicklung des Stanford-Parsers, der auf einem neuronalen Modell basiert und mit Tensorflow trainiert wurde, wurde kürzlich zur Verwendung als Python-API zur Verfügung gestellt. Dieses Modell soll weitaus genauer sein als das Java-basierte Moel. Sie können sich sicher in eine NLTK-Pipeline integrieren.
Link zum Parser. Das Repository enthält vorab trainierte Parser-Modelle für 53 Sprachen.
Antworten:
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Versuchen Sie Folgendes in Python:
Ausgabe:
Anmerkung 1: In diesem Beispiel befinden sich sowohl die Parser- als auch die Modellgläser im selben Ordner.
Anmerkung 2:
Hinweis 3: Die Datei englishPCFG.ser.gz befindet sich in der Datei models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Bitte verwenden Sie den Archivmanager, um die Datei models.jar zu entpacken.
Hinweis 4: Stellen Sie sicher, dass Sie Java JRE (Runtime Environment) 1.8 verwenden, das auch als Oracle JDK 8 bezeichnet wird. Andernfalls erhalten Sie: Nicht unterstützte major.minor-Version 52.0.
Installation
Laden Sie NLTK v3 von folgender Adresse herunter: https://github.com/nltk/nltk . Und installieren Sie NLTK:
sudo python setup.py installieren
Sie können den NLTK-Downloader verwenden, um Stanford Parser mithilfe von Python abzurufen:
Probieren Sie mein Beispiel! (Vergessen Sie nicht, die JAR-Pfade und den Modellpfad zum ser.gz-Speicherort zu ändern.)
ODER:
Laden Sie NLTK v3 wie oben herunter und installieren Sie es.
Laden Sie die neueste Version von herunter (der aktuelle Dateiname lautet stanford-parser-full-2015-01-29.zip): http://nlp.stanford.edu/software/lex-parser.shtml#Download
Extrahieren Sie die Datei standford-parser-full-20xx-xx-xx.zip.
Erstellen Sie einen neuen Ordner (in meinem Beispiel 'Gläser'). Legen Sie die extrahierten Dateien in diesem JAR-Ordner ab: stanford-parser-3.xx-models.jar und stanford-parser.jar.
Wie oben gezeigt, können Sie die Umgebungsvariablen (STANFORD_PARSER & STANFORD_MODELS) verwenden, um auf diesen Ordner "jars" zu verweisen. Ich verwende Linux. Wenn Sie also Windows verwenden, verwenden Sie bitte Folgendes: C: // Ordner // Gläser.
Öffnen Sie die Datei stanford-parser-3.xx-models.jar mit einem Archivmanager (7zip).
Durchsuchen Sie die JAR-Datei. edu / stanford / nlp / models / lexparser. Extrahieren Sie erneut die Datei 'englishPCFG.ser.gz'. Merken Sie sich den Speicherort, an dem Sie diese ser.gz-Datei extrahieren.
Beim Erstellen einer StanfordParser-Instanz können Sie den Modellpfad als Parameter angeben. Dies ist der vollständige Pfad zum Modell, in unserem Fall /location/of/englishPCFG.ser.gz.
Probieren Sie mein Beispiel! (Vergessen Sie nicht, die JAR-Pfade und den Modellpfad zum ser.gz-Speicherort zu ändern.)
quelle
nltk.parse.stanford
? Ich habe nurnltk.tag.stanford
in NLTK2.0.4
.AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
raw_parse_sents()
for line in sentences: for sentence in line: sentence.draw()
Sie können draw () nur für ein Tree-Objekt ausführen;)NLTK official 3rd party tools
Dokumentation zu befolgen.Veraltete Antwort
Die unten stehende Antwort ist veraltet. Verwenden Sie die Lösung unter https://stackoverflow.com/a/51981566/610569 für NLTK v3.3 und höher.
BEARBEITET
Hinweis: Die folgende Antwort funktioniert nur bei:
Da sich beide Tools ziemlich schnell ändern und die API 3-6 Monate später möglicherweise sehr unterschiedlich aussieht. Bitte behandeln Sie die folgende Antwort als zeitlich und nicht als ewige Lösung.
Die neuesten Anweisungen zur Schnittstelle von Stanford NLP-Tools mit NLTK finden Sie immer unter https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software.
TL; DR
Dann:
In Long:
Zunächst muss beachtet werden, dass die Stanford NLP-Tools in Java und NLTK in Python geschrieben sind . Die Art und Weise, wie NLTK das Tool verbindet, erfolgt über den Aufruf des Java-Tools über die Befehlszeilenschnittstelle.
Zweitens die
NLTK
API für die Stanford NLP-Tools seit Version 3.1 erheblich geändert. Es ist daher ratsam, Ihr NLTK-Paket auf Version 3.1 zu aktualisieren.Drittens umfasst die
NLTK
API für Stanford NLP Tools die einzelnen NLP-Tools, z. B. Stanford POS Tagger , Stanford NER Tagger und Stanford Parser .Für den POS- und NER-Tagger wird das Stanford Core NLP-Paket NICHT umschlossen .
Für den Stanford Parser ist es ein Sonderfall, in dem sowohl der Stanford Parser als auch der Stanford Core NLP behandelt werden (persönlich habe ich letzteren nicht mit NLTK verwendet, ich würde lieber die Demonstration von @ dimazest auf http: //www.eecs verfolgen . qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )
Beachten Sie, dass ab NLTK v3.1, die
STANFORD_JAR
undSTANFORD_PARSER
Variablen ist veraltet und nicht mehr verwendetLänger:
SCHRITT 1
Angenommen, Sie haben Java ordnungsgemäß auf Ihrem Betriebssystem installiert.
Installieren / aktualisieren Sie jetzt Ihre NLTK-Version (siehe http://www.nltk.org/install.html ):
sudo pip install -U nltk
sudo apt-get install python-nltk
Für Windows (Verwenden Sie die 32-Bit-Binärinstallation):
( Warum nicht 64 Bit? Siehe https://github.com/nltk/nltk/issues/1079 )
Überprüfen Sie dann aus Paranoia heraus Ihre
nltk
Version in Python erneut:Oder in der Kommandozeile:
Stellen Sie sicher, dass Sie
3.1
als Ausgabe sehen.Überprüfen Sie für noch mehr Paranoia, ob alle Ihre bevorzugten Stanford NLP-Tools-API verfügbar sind:
( Hinweis : Die oben genannten Importe stellen NUR sicher, dass Sie eine korrekte NLTK-Version verwenden, die diese APIs enthält. Wenn beim Import keine Fehler angezeigt werden, bedeutet dies nicht, dass Sie die NLTK-API erfolgreich für die Verwendung der Stanford Tools konfiguriert haben.)
SCHRITT 2
Nachdem Sie überprüft haben, ob Sie die richtige Version von NLTK haben, die die erforderliche Schnittstelle für Stanford NLP-Tools enthält. Sie müssen alle erforderlichen Stanford NLP-Tools herunterladen und extrahieren.
TL; DR unter Unix:
In Windows / Mac:
SCHRITT 3
Richten Sie die Umgebungsvariablen so ein, dass NLTK den relevanten Dateipfad automatisch findet. Sie müssen folgende Variablen einstellen:
Fügen Sie
.jar
derCLASSPATH
Umgebungsvariablen die entsprechende Stanford NLP- Datei hinzu .stanford-ner-2015-04-20/stanford-ner.jar
stanford-postagger-full-2015-04-20/stanford-postagger.jar
stanford-parser-full-2015-04-20/stanford-parser.jar
und die Parser-Modell-JAR-Datei,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
Fügen Sie der
STANFORD_MODELS
Variablen das entsprechende Modellverzeichnis hinzu (dh das Verzeichnis, in dem Sie die vorab trainierten Modelle speichern können).stanford-ner-2015-04-20/classifiers/
stanford-postagger-full-2015-04-20/models/
Stellen Sie im Code sicher, dass nach dem
STANFORD_MODELS
Verzeichnis gesucht wird, bevor Sie den Modellnamen anhängen. Beachten Sie auch, dass die API automatisch versucht, die Betriebssystemumgebungen nach CLASSPATH zu durchsuchen )Beachten Sie, dass ab NLTK v3.1 die
STANFORD_JAR
Variablen veraltet sind und NICHT MEHR verwendet werden . Codefragmente in den folgenden Stackoverflow-Fragen funktionieren möglicherweise nicht:TL; DR für STEP 3 unter Ubuntu
( Für Windows : Anweisungen zum Festlegen von Umgebungsvariablen finden Sie unter https://stackoverflow.com/a/17176423/610569. )
Sie MÜSSEN die Variablen wie oben festlegen, bevor Sie Python starten, dann:
Alternativ können Sie versuchen, die Umgebungsvariablen in Python hinzuzufügen, wie in den vorherigen Antworten vorgeschlagen, aber Sie können den Parser / Tagger auch direkt anweisen, den direkten Pfad zu initialisieren, in dem Sie die gespeichert haben
.jar
Datei und Ihre Modelle gespeichert haben.Es ist NICHT erforderlich, die Umgebungsvariablen festzulegen, wenn Sie die folgende Methode verwenden, ABER wenn die API ihre Parameternamen ändert, müssen Sie sie entsprechend ändern. Aus diesem Grund ist es ratsamer, die Umgebungsvariablen festzulegen, als den Python-Code an die NLTK-Version anzupassen.
Zum Beispiel ( ohne Umgebungsvariablen festzulegen ):
quelle
Veraltete Antwort
Die unten stehende Antwort ist veraltet. Verwenden Sie die Lösung unter https://stackoverflow.com/a/51981566/610569 für NLTK v3.3 und höher.
Bearbeitet
Ab dem aktuellen Stanford-Parser (20.04.2015) hat sich die Standardausgabe für
lexparser.sh
geändert, sodass das folgende Skript nicht funktioniert.Aber diese Antwort wird aus Gründen des Vermächtnisses aufbewahrt, sie wird immer noch funktionieren http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip .
Ursprüngliche Antwort
Ich schlage vor, Sie spielen nicht mit Jython, JPype. Lassen Sie Python Python-Sachen machen und lassen Sie Java Java-Sachen machen, und holen Sie sich die Stanford Parser-Ausgabe über die Konsole.
Nachdem Sie den Stanford Parser in Ihrem Home-Verzeichnis installiert haben
~/
, verwenden Sie einfach dieses Python-Rezept, um die Analyse in flachen Klammern zu erhalten:quelle
len(i.strip()) > 0
ein Indexfehler aufgetreten ist. Ich denke, meine Parser-Ausgabe hatte mindestens eine Zeile, die nur aus Leerzeichen bestand.'
s enthält , werden einige seltsame Fehler angezeigt. Es gibt bessere Möglichkeiten , Dinge auf der Kommandozeile aufzurufenAb NLTK v3.3, Benutzer sollten vermeiden , die Stanford NER oder POS - Tagger aus
nltk.tag
und vermeiden Stanford tokenizer / segmenter ausnltk.tokenize
.Verwenden Sie stattdessen die neue
nltk.parse.corenlp.CoreNLPParser
API.Weitere Informationen finden Sie unter https://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTK
(Vermeiden Sie die Antwort nur mit Links. Ich habe die Dokumente aus dem NLTK-Github-Wiki unten eingefügt.)
Aktualisieren Sie zunächst Ihr NLTK
Laden Sie dann die erforderlichen CoreNLP-Pakete herunter:
Englisch
stanford-corenlp-full-2018-02-27
Starten Sie den Server noch im Verzeichnis:Dann in Python:
Chinesisch
Starten Sie den Server ein wenig anders, immer noch aus dem Verzeichnis `stanford-corenlp-full-2018-02-27:
In Python:
Arabisch
Starten Sie den Server:
In Python:
Französisch
Starten Sie den Server:
In Python:
Deutsche
Starten Sie den Server:
In Python:
Spanisch
Starten Sie den Server:
In Python:
quelle
list(parser.raw_parse(text))
oderlist(parser.parse(parser.tokenize(text))
. Das Beispiel wurde korrigiert;)Es gibt eine Python-Schnittstelle für Stanford Parser
http://projects.csail.mit.edu/spatial/Stanford_Parser
quelle
Die Stanford Core NLP-Softwareseite enthält eine Liste der Python-Wrapper:
http://nlp.stanford.edu/software/corenlp.shtml#Extensions
quelle
Wenn ich mich gut erinnere, ist der Stanford-Parser eine Java-Bibliothek, daher muss auf Ihrem Server / Computer ein Java-Interpreter ausgeführt werden.
Ich habe es einmal als Server benutzt, kombiniert mit einem PHP-Skript. Das Skript verwendete die exec () - Funktion von php, um einen Befehlszeilenaufruf an den Parser zu senden:
Ich erinnere mich nicht an alle Details dieses Befehls. Er öffnete im Grunde die Datei ToParse, analysierte sie und schrieb die Ausgabe in die Ergebnisdatei. PHP würde dann die Ergebnisdatei zur weiteren Verwendung öffnen.
Das Ende des Befehls leitet den ausführlichen Parser an NULL weiter, um zu verhindern, dass unnötige Befehlszeileninformationen das Skript stören.
Ich weiß nicht viel über Python, aber es gibt möglicherweise eine Möglichkeit, Befehlszeilenaufrufe zu tätigen.
Es ist vielleicht nicht die genaue Route, auf die Sie gehofft haben, aber hoffentlich gibt es Ihnen Inspiration. Viel Glück.
quelle
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Hier ist eine Anpassung des Codes von gefahr98, der mit nltk3.0.0 auf windoze und vermutlich auch auf den anderen Plattformen funktioniert. Passen Sie die Verzeichnisnamen entsprechend Ihrem Setup an:
Beachten Sie, dass sich der Parsing-Befehl geändert hat (siehe Quellcode unter www.nltk.org/_modules/nltk/parse/stanford.html) und dass Sie die Variable JAVAHOME definieren müssen. Ich habe versucht, die Grammatikdatei vor Ort im Glas zu lesen, habe dies aber bisher nicht getan.
quelle
Mit der Ausgabe von Stanford Parsers können Sie einen Baum in nltk (nltk.tree.Tree) erstellen.
Angenommen, der Stanford-Parser gibt Ihnen eine Datei, in der es für jeden Satz genau einen Analysebaum gibt. Dann funktioniert dieses Beispiel, obwohl es möglicherweise nicht sehr pythonisch aussieht:
quelle
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Da niemand wirklich erwähnt hat und es mich irgendwie sehr beunruhigt hat, gibt es hier eine alternative Möglichkeit, den Stanford-Parser in Python zu verwenden:
Auf diese Weise müssen Sie sich keine Sorgen mehr um den Pfad machen.
Für diejenigen, die es unter Ubuntu nicht richtig verwenden oder den Code in Eclipse ausführen können.
quelle
Ich bin auf einem Windows-Computer und Sie können den Parser einfach normal ausführen, wie Sie es über den Befehl tun, aber wie in einem anderen Verzeichnis, sodass Sie die Datei lexparser.bat nicht bearbeiten müssen. Geben Sie einfach den vollständigen Pfad ein.
Der schwierige Teil für mich war zu erkennen, wie man ein Java-Programm von einem anderen Pfad aus ausführt. Es muss einen besseren Weg geben, aber das funktioniert.
quelle
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Ein kleines Update (oder einfach eine Alternative) zu der umfassenden Antwort von gefahr89 zur Verwendung von Stanford Parser in NLTK und Python
Mit stanford-parser-full-2015-04-20, JRE 1.8 und nltk 3.0.4 (Python 2.7.6) müssen Sie die englische Datei PCFG.ser.gz anscheinend nicht mehr aus stanford-parser-xxx-Modellen extrahieren .jar oder Einrichten einer os.environ
quelle
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Hier ist die Windows-Version von Alvas 'Antwort
ANMERKUNGEN:
In müssen
lexparser.bat
Sie alle Pfade in absolute Pfade ändern, um Java-Fehler wie "Klasse nicht gefunden" zu vermeiden.Ich empfehle Ihnen dringend, diese Methode unter Windows anzuwenden, da ich mehrere Antworten auf der Seite ausprobiert habe und alle Methoden, mit denen Python mit Java kommuniziert, fehlschlagen.
Ich möchte von Ihnen hören, wenn Sie unter Windows erfolgreich sind, und Sie können mir sagen, wie Sie all diese Probleme überwinden.
Durchsuchen Sie den Python-Wrapper nach Stanford CoreNLP, um die Python-Version zu erhalten
quelle
Ich habe viele Stunden gebraucht und endlich eine einfache Lösung für Windows-Benutzer gefunden. Grundsätzlich ist es eine zusammengefasste Version einer vorhandenen Antwort von alvas, die jedoch (hoffentlich) für diejenigen, die neu in Stanford NLP sind und Windows-Benutzer sind, leicht zu befolgen ist.
1) Laden Sie das Modul herunter, das Sie verwenden möchten, z. B. NER, POS usw. In meinem Fall wollte ich NER verwenden, also habe ich das Modul von http://nlp.stanford.edu/software/stanford-ner-2015- heruntergeladen. 04-20.zip
2) Entpacken Sie die Datei.
3) Legen Sie die Umgebungsvariablen (classpath und stanford_modules) aus dem entpackten Ordner fest.
4) Stellen Sie die Umgebungsvariablen für JAVA so ein, wie Sie JAVA installiert haben. für mich war es unten
5) Importieren Sie das gewünschte Modul
6) Rufen Sie das vorab trainierte Modell auf, das sich im Klassifikatorordner im entpackten Ordner befindet. Fügen Sie am Ende ".gz" für die Dateierweiterung hinzu. Für mich war das Modell, das ich verwenden wollte
english.all.3class.distsim.crf.ser
7) Führen Sie nun den Parser aus !! und wir sind fertig !!
quelle
Veraltete Antwort
Die unten stehende Antwort ist veraltet. Verwenden Sie die Lösung unter https://stackoverflow.com/a/51981566/610569 für NLTK v3.3 und höher.
BEARBEITET
Hinweis: Die folgende Antwort funktioniert nur bei:
Da sich beide Tools ziemlich schnell ändern und die API 3-6 Monate später möglicherweise sehr unterschiedlich aussieht. Bitte behandeln Sie die folgende Antwort als zeitlich und nicht als ewige Lösung.
Die neuesten Anweisungen zur Schnittstelle von Stanford NLP-Tools mit NLTK finden Sie immer unter https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software.
TL; DR
Der folgende Code stammt von https://github.com/nltk/nltk/pull/1735#issuecomment-306091826
Im Terminal:
In Python:
Weitere Informationen zur Stanford-API finden Sie unter http://www.nltk.org/_modules/nltk/parse/corenlp.html . Schauen Sie sich die Docstrings an!
quelle
Beachten Sie, dass diese Antwort für NLTK v 3.0 und nicht für neuere Versionen gilt.
Ich kann dies aufgrund des guten Rufs nicht als Kommentar hinterlassen, aber da ich einige Zeit damit verbracht habe, dies zu lösen, möchte ich lieber mein Problem / meine Lösung teilen, damit dieser Parser in NLTK funktioniert.
In der ausgezeichneten Antwort von alvas wird erwähnt, dass:
Dies führte mich fälschlicherweise zu:
STANFORD_MODELS
(und kümmere dich nur um meinenCLASSPATH
)../path/tostanford-parser-full-2015-2012-09/models directory
* praktisch leer * (oder mit einer JAR-Datei, deren Name nicht mit nltk regex übereinstimmt)!Wenn das OP, wie ich, nur den Parser verwenden wollte, kann es verwirrend sein, dass beim Herunterladen von nichts anderem (kein POStagger, kein NER, ...) und Befolgen all dieser Anweisungen immer noch eine Fehlermeldung angezeigt wird.
Letztendlich
CLASSPATH
würde ich für jeden Fall (folgende Beispiele und Erklärungen in den Antworten aus diesem Thread) immer noch den Fehler erhalten:Siehe: http://nlp.stanford.edu/software/lex-parser.shtml
ODER:
Obwohl , was wichtig ist, konnte ich richtig laden und verwenden Sie den Parser , wenn ich die Funktion mit allen Argumenten und Pfad vollständig spezifiziert, wie in genannt:
Lösung nur für Parser:
Daher kam der Fehler von
NLTK
und wie es nach Jars sucht, die die bereitgestelltenSTANFORD_MODELS
undCLASSPATH
Umgebungsvariablen verwenden. Um dies zu lösen, muss sich das*-models.jar
mit der richtigen Formatierung (um demNLTK
regulären Ausdruck im Code zu entsprechen, also kein -corenlp -.... jar) in dem durch bezeichneten Ordner befindenSTANFORD_MODELS
.Ich habe nämlich zuerst erstellt:
Dann hinzugefügt in
.bashrc
:Und schließlich durch Kopieren
stanford-parser-3.6.0-models.jar
(oder entsprechende Version) in:Ich könnte
StanfordParser
mit dem KlassikerCLASSPATH
, der darauf hinweist, reibungslos in Python ladenstanford-parser.jar
. Als solches können SieStanfordParser
ohne Parameter aufrufen , die Standardeinstellung funktioniert nur.quelle
Ich benutze nltk Version 3.2.4. Und der folgende Code hat bei mir funktioniert.
Ausgabe:
quelle
Eine neue Entwicklung des Stanford-Parsers, der auf einem neuronalen Modell basiert und mit Tensorflow trainiert wurde, wurde kürzlich zur Verwendung als Python-API zur Verfügung gestellt. Dieses Modell soll weitaus genauer sein als das Java-basierte Moel. Sie können sich sicher in eine NLTK-Pipeline integrieren.
Link zum Parser. Das Repository enthält vorab trainierte Parser-Modelle für 53 Sprachen.
quelle