2016-01-23 3 views
5

Ich bin mit der Stanford-Parser mit nltk in Python und bekam Hilfe von Stanford Parser and NLTK Stanford nlp Bibliotheken einzurichten.Warum analysiert der Stanford-Parser mit nltk einen Satz nicht richtig?

from nltk.parse.stanford import StanfordParser 
from nltk.parse.stanford import StanfordDependencyParser 
parser  = StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") 
dep_parser = StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") 
one = ("John sees Bill") 
parsed_Sentence = parser.raw_parse(one) 
# GUI 
for line in parsed_Sentence: 
     print line 
     line.draw() 

parsed_Sentence = [parse.tree() for parse in dep_parser.raw_parse(one)] 
print parsed_Sentence 

# GUI 
for line in parsed_Sentence: 
     print line 
     line.draw() 

Ich erhalte falsche Parse und Abhängigkeitsbäume wie im Beispiel unten gezeigt, es ist die Behandlung ‚sieht‘ als statt Verb Substantiv.

Example parse tree Example dependency tree

Was soll ich tun? Es funktioniert perfekt, wenn ich zum Beispiel Satz ändern (ein = 'John siehe Bill'). Die richtige ouput für diesen Satz kann hier eingesehen werden correct ouput of parse tree

Beispiel für eine korrekte Ausgabe wird auch weiter unten:

correctly parsed

correct dependency parsed tree

+0

Bitte veröffentlicht den vollständigen Code-Schnipsel, so dass andere verstehen, wo 'dep_parser' aus = kommt) – alvas

Antwort

6

Wieder kein Modell perfekt ist (siehe Python NLTK pos_tag not returning the correct part-of-speech tag); P

Sie können versuchen, einen "genaueren" Parser, die NeuralDependencyParser verwenden.

Erste Einstellungen der Parser richtig mit den richtigen Umgebungsvariablen (siehe Stanford Parser and NLTK und https://gist.github.com/alvations/e1df0ba227e542955a8a), dann gilt:

>>> from nltk.internals import find_jars_within_path 
>>> from nltk.parse.stanford import StanfordNeuralDependencyParser 
>>> parser = StanfordNeuralDependencyParser(model_path="edu/stanford/nlp/models/parser/nndep/english_UD.gz") 
>>> stanford_dir = parser._classpath[0].rpartition('/')[0] 
>>> slf4j_jar = stanford_dir + '/slf4j-api.jar' 
>>> parser._classpath = list(parser._classpath) + [slf4j_jar] 
>>> parser.java_options = '-mx5000m' 
>>> sent = "John sees Bill" 
>>> [parse.tree() for parse in parser.raw_parse(sent)] 
[Tree('sees', ['John', 'Bill'])] 

Sie beachten, dass die NeuralDependencyParser nur die Abhängigkeitsbäume produziert:

enter image description here

+0

I Modell„englishPCFG.ser.gz“verwende und Sie verwenden Modell„e nglish_UD.gz ". Aber wie können wir diese Modelle wählen, damit wir die richtige auswählen können? –

+0

Es gibt kein perfektes Modell, gibt es kein richtig/falsch ein auch nur derjenige, der am besten zu Ihren Daten passt. Also würde ich sagen, probiere alle aus und bewerte sie dann basierend auf dem ultimativen Zweck der Parser. – alvas

+0

Wirklich danke, .... Ich habe einen Fehler, bitte helfen Sie mir dabei: –