モデルの保存
面倒くさいのでソースだけのせる。
モデルの保存
file : 保存ファイル名
svr : 分類器(今回はSVRで作ったから)
public void save(String file){
try {
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(file));
oo.writeObject(svr);
oo.flush();
oo.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
モデルのロード
file : モデルのファイル
svr : 分類器
public void load(String file){
System.out.print("Load Classifier [" + file +"]...");
try {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
//ここで使う分類器にキャストしないとダメみたい
svr = (SMOreg) objectInputStream.readObject();
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("complete.");
}
文章分類
前提
- 扱う文章は日本語
- 既に文章から名詞のみを抜き出して、以下のようなファイルを作成済み
@relation blog
@attribute line string
@attribute class {0,1}
@data
" 名詞1 名詞2 名詞3 .... ",0
" 名詞9 名詞9 名詞5 .... ",0
:
:
- コマンド実行時のディレクトリはweka.jarの存在するディレクトリとする
おおまかな流れは以下のようになる。
テキストのarffファイルをTFIDF値を記述したarffファイルに変換
↓
属性値の中で、クラス変数を最後にする
↓
素性選択
↓
モデル生成
TFIDF値で重み付けされたarffファイルを作成
元のファイルは名詞をそのまま記述したファイルなので、これにより名詞の数・記事の数からTFIDF値を算出できる。
コマンド
java -cp weka.jar weka.filters.unsupervised.attribute.StringToWordVector -C -T -I -N 1 -O -M 0 -W MaxCount -i input.arff -o tmp1.arff
- 「-cp」はharファイルを使用するときに必要なjavaのオプション
- C::語の出現頻度で表す
- T::語の出現頻度を log(1+fij) に変える。fij はi番目の語のj番目の文書での出現頻度
- l::語の出現頻度をTFIDF値に変換する
- N 1::訓練データの大きさの平均でテストデータを正規化する
- O::語の最大数と最小出現頻度
- M::語の最小頻度(この数字以下のものは切り捨て)
- W::WordVectorの大きさ
- i::入力ファイル
- o::出力ファイル
クラスの属性を最後にもっていく
次の手順でする素性選択を行うには、これが不可欠。
コマンド
java -cp weka.jar weka.filters.unsupervised.attribute.Reorder -R 2-last,first -i input.arff -o tmp2.arff
素性選択
特徴選択ともいう。次元削減。それぞれのクラスの文章を代表する語を選択する。
コマンド
java -cp weka.jar weka.filters.supervised.attribute.AttributeSelection
-E " weka.attributeSelection.ChiSquaredAttributeEval "
-S " weka.attributeSelection.Ranker -T 0.025 -N 1000 " -i input.arff -o output.arff
- E::属性の選択方法(上記例ではカイ2乗選択)
- S::属性選択の閾値を決める(-T::値の閾値、-N::素性数の上限)
javaのプログラム内で使うには
当然だが、やることは上記コマンドと同じ。
javaのプログラム内で記述するときの流れとしては、
オプションを指定
↓
クラスのmainを実行
TFIDF値で重み付けされたarffファイルを作成
String[] options = {"-C","-T","-I","-N","1","-O","-M","0","-W",Integer.toString(MaxCount),"-i",input,"-o",middle1};
StringToWordVector.main(options);
クラスの属性を最後にもっていく
String[] options_Re ={"-R","2-last,first","-i",middle1,"-o",middle2};
Reorder.main(options_Re);
素性選択
String[] options_At = {"-E","weka.attributeSelection.ChiSquaredAttributeEval",
"-S","weka.attributeSelection.Ranker -T 0.5 -N " + Integer.toString(MaxNouns),"-i",middle2,"-o",output};
AttributeSelection.main(options_At);
話題発見
文章内の出現した単語の数をカウントすることで、どんなことが話題になっているかを判断する。
このためには、言わずもがな、単語のカウントが必要。
ここで使えるのがStringToWordVector。
StringToWordVector
wekaのクラスの1つ。
文章を単語のいろんな特徴を示したベクトルに変換することができる。
オプションでどんなもんにするか選ぶ。
・デフォルト::文章中に単語が出現したかどうかの2値。自動でSparse形式にしてくれるため、特徴量が0のものは記述されない
・-C::文章中での出現頻度
・-T::TF値を算出
・-l::IDF値を算出
参考URL
最終更新:2011年06月10日 12:39