フィルタ型研究用プログラムの設計のコツ
僕は自然言語処理を専攻しているんですけど、
研究で書くプログラムは統計処理がメインで、
それをフィルタとして設計しています。
どういうことかというと、
生のデータ→統計データ→出力→正解との比較
みたいな作業をしているんですね。
これをどのように設計すると便利なのかを書いておこうと思います。
たぶん音声や画像の研究にも応用できるはず。
まずはフィルタとしての設計をすることです。 こんな感じに設計します。
- 生のデータ1 → 構文解析データ1
- 生のデータ2 → 構文解析データ2
- 構文解析データ1 → 統計データ1
- 構文解析データ2 → 統計データ2
- 統計データ1 + 統計データ2 → 比較データ
- 比較データ + 構文解析データ1 → 出力
- 出力 + 正解データ → 正解率
設計したらMakefileで実装します。 うちの研究室ではシェルスクリプト(しかもcsh)で実装する人が多いんですけど、 1つプログラムを修正したら、修正したところから再開する、 みたいなことはMakefileの方がやりやすいと思うんですけどねえ。 あと複数のプロセスを同時進行するのも適当にやってくれますし。
構文解析データ1: 生のデータ1
cabocha 生のデータ1 > 構文解析データ1
構文解析データ2: 生のデータ2
cabocha 生のデータ2 > 構文解析データ2
統計データ1: 構文解析データ1 統計処理プログラム1
統計処理プログラム1 構文解析データ1 > 統計データ1
統計データ2: 構文解析データ2 統計処理プログラム2
統計処理プログラム2 構文解析データ2 > 統計データ2
比較データ: 統計データ1 統計データ2 比較プログラム
比較プログラム 統計データ1 統計データ2 > 比較データ
出力: 比較データ 構文解析データ1 出力プログラム
出力プログラム 比較データ 構文解析データ1 > 出力
正解率: 出力 正解データ 正解との比較プログラム
正解との比較プログラム 出力 正解データ > 正解率
実行するときは make です。
各プログラムでは統計ファイルを直接操作するのではなく、
オブジェクト指向言語を使って抽象化して使います。
data = new 統計データ1()
みたいな感じで。
あとから別の処理を加えようとしたときなどに便利です。
何かプログラムを弄ったときは、その前後の出力ファイルを保存しておいて diff コマンドで比較します。 全く変化がないとか、少しだけ変化しているとか、 いろいろ変化しているというくらいのことだけでもわかると便利です。