2017-10-09 17 views
0

レビューを肯定的または否定的な感情に分類するRNNモデルを構築しようとしています。Imdbレビューのエンコーディングエラー

辞書のボキャブもあり、前処理でインデックスのシーケンスを確認します。私は頻繁にvocabsを取得し、その内容を確認しようとすると
は例えば、

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

は、私はこのエラーを得た:

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) 

コードを以下のようなものです:

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) 

質問どうすればこの問題を回避することができますか?UnicodeEncodeError PythonでNLP問題を扱うときは?特に、open機能を使用してテキストを取得する場合。

答えて

1

端末がASCII用に設定されているようです。文字'\xe9'はASCII文字(0x00-0x7F)の範囲外であるため、ASCII端末には印刷できません。また、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) 

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

文字ルックスacute(é)の小さな文字eのISO-8859-1エンコードのようです。

stdoutに使用されているエンコードを確認できます。私のケースでは、UTF-8だ、と私はその文字を印刷する問題がない:

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

あなたは別のデフォルトエンコーディングを使用してへのPythonを強制することができるかもしれません。議論hereがありますが、UTF-8をサポートする端末を使用するのが最善の方法です。

+0

これは私が探していた非常に答えです!ありがとうございました。 –

関連する問題