2017-08-22 1 views
0

Ich habe ein Problem mit Python Stanford Nlp, Satz Parsing und schreibe es in der Datei. Problem: Ich habe .txt-Datei mit wenigen Sätzen und mit for-Schleife Ich möchte alle Sätze analysieren. Problem ist, dass das StanfordCoreNlp-Parsing nur für den ersten Satz und nicht für alle funktioniert. Es hört einfach auf zu analysieren und zu schreiben.StanfordNlp Parser stoppt beim ersten Satz

Beispiel: Datei (sets2.txt): Der stille, kühle Nebel des Januarmorgens verschleierte eine ferne Sonne. Unten in der Ecke, wo in der kalten Winterzeit Schneeglöckchen aufblühten, plauderten vier Kinder aufgeregt. Sie waren unachtsam von der Kälte, ungeeignet für das eisige Wetter. Sie kicherten in Verschwörung und plötzlich platzte ihre Gruppe in spielerischer Überschwänglichkeit auseinander. Drei liefen in verschiedene Richtungen. Es gab viele Verstecke, denn das Gebiet war übersät mit Bäumen, Sträuchern und Steinen.

Code:

from stanfordcorenlp import StanfordCoreNLP 

nlp = StanfordCoreNLP(r"C:\Users\user\Downloads\stanford-corenlp-full-2017-06-09\stanford-corenlp-full-2017-06-09") 

test_sent = open("C:/Users/user/Desktop/Test sentences2.txt", "r", 
        encoding="iso-8859-1") 

output = open("C:/Users/user/Desktop/Output2.txt", "a", encoding="utf-8") 
lines = test_sent.readlines() 

for line in lines: 
    output.write(nlp.parse(line)) 

test_sent2.close() 
output2.close() 

Datei (output2.txt):

(ROOT 
    (S 
    (NP 
     (NP (DT The) (RB still)) 
     (, ,) 
     (NP 
     (NP (NN chill) (NN mist)) 
     (PP (IN of) 
      (NP (DT the) (NNP January) (NN morning))))) 
    (VP (VBD veiled) 
     (NP (DT a) (JJ remote) (NN sun))) 
    (. .))) 

Antwort

0

Wenn der Dateiinhalt ist genau so, wie Sie auf dem Laufenden, haben Sie keine neuen Zeilenumbrüche in es , also gibt die readlines() nur eine Zeile zurück, die alle Sätze enthält. parse() stoppt beim ersten Satz, also fütterst du alle Sätze auf einmal, aber es analysiert nur den ersten Satz.

zwei Optionen:

Option 1: Befestigen Sie die Datei

Zeile einfügen nach jedem Satz bricht, sollte, dass Ihr Problem lösen.

Option 2:

Statt parse() Aufruf der Verwendung von annotate() den Code ändern:

lines = test_sent.read() 

output.write(nlp.annotate(line)) 

Sie können Ihre Annotatoren, Sprache und Ausgabeformat, indem ein Eigenschaften Parameter wählen, wie here erläutert. Es wird auch empfohlen, den zugewiesenen Speicher auf StanfordCoreNLP zu erhöhen:

nlp = StanfordCoreNLP(r'path_to_corenlp', memory='8g') 
+0

Danke Yigal! Dies ist hilfreich. Jetzt weiß ich, wie man Eigenschaftenparameter benutzt. Problem mit Anmerkungen ist, dass es keine Ausgabe im Format wie im Beispiel (output2.txt) schreibt. Es wurden verschiedene Eigenschaften versucht, aber das Ergebnis unterscheidet sich vom Original. Vielleicht kennen Sie die richtige Kombination von Parametern? –

+0

Haben Sie versucht, _parse_ zu fragen und Ausgabe in _text_ zu schreiben? Zum Beispiel 'requisiten = {'annotators': 'parse', 'pipelineLanguage': 'en', 'outputFormat': 'text'}' – Yigal

+0

Ich habe versucht, aber es wirft nur wenige Fehler auf –

Verwandte Themen