2014-08-31 4 views
8

Hi Ich versuche NLTK zu lernen. Ich bin auch neu in Python. Ich versuche Folgendes.NLTK 3 POS_TAG wirft UnicodeDecodeError

>>import nltk 
>>nltk.pos_tag(nltk.word_tokenize("John lived in China")) 

bekomme ich folgende Fehlermeldung

Traceback (most recent call last): File "", line 1, in nltk.pos_tag(nltk.word_tokenize("John lived in California")) File "C:\Python34\lib\site-packages\nltk\tag__init__.py", line 100, in pos_tag tagger = load(_POS_TAGGER) File "C:\Python34\lib\site-packages\nltk\data.py", line 779, in load resource_val = pickle.load(opened_resource) UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0: ordinal not in range(128)

ich alle Modelle verfügbar heruntergeladen haben (einschließlich der maxent_treebank_pos_tagger)

Die Standardsystemcodierung ist UTF-8

>>sys.getdefaultencoding() 

Ich habe die Datei data.py geöffnet und das ist der verfügbare Inhalt.

774# Load the resource. 
775 opened_resource = _open(resource_url) 
776if format == 'raw': 
777   resource_val = opened_resource.read() 
778  elif format == 'pickle': 
779   resource_val = pickle.load(opened_resource) 
780  elif format == 'json': 
781   import json 

Was mache ich hier falsch?

Antwort

15

OK, ich habe die Lösung gefunden. Sieht aus wie ein Problem in der Quelle selbst. Check here

öffnete ich bis data.py und modifizierte Linie 779, wie unten

resource_val = pickle.load(opened_resource) #old 
resource_val = pickle.load(opened_resource, encoding='iso-8859-1') #new 
+2

-1 Hard-Codierung eine veraltete Legacy-Codierung ist kaum der Weg zu gehen. – tripleee

+1

Jede andere Lösung, die Sie anbieten können? –

+0

@tripleee etwas ist besser als nichts! –

2

Das grundlegende Problem ist, dass NLTK 2.x nicht für Python 3 unterstützt wird, und NLTK 3 ist ein laufender Aufwand Release eine vollständige Python 3-kompatible Version.

Die einfache Problemumgehung besteht darin, die neuste NLTK 3.x herunterzuladen und stattdessen zu verwenden.

Wenn Sie an der Fertigstellung des Ports zu Python 3 teilnehmen möchten, benötigen Sie wahrscheinlich ein tieferes Verständnis der differences between Python 2 and Python 3; Insbesondere für diesen Fall, wie der grundlegende String-Typ in Python 3 ist eine Unicode-Zeichenfolge (u'...'), kein Byte-String (Python 3 b'...') wie in Python 2. Siehe auch http://nedbatchelder.com/text/unipain.html

FWIW, siehe auch https://github.com/nltk/nltk/issues/169#issuecomment-12778108 für ein Fix, der mit deinem identisch ist. Der Fehler, mit dem Sie verlinkt haben, wurde bereits in NLTK 3.0 behoben (vermutlich durch eine Korrektur der eigentlichen Dateien, ich denke in 3.0a3).

0

Verwendung von Python 3.4 und NLTK 3 Sie können dieses Problem beheben, indem Sie:

f = open('myClassifier_or_X_trained_model',mode='rb') 
whereIuseTheModel = pickle.load(f,encoding='UTF-8') 

Beachten Sie, dass der Modus rb und encoding='uft-8' ist zu öffnen. Für diese Lösung muss data.py nicht bearbeitet werden.

0

Ich habe versucht, alle Antworten, aber nichts funktionierte, gefolgt so die folgenden zwei Links und dann

https://github.com/nltk/nltk/issues/169

https://github.com/nltk/nltk_data/tree/gh-pages/packages/taggers

  • die maxent_treebank_pos_tagger.zip Datei heruntergeladen haben.
  • es entpackt und kopiert die english.pickle Datei und ersetzt die english.pickle Dateien bereits in meiner nltk_data Tags Ordner -> C: \ nltk_data \ Tagger \ maxent_treebank_pos_tagger mit dem neuen.
  • Ich ersetzte auch die im Ordner C: \ nltk_data \ taggers \ maxent_treebank_pos_tagger \ PY3 mit dem neuen.

PS: Ich weiß nicht, was sonst noch betroffen sein könnte, aber jetzt bin ich in Ordnung.

+0

Wenn Sie weitere Informationen über die von Ihnen bereitgestellten Links (wie einige Suchbegriffe) bereitstellen könnten, würde dies Ihre Antwort robuster machen, falls die Links bearbeitet/gelöscht werden. – ryanyuyu

2

Ich bin spät dazu kommt, aber im Falle hilft es jemanden, über das kommt, was für mich gearbeitet wurde, den Text zu entschlüsseln, bevor es in word_tokenize setzen, das heißt:

raw_text = "John lived in China" 
to_tokenize = raw_text.decode('utf-8') 
tokenized = nltk.word_tokenize(to_tokenize) 
output = nltk.pos_tag(tokenized) 

Vielleicht werde für jemand anderen arbeiten!