mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2004年09月 来月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

2004年09月06日(月) [n年日記]

#1 cvs import

普通に cvs import すると, デフォルトではイニシャルブランチ 1.1.1.1 ができて しまうので,
  1. /tmp に空ディレクトリを作り, 一旦そこに cd して空のモジュールを作る
  2. そこ(あるいは別の場所)で cvs checkout module し, module/CVS を元の作業 ディレクトリに mv する
  3. 空ディレクトリを消す
  4. 元の作業ディレクトリで, cvs add *; cvs commit * する
という手順を(手で)順番にやっていた。こうすると普通にリビジョンが 1.1 から 始まるし, 必要なファイルだけ add できるのでムダがない。(聞いたところ, こうして 1.1.1.1 を避けるのはそんなにレアというわけではないらしい)

毎回これを手でやるのは面倒なので, スクリプトを書いてみた。以下のような感じ。

#!/bin/sh -
#
#  cvsinit -- cvs initial importer.
#
# $Header: /home/dmochiha/cvsroot/scripts/cvsinit,v 1.2 2004/09/06 06:17:54 dmochiha Exp $
if [ $# -lt 1 ]; then
        echo "usage: cvsinit module [initial message]"
        exit 0
fi
CVSMOD=$1
CVSMSG=${2:-"cvs start"}
CVSSTART=start
OLDPWD=`pwd`
trap 'rm -rf /tmp/.cvsinit-$$; exit 1' 2 3 9 15
(mkdir /tmp/.cvsinit-$$; \
 cd    /tmp/.cvsinit-$$; \
 cvs import -m "$CVSMSG" $CVSMOD `whoami` $CVSSTART; \
 cvs checkout $CVSMOD;   \
 mv $CVSMOD/CVS $OLDPWD  \
)
rm -rf /tmp/.cvsinit-$$
"cvs start" とかベンダが `whoami` なのは自由なので, 適当に書き換えて下さい。
今いるディレクトリで cvsinit foo とやると, 空のモジュール foo ができて 今のディレクトリが CVS の管理下に入るので、そこで必要なファイルを適当に cvs add; cvs commit すればよい。(実際には僕は cvsadd () { cvs add $*; cvs commit $* } という関数を ~/.zshrc で定義しています。)
イニシャルブランチを使うのが気にならない人は別にいいのだけど, 1.1.1.1 が気に なる人や, *.c や *.m など必要なファイルだけ管理したい人にはおすすめだと思う。
(Thanks for the help of F澤さん。)

#2 -

先週は1週間ずーっと手計算していたので, メモがすごいことになっている。; 整理 しないと。


2004年09月21日(火) [n年日記]

#1 ISMイテキタ

統計数理研究所 (ISM)に行ってきました。 セミナーをするなら旅費を出しますよ, との有難いお話でしたが, (少なくとも現在のところは)そんな怖れ多いことができるわけがないので(^^;), 東京の実家に用事があって帰る時のついでに。
広尾のあたりに行くのは実は初めてだったりして。
統数研は, 何というか病院みたいな感じの建物でした。別に悪い意味ではなく, 建物が古くて静かなのと, 床がリノリウムかつ公的な建物なのが そういう感じがするのかも。

伊庭さん とずっとお話しして, その後福水さんに紹介していただいて少しお話ししたり。
3月に松本研研究会で話した (今はもう少し違うやり方でやっています)を最後に説明したら, 隠れ変数が5層 *1 になっているので「やりすぎ(笑)」と言われました。(笑)
帰ったのは結局午後7時半くらいだったので, 6時間くらい喋っていたような 気がする。


*1: z→λ->α->γ->(a,b) の5層。ただし, λは積分除去されているので実際には4層。

2004年09月30日(木) [n年日記]

#1 hashtable in MATLAB

MATLABで扱えるのは基本的に数値だけなので, 単語を id (整数)に変換する 関数が必要になるが(これは他の言語でも同じ), MATLABにはどうもハッシュテーブルが ないらしい。テキストを扱っている人は全体からみると少数派だろうから, 致しかたないのかも。
NIPS Papers(0-12) dataset (MATLABフォーマット) *1 のように, あらかじめ整数に変換しておくという手もある が, 訓練データに関してはそれでいいとしても, テストデータに関して毎回 それをやるのは面倒だし原理的に問題が多い。

なければ作れ, というわけで, アルゴリズム2巻 を参考にして実装してみた。
大羽さんの MATLAB のページ に公開してもいいんだけど, NLPに特化している感じがするのでここに公開して おきます。

バグを取って速くしていたら書くのに2日かかってしまった。;

内部的には double hash になっていて, ハッシュ関数は perl 内部で使われている ものと 同じ。 ハッシュを自分で書いたのは数年ぶりなので, 勉強になった。
matlab-hash-0.1.tar.gz の中身は以下のような *.m ファイルからなっています。 使い方は中の README を読んで下さい。 おまけで, テキストを整数(の配列のセル配列)に変換する関数群 matlab-text-0.1 も公開しておきます。( README )

これを使って, テキストを整数にマップするにはたとえば以下のようにします。 (/usr/share/dict/words を lexicon にする例)

slt:~% matlab
> words = cellload('/usr/share/dict/words');
loading /usr/share/dict/words..
done.
> map = hashtable(words,1:size(words,2));
adding key 45427/45427..
done.
> text = textload('/home/dmochiha/corpus/austen/clean/emma.txt');
reading /home/dmochiha/corpus/austen/clean/emma.txt..
loading lines 14281/14281..
done.
> d = textmap(map,text);
mapping 14281/14281..
done.
> d{100}
ans =
 [ 19451 20830 36967 19255 38643 1369 41328 34619 28419 19897 24271 3073 0 ]
> text{100}
ans =
 { 'happier' 'if' 'she' 'had' 'spent' 'all' 'the' 'rest' 'of' 'her' 'life' 'at' 'Hartfield.' }
(ans は圧縮して表記しました)
/usr/share/dict/words の4万エントリのハッシュを作るのに25秒くらいかかってしまう (180秒くらいだったのを速くした)が, まぁ普通1回しか使わない関数なので いいことにする。(matlabではコードをベクトル化して内部処理させないと遅くなり ます。この場合は for 文を回すしかないのでベクトル化できない。) コンパイルするともう少し速くなるかも。

*1: 前は NIPS abstracts で Abstract だけだったけれども, 去年あたりに見たら本文も 全部入っているようです。

#2 tips

ついでに, いくつか気付いた MATLAB tips.


3 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project