2012年5月3日木曜日

windows環境で言語処理100本ノックをやってみる。

◆はじめに
言語処理100本ノックが面白そうなので、やろうとしてみた。
→ 1ヶ月前にデータ準備の段階で挫折。
なんとかこの山を超え、とりあえずは元となるデータを準備できました。

◆前提
pythonは導入済みであること。
だいぶ前にいれましたので、バージョンはPython 2.5.2でした。
それからCygwin入ってるとunixコマンド使えるんで答え合わせで捗ります。

◆準備
日本郵便の郵便番号データの全データ(KEN_ALL.CSV)をダウンロードしてくる。
http://www.post.japanpost.jp/zipcode/dl/readme.html

下記サイトで取得できるソースをエディタにコピペし、UTF-8で保存。
https://github.com/chokkan/nlp100/blob/master/prepare/address.py

郵便番号全データ及び、取得ソースを下記コマンドで、実行。
stdinに「KEN_ALL.CSV」を、そのアウトプットに「address.txt」を指定しました。
※はじめ単純に実行時パラメータとしてCSVを渡すも反応せずの状況で30分経過 orz

python address_utf8.py < KEN_ALL.CSV > address.txt

って、、、エラー発生。
【エラー内容】
Traceback (most recent call last):
File "address_utf8.py", line 7, in
s1 = unicode(''.join((row[6], row[7])))
UnicodeDecodeError: 'ascii' codec can't decode byte 0x96 in position 0: ordinal
not in range(128)

あーだこーだ悩みましたが、unicodeメソッドで読み込みファイルの文字コードを指定しないとだめっぽい。
っというわけで7,8行目、19行目のソース修正。

【修正前】
s1 = unicode(''.join((row[6], row[7])))
s2 = unicode(row[8])
・・・
print '\t'.join((s1, s2))

【修正後】
s1 = unicode(''.join((row[6], row[7])),'shift-jis')
s2 = unicode(row[8],'shift-jis')
・・・
print '\t'.join((s1, s2)).encode('shift-jis')

もう一回コマンド実施して、無事に作成されました。(∩´∀`)∩

python address_utf8.py < KEN_ALL.CSV > address.txt

とりあえずこれで1~10まで実施できる。
今日はおしまい。

【参考サイト】

[Python]Pythonと日本語表示と文字コード、unicode 、str 、utf-8 、shift-jis 、、
http://d.hatena.ne.jp/Cassiopeia/20070602/1180805345

日本語環境でのPython (for Python 2.3 or later)
http://www.python.jp/Zope/articles/japanese/Python4Japanese-2

UnicodeDecodeError/UnicodeEncodeErrorに悩まないPython 2.x プログラミング
http://d.hatena.ne.jp/atsuoishimoto/20110311/1299805971


0 件のコメント:

コメントを投稿