2013-09-06 11 views
77

NLTKを使用して、各行がドキュメントと見なされるテキストファイルでクラスタリングを実行しています。したがって、たとえば、私のテキストファイルは次のようなものです:指死パンチ属しUnicodeDecodeError: 'ascii'コーデックは、位置13のバイト0xe2をデコードできません。序数が範囲外です。(128)


性急
マイク性急な壁が
イエーガーマイスターのルールをエリコ
バンドは今イエーガーマイスターの段階を実行する
アプローチ

に従うルール私が実行しようとしているデモコードは次のとおりです:https://gist.github.com/xim/1279283

私が受け取るエラーは次のとおりです:

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) 

ここで何が起こっているか

答えて

89

ファイルはstrの束として読み取られていますが、unicodeである必要があります。 Pythonは暗黙的に変換しようとしますが、失敗します。変更:

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

は、明示的にunicodestr Sを復号化する(ここでは仮定UTF-8):

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

またopenビルトインではなくthe codecs moduleをインポートし、codecs.openを使用することによって解決することができ。

+1

この行のコードを実行していると( 'utf-8')。strip()。lower()。split()も同じエラーです。 .deocode( 'utf-8')を追加しました –

15

また、これを試すことができます。

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

これはどういう意味ですか?グローバルなもので、このファイルに適用できるだけではないようです。 – simeg

+1

上記はPython 3では推奨されていません。 – gented

1

あなたはjob_titles文字列を使用する前にこれを試すことができます。

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

は、私にとっては、端末のエンコードに問題がありました。 .bashrcにUTF-8を追加して、問題を解決:

export LC_CTYPE=en_US.UTF-8 

はその後.bashrcにリロードすることを忘れないでください:

source ~/.bashrc 
1

これは私のために正常に動作します。

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

あなたはエンコーディングタイプが「UTF-8」

注意であることを確認するために第三のパラメータエンコーディングを追加することができます。このメソッドの作品はのpython3で見つける、私はPython2.7でそれをしようとしないでください。

関連する問題