2014-08-31 18 views
8

Witam Próbuję się nauczyć NLTK. Jestem również nowy w Pythonie. Próbuję następujące.NLTK 3 POS_TAG wyrzuca UnicodeDecodeError

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

otrzymuję następujący komunikat o błędzie

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)

Pobrałem wszystkie dostępne modele (w tym maxent_treebank_pos_tagger)

Domyślne kodowanie System jest UTF-8

>>sys.getdefaultencoding() 

Otworzyłem plik data.py i jest to zawartość dostępna.

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 

Co ja tu robię źle?

Odpowiedz

15

OK, znalazłem rozwiązanie. Wygląda na problem w samym źródle. Check here

Otworzyłem data.py i modyfikowane linii 779 jak poniżej

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

-1 Twarde kodowanie przestarzałego kodowania legacy nie jest dobrym pomysłem. – tripleee

+1

Jakieś inne rozwiązanie, które możesz podać? –

+0

@tripleee coś jest lepsze niż nic! –

2

Podstawowym problemem jest to, że NLTK 2.x nie jest obsługiwana dla Pythona 3 i NLTK 3 jest w toku starań, aby wypuść wersję w pełni zgodną z Pythonem 3.

Najprostszym rozwiązaniem jest pobranie najnowszej wersji NLTK 3.x i użycie jej zamiast tego.

Jeśli chcesz wziąć udział w zakończeniu portu do Pythona 3, prawdopodobnie potrzebujesz głębszego zrozumienia wartości differences between Python 2 and Python 3; w szczególności, w tym przypadku, jak fundamentalna typ string w Pythonie 3 jest ciągiem znaków Unicode (u'...'), a nie ciąg bajtów (Python 3 b'...') jak w Pythonie 2. Patrz również http://nedbatchelder.com/text/unipain.html

FWIW patrz również https://github.com/nltk/nltk/issues/169#issuecomment-12778108 dla poprawka identyczna jak twoja. Błąd, z którym się łączyłeś, został już naprawiony w NLTK 3.0 (prawdopodobnie przez poprawkę do rzeczywistych plików danych, myślę, że w 3.0a3).

0

Używanie Pythona 3.4 i NLTK 3 można rozwiązać ten problem wykonując:

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

Zauważ, że tryb, aby otworzyć to rb i encoding='uft-8'. To rozwiązanie nie wymaga edycji data.py.

0

Próbowałem wszystkie odpowiedzi, ale nic nie działało, więc po 2 następujących linków, a następnie

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

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

  • pobrać plik maxent_treebank_pos_tagger.zip.
  • rozpiął go i skopiowany plik english.pickle i zastąpiły english.pickle pliki już obecny w moim folderze nltk_data tagów -> C: \ nltk_data \ taggers \ maxent_treebank_pos_tagger z nowym.
  • Wymieniłem także ten w folderze C: \ nltk_data \ taggers \ maxent_treebank_pos_tagger \ PY3 z nowym.

PS: Nie wiem, co jeszcze może być dotknięte, ale na razie wszystko jest w porządku.

+0

Jeśli mógłbyś podać więcej informacji na temat podanych linków (takich jak niektóre wyszukiwane hasła), poprawiłoby to twoją odpowiedź na wypadek, gdyby linki były edytowane/usuwane. – ryanyuyu

2

Wracam do tak późno, ale w przypadku pomaga kogoś, kto natknie to, co pracował dla mnie było rozszyfrować tekst przed oddaniem go do word_tokenize, tj:

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

Może Będę pracował dla kogoś innego!

Powiązane problemy