2009-12-03
■ [python]パッケージに関する覚え書き

パッケージについて
__init__.pyの入ったディレクトリをパッケージとしてimportできる。Mac OS Xのバンドルみたいな感じ。
また、ディレクトリは多層構造にできるけど、その際各ディレクトリに__init__.pyが必要。
__init__.pyはパッケージインポートの祭の初期化メソッドなどを記すが、空でもかまわない。
パッケージのインポート
Sound/
__init__.py
Format/
__init__.py
echo.py
sorround.py
Filters/
__init__.py
equalizer.py
vocoder.py
このようなパッケージがあった場合、echo.pyをインポートするにはimport Sound.Format.echoやfrom Sound.Format import echoなどとする.
echo.py内の関数echofileterを使用する場合、import Sound.Format.echoとした場合はSound.Format.echo.echofilter(input, output)とする。
from Sound.Format impor echoとした場合はecho.echofilter(input, output)とできる。
またfrom Sound.Format.echo import echofileterと、直接関数をインポートすることもでき、この場合はechofilter(input, output)と使える.
from package import itemとした場合、itemはサブパッケージ、サブモジュール、モジュール内で定義されている関数、クラス、変数などを指定できる。
import package.itemとした場合、itemに指定できるのは、モジュールかパッケージのみ。
パッケージ内での暗黙のあるいは明示的な相対import
1) 暗黙の相対パスimport
パッケージ内でのimport itemの実行はまずパッケージ内で探索されその後標準検索パスを見る。
import されたモジュールが現在のパッケージ (現在のモジュールをサブモジュールにしているパッケージ) 内に見つからなかった場合、 import 文は指定した名前のトップレベルのモジュールを検索する。
モジュール Sound.Filters.vocoder で Sound.Effects パッケージの echo モジュールをimportしたいときは、 from Sound.Effects import echoとする。
2) 明示的な相対パスimport
モジュール Sound.Filters.vocoderから他のパッケージやモジュールをimportする際はfrom .. import Effects, from ..Effects import echo, from . import equalizerなどとする.
3) もちろん絶対パスimport も行えるので可読性などのためには絶対パスimportが良いのでは
2009-12-01
■ [自然言語処理]mecabの解析辞書にUniDicを使い始めた

1) Uni-dicについて
あとで。
インストール方法
UniDicのページからバイナリがダウンロードできるのでそれを適当なディレクトリに置いて、mecabrcから指定するだけ。
mecabrcのディレクトリは僕の場合は /user/local/etc/mecabrc,UniDicは/usr/local/lib/mecab/dic/unidicにおいた.
mecabrcはにはdicdir=/usr/local/lib/mecab/dic/unidicを記述。 (複数辞書同時に使う場合はどうするんだろう…?)
ユーザ辞書への語句の追加
追加語句リストをcsvファイルで作成して登録する方法自体は,辞書によらずmecab-dict-indexを使うで共通.
例。
csvファイル あちょっ,-1,-1,-3200,感動詞,めりも言葉,*,*,*,*,アチョッ,あちょっ,あちょっ,*,*,め,あちょっ,アチョッ めりも,-1,-1,-3200,名詞,固有名詞,人名,*,*,*,メリモ,メリモ,めりも,メリモ,メリモ,固,めりも,メリモ おはよっ,-1,-1,-3200,感動詞,一般,*,*,*,*,オハヨウ,御早う,おはよう,オハヨー,オハヨウ,和,おはよう,オハヨー ; 表層, 左側index, 右側index, コスト, 品詞, 小品詞1, 小品詞2, 小品詞3,*,*,*,*,*,.. sudo /usr/local/libexec/mecab/mecab-dict-index -d ./ -u merymo2.dic -f utf8 -t utf8 merymo2.csv
csvファイルで指定できる品詞はまだよく分かってない…。のであとで。
作成した辞書ファイルを使用するにはmecabrcかdic/unidic/dicrc にuserdic = /usr/local/lib/mecab/dic/unidic/merymo2.dicを追加。
あと、pos-id.defを編集してsudo /usr/local/libexec/mecab/mecab-dict-indexをするとmatrix.binが上書きされちゃうんだけど、これはどうしたものなのかなぁ…。これもあとで。
2009-11-30
■ [python]文字列をaとbとcとdで分割したい

文字列をseparatorで分割するときはStrings.split()メソッドを使う。
text = u'おはようございます。それでは行ってまいります。横浜は雲が出ているものの、晴れ間がのぞいています。' seped = text.split('。') print seped [u'おはようございます', u'それでは行ってまいります', u'横浜は雲が出ているものの、晴れ間がのぞいています'
文字列を複数の位置で分割したいときは?
- splitをループで使う
- 正規表現のre.split()メソッドを使う
text = u'おはようございます。それでは行ってまいります。横浜は雲が出ているものの、晴れ間がのぞいています。' seped = re.split(u'。|、', text) print seped [u'おはようございます', u'それでは行ってまいります', u'横浜は雲が出ているものの' u'晴れ間がのぞいています'
区切り文字を出力に含みたいときはpatternをグループ化すればおk
seped = re.split(u'(。|、)', text)
2009-11-28
■ [sqlite]PythonからSQLite3への日付型変数の登録

PythonからSQLiteにデータを登録するに当たり,datetime.date型とdatetime.datetime型をISO日付形式,ISO タイムスタンプ形式に変換する適合関数がデフォルトで登録されている.それ以外の形式に,あるいはそれ以外の型を適切な型に変換して登録したいときには適当な適合関数を書いて登録すればよい。
import sqlite3 import datetime, time sqlite3.connect(":memory:") cur = con.cursor() cur.execute("select ?", (datetime.datetime.now(),)) print(cur.fetchone()[0])
2009-11-28 11:56:02.498758
sqlite3の日付処理関数については以前にまとめたけど再び。
日付処理関数はstrftime, datetime, date, time, Juliandayがあって、このうち datetime, date, time, Juliandayはそれぞれstrftimeの特別な場合。
書式はstrftime(format, timestring, [modifier, ...]),datetime(timestring, [modifier, ...])など。
modifierにutcを指定した場合は,与えられたtimestringをローカルタイムゾーンでの日時として解釈しUTCの日時に変換して表示する.ローカルタイムゾーンがJSTの場合はtimestringから9時間引かれた時間が返る.
逆にlocaltimeを指定した場合は与えられたtimestringをUTCでの日時として解釈しローカルタイムゾーンの日時に変換して表示する。ローカルタイムゾーンがJSTの場合はtimestringに9時間たされた時間が返る.
cur.execute("select date(?)", (datetime.datetime.now(),))
print(cur.fetchone()[0])
2009-11-28
cur.execute("select time(?)", (datetime.datetime.now(),))
print(cur.fetchone()[0])
11:59:48
cur.execute("select datetime(?)", (datetime.datetime.now(),))
print(cur.fetchone()[0])
2009-11-28 11:59:48
cur.execute("select datetime(?, 'utc')", (datetime.datetime.now(),))
print(cur.fetchone()[0])
2009-11-28 02:59:29
cur.execute("select datetime(?, 'localtime')", (datetime.datetime.now(),))
print(cur.fetchone()[0])
2009-11-28 20:59:11
2009-11-21
■ [ipython]iPythonで日本語を表示する

iPython 0.10(with Python 2.6.3.iPythonはSciPyやNumPyと一緒に入れた (or入った)でユニコード文字列がうまく取り扱えない例。
こちらにより修正しました。
s = u'あいうえお' print s <もじばけもじばけ>
ユニコード1文字(3byte)を1byteずつの3ユニコード文字列としてしまうことに由来するバグだとか。
修正方法は以下。iplib.pyの2200行目付近を以下のように修正。一行目をコメントアウトし、以降の文字列をユニコード文字列に変更するだけ。これで無事表示されるようになる。
- source=source.encode(self.stdin_encoding) - if source[:1] in [' ', '¥t']: - source = 'if 1:¥n%s' % source + #source=source.encode(self.stdin_encoding) + if source[:1] in [u' ', u'¥t']: + source = u'if 1:¥n%s' % source
ちなみにiplib.pyはportを使ってSciPyとかと一緒に入れた僕の場合は、/opt/local/var/macports/software/py26-ipython/0.10_0+scientific/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/IPython/ipapi.py にありました。