2013-09-06 10 views
77

Sto utilizzando NLTK per eseguire cluster di chilometrientamento sul mio file di testo in cui ogni riga è considerata un documento. Così, per esempio, il mio file di testo è qualcosa di simile:UnicodeDecodeError: il codec 'ascii' non è in grado di decodificare il byte 0xe2 in posizione 13: ordinale non compreso nell'intervallo (128)

appartengono pugno morte dito
affrettate
mike pareti affrettate Gerico
regole Jägermeister
regole bande seguire l'esecuzione di fase Jägermeister
approccio

Ora la codice demo che sto cercando di eseguire è questo: https://gist.github.com/xim/1279283

L'errore che ricevo è questo:

Traceback (most recent call last): 
File "cluster_example.py", line 40, in 
words = get_words(job_titles) 
File "cluster_example.py", line 20, in get_words 
words.add(normalize_word(word)) 
File "", line 1, in 
File "/usr/local/lib/python2.7/dist-packages/nltk/decorators.py", line 183, in memoize 
result = func(*args) 
File "cluster_example.py", line 14, in normalize_word 
return stemmer_func(word.lower()) 
File "/usr/local/lib/python2.7/dist-packages/nltk/stem/snowball.py", line 694, in stem 
word = (word.replace(u"\u2019", u"\x27") 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 13: ordinal not in range(128) 

Che cosa sta succedendo qui?

risposta

89

Il file viene letto come un gruppo di str s, ma dovrebbe essere unicode s. Python prova a convertire implicitamente, ma fallisce. Cambio:

job_titles = [line.strip() for line in title_file.readlines()] 

decodificare esplicitamente i str s per unicode (qui supponendo UTF-8):

job_titles = [line.decode('utf-8').strip() for line in title_file.readlines()] 

Potrebbe anche essere risolto importando the codecs module e utilizzando codecs.open anziché incorporato open .

+1

esegue questo line.decode ('utf-8'). Strip(). Lower(). Split() mi dà anche lo stesso errore. Ho aggiunto il .deocode ('utf-8') –

15

Si può provare anche questo:

import sys 
reload(sys) 
sys.setdefaultencoding('utf8') 
+0

Quali sono le implicazioni di questo? Sembra che sia qualcosa di globale e non solo applicabile a questo file. – simeg

+1

Si noti che quanto sopra è deprecato in Python 3. – gented

1

Si può provare questo prima di utilizzare job_titles stringa:

source = unicode(job_titles, 'utf-8') 
0

Per me non era un problema con la codifica terminale. L'aggiunta di UTF-8 per .bashrc risolto il problema:

export LC_CTYPE=en_US.UTF-8 

Non dimenticare di ricaricare .bashrc seguito:

source ~/.bashrc 
1

Questo funziona bene per me.

f = open(file_path, 'r+', encoding="utf-8") 

è possibile aggiungere un terzo parametro codifica per garantire tipo di codifica è 'UTF-8'

Nota: questo metodo funziona trovano in python3, non provare a Python2.7.

Problemi correlati