2017-10-09 5 views
0

J'essaie de construire un modèle RNN qui classe une revue à un sentiment positif ou négatif.Imdb erreur d'encodage de la critique

Il existe un dictionnaire de vocabulaire, et en prétraitement, je fais une revue dans une séquence d'index.
Par exemple,

"This movie was best" --> [2,5,10,3]

Lorsque je tente d'obtenir Vocabs fréquentes et voir son contenu, j'ai eu cette erreur:

num of reviews 100 
number of unique tokens : 4761 
Traceback (most recent call last): 
    File "preprocess.py", line 47, in <module> 
    print(vocab) 
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 10561: ordinal not in range(128) 
code

est comme ci-dessous:

from bs4 import BeautifulSoup 
reviews = [] 
for item in os.listdir('imdbdata/train/pos')[:100]: 
    with open("imdbdata/train/pos/"+item,'r',encoding='utf-8') as f: 
     sample = BeautifulSoup(f.read()).get_text() 
    sample = word_tokenize(sample.lower()) 
    reviews.append(sample) 
print("num of reviews", len(reviews)) 
word_freq = nltk.FreqDist(itertools.chain(*reviews)) 
print("number of unique tokens : %d"%(len(word_freq.items()))) 
vocab = word_freq.most_common(vocab_size-1) 
index_to_word = [x[0] for x in vocab] 
index_to_word.append(unknown_token) 
word_to_index = dict((w,i) for i,w in enumerate(index_to_word)) 
print(vocab) 

La question est, comment puis-je sortir ce UnicodeEncodeError lorsqu'il s'agit de problème PNL avec Python? Surtout lorsque vous obtenez du texte en utilisant la fonction open.

Répondre

1

Il semble que votre terminal soit configuré pour ASCII. Comme le caractère '\xe9' est en dehors de la plage de caractères ASCII (0x00-0x7F), il ne peut pas être imprimé sur un terminal ASCII. Il ne peut pas non être codé en ASCII:

>>> s = '\xe9' 
>>> s.encode('ascii') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 0: ordinal not in range(128) 

Vous pouvez contourner ce en codant explicitement la chaîne à l'impression et la gestion des erreurs de codage en remplaçant les caractères non pris en charge par ?:

>>> print(s.encode('ascii', errors='replace')) 
b'?' 

Les regards de caractère comme c'est l'encodage ISO-8859-1 pour une petite lettre e avec aigu (é).

Vous pouvez vérifier le codage utilisé pour stdout. Dans mon cas, il est UTF-8, et je n'ai pas de problème d'impression ce caractère:

>>> import sys 
>>> sys.stdout.encoding 
'UTF-8' 
>>> print('\xe9') 
é 

Vous pourriez être en mesure de forcer Python en utilisant un encodage par défaut différent; il y a une discussion here, mais le meilleur moyen serait d'utiliser un terminal qui supporte UTF-8.

+0

C'est la réponse que je cherchais! Je vous remercie. –