2016-04-27 13 views
0

Der Code einfach ist, wieIOError beim Laden NLTK perceptron Tagger

import nltk 
nltk.data.path.append(r"E:\nltk_data") 
nltk.pos_tag(["hello"]) 

folgt und der Fehler wird

File "C:\Program Files (x86)\IronPython 
2.7\lib\site-packages\nltk\tag\__init__.py", line 110, in pos_tag 
    tagger = PerceptronTagger() File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\nltk\tag\perceptron.py", line 141, in __init__ 
    self.load(AP_MODEL_LOC) File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\nltk\tag\perceptron.py", line 209, in load 
    self.model.weights, self.tagdict, self.classes = load(loc) File "C:\Program Files (x86)\IronPython 
2.7\lib\site-packages\nltk\data.py", line 800, in load 
    # Load the resource. File "C:\Program Files (x86)\IronPython 2.7\lib\site-packages\nltk\data.py", line 921, in _open 
    # urllib might not use mode='rb', so handle this one ourselves: File "C:\Program Files (x86)\IronPython 
2.7\lib\site-packages\nltk\data.py", line 603, in find 
    if zipfile is None: File "C:\Program Files (x86)\IronPython 2.7\Lib\nturl2path.py", line 26, in url2pathname 
    raise IOError, error IOError: Bad URL: /C|/E|/nltk_data/taggers/averaged_perceptron_tagger/averaged_perceptron_tagger.pickle 

Wie kommt die URL wird /C|/E|/nltk_data/tagg... und warum braucht es url2pathname im ersten anrufen Ort? Ich bin bereits auf Windows und die URL, die ich zur Verfügung stelle, ist eine Windows-Stil-URL.

Antwort

1

Ich musste in den Code eingraben und fand schließlich das Problem. Nltk bestimmt das Betriebssystem mit if sys.platform.startswith('win'): (Extrem professionelle Weise zu bestimmen, übrigens)

Wenn Sie jedoch IronPython verwenden, ist Ihre Plattform CLI.

Ich vermute, das verursacht viele Probleme für IronPython-Benutzer. Wenn also ein Python-Paket das nächste Mal wie ein Unix-Gegenstück agiert, dann überprüfen Sie einfach die Module auf diesen Code.

Bearbeiten: Meine Lösung ist es, den Prüfcode durch sys.platform.startswith('win') or sys.platform.startswith('cli') zu ersetzen.

+0

Ich bin mir nicht sicher, ob 'NLTK' IronPython unterstützt, ich kenne Fälle, in denen es sogar mit PyPy bricht. Auf der Installationsseite ist bekannt, dass 'NLTK' Python (insbesondere CPython) unter Windows (32bit) und Mac/Unix unterstützt,' NLTK benötigt Python-Versionen 2.7 oder 3.2 + 'http://www.nltk.org/install. html =) – alvas

+0

Beachten Sie, dass IronPython, obwohl das Python innerhalb des Namens ist, nicht de facto Python (dh 'CPython') ist, wie normalerweise bezeichnet. – alvas

+0

@alvas Ab diesem Moment migrierten wir unsere Python-Anwendung vollständig auf IronPython und alles wurde getestet. Meine Schlussfolgerung ist, dass NLTK vollständig kompatibel mit IronPython ist. (Natürlich gibt es andere Module, die wir nicht benutzt oder testet. Aber die Anwendung verwendet fast die Mehrheit der Module in NLTK) – ozgur

0

Ihr Code entweicht ein \n:

ersetzen \ mit \\:

import nltk 
nltk.data.path.append(r"E:\\nltk_data") 
nltk.pos_tag(["hello"]) 

Sie auf diese Frage beziehen: What exactly do "u" and "r" string flags do in Python, and what are raw string literals?

Weitere Informationen darüber, wie rohe Strings Literale funktioniert.

+0

Jetzt versuchte es. Immer noch der gleiche Fehler. – ozgur

+0

Ich habe es versucht ["E: \\ nltk_data"], ["E: \\ nltk_data"], [r "E: \ nltk_data"], [ur "E: \ nltk_data"], [u "E: \\ nltk_data "] und [u" E: \ nltk_data "]. Alle von ihnen gibt mir den gleichen Fehler. deshalb denke ich, dass es nicht um den Weg geht. – ozgur