北野坂備忘録

主にインストールやプログラミングのメモを載せています。

言語処理100本ノック 2015年版 第9章再訪(1)

84. 単語文脈行列の作成(再)

83の出力を利用し,単語文脈行列Xを作成せよ.ただし,行列Xの各要素X_tcは次のように定義する.

f(t,c)≥10ならば,X_tc=PPMI(t,c)=max{log( (N×f(t,c)) / (f(t,∗)×f(∗,c) ) ),0}
f(t,c)<10ならば,X_tc=0

ここで,PPMI(t,c)はPositive Pointwise Mutual Information(正の相互情報量)と呼ばれる統計量である.なお,行列Xの行数・列数は数百万オーダとなり,行列のすべての要素を主記憶上に載せることは無理なので注意すること.幸い,行列Xのほとんどの要素は0になるので,非0の要素だけを書き出せばよい.

今日買ったばかりの本に同じ問題が取り上げられていました。

岩波データサイエンス Vol.2

で、これを読むと計算式が変形されています。これもしかすると変形後の式で計算した方が速い?
試しにlogの計算を変形します。

元の式
wtc = math.log( ( N * int(string[0]) ) / ( tdic[wordlist[0]] * cdic[wordlist[1]] ) )
変形後の式
wtc = math.log(N) + math.log(int(string[0])) - math.log ( tdic[wordlist[0]] ) - math.log( cdic[wordlist[1]] )

 では時間を計測してみましょう

元の式
real	0m1.215s
user	0m0.101s
sys	0m0.219s

変形後の式
real	0m0.254s
user	0m0.139s
sys	0m0.032s

なんと5倍ぐらい処理時間が違う!