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


2012年5月1日火曜日

db2のexplainが取得できない・・・。


db2の試用版Express-Cの9.7を主にExplainをしたいがために自宅PCにインストール。
インスタンスオーナ、常用ドメインユーザでExplainしようにもエラーばっかり。
とにかく常用ドメインユーザでExplainしてみたかったんです。
あきらめてから、気がついたら1年経過してました。
ちくしょー!

今回それをなんとか解消したので経緯などを。

【事前情報】

OS:windowsXP
ユーザ:インスタンスオーナ、常用windowsドメインユーザの2種類

【DB構成方法】

サンプルDB作成後、テスト用スキーマを生成。
インスタンスオーナ名のスキーマで、Explain.DDLを実行。
テスト用スキーマでも、Explain.DDLを実行。
常用windowsドメインユーザにDB2ADM権限を付与。

【実施したコマンド】

db2 connect to sample
db2 set current schema testschema
db2 set current explain mode explain
db2 -tf selectForExplain.sql
db2 set current explain mode no
db2exfmt -d sample -e testschema -g -# 0 -n %% -s %% -w -1 -o explainResult.log

【症状】

(1)インスタンスオーナではExplainコマンドは実行できるが、テスト用のスキーマに作ったExplain表からdb2exfmtで結果を取得しようとした場合、下記のメッセージが表示される。

・メッセージ
No Explain instances (plans) were found for database , source
pattern: %.% for explain table schema DB2.

(2)windowsのドメインユーザで「コマンド行ツール」->「コマンドウィンドウ」でプロンプトを立ち上げて、該当のDBにコネクト。その後Explainコマンドを実施すると、「SQL0219N」が発生し、Explain表ありませんと言われてしまう。

【原因】

(1)各スキーマに作成されたExplain_Instanceテーブルを確認した結果、インスタンスオーナ用スキーマにはExplain結果が入っているが、テスト用スキーマには全く結果が入っていないという状況だった。

(2)そもそも[ドメインユーザ.Explain_Instance]がないのが原因。ドメインユーザのスキーマもない状態なので当たり前。

【勘違いしてたこと】

db2 set current schema testschema のターゲットスキーマのExplain_InstanceにExplain結果が保存されると思っていたが、実はユーザ名スキーマのExplain_Instanceに結果が保存される。

だから、db2exfmtでスキーマをtestschemaとしてしまっていたり、ドメインユーザのExplainで[ドメインユーザ.Explain_Instance]がありませんと言われても、「???」な状態だった。
まぁ。。。マニュアル読めよって話です。

設定で変えられるのかな・・・?このあたりは未確認。

【解消方法】

(1)db2exfmtのスキーマ指定「-e testschema」を「-e [インスタンスオーナ名]」とした所、正常に結果が取得できた。

db2exfmt -d sample -e [インスタンスオーナ名] -g -# 0 -n %% -s %% -w -1 -o explainResult.log

(2)そもそもExplain表が存在しないエラーが発生していたので、改めてこのユーザでプロンプトを立ち上げ、Explain.DDLを実行した所、ドメインユーザ名のスキーマが作成され、Explain表が生成された。この後はExplainコマンドでエラーは発生しなくなり、下記コマンドで取得が可能になった。

db2exfmt -d sample -e [ドメインユーザ名] -g -# 0 -n %% -s %% -w -1 -o explainResult.log

【雑感】

なんだかな。
自分の知識不足を露呈していますが、
誰かしら助かるならいっかと( ´∀`)

【補足】

DB2使うたびにいちいちログオフして、いちいちインスタンスオーナにユーザを切り替えるのが面倒くさー。
という人のために常用ドメインで実行するコマンドを用意いたしました。
この一行を書いたテキストを.batファイルとして作成しておけばOKです。

runas /u:[インスタンスオーナ名] db2cw.bat


【参考】
Explain表を作成する DB2逆引き