テキスト処理にWekaを使う(その2:文書セットをARFFに変換する)

昨日やらなかったことがとても簡単なことに気がついたので,メモ.
Weka3.5.xからTextDirectoryToArffがTextDirectoryLoaderに変更になったので,注意.今後はそちらになると思われるので,TextDirectoryLoaderについて解説.

文書データの用意

クラスごとにディレクトリを作成し,その下にそのクラスの各インスタンスをそれぞれテキストデータで用意する.ファイル名はこだわらなくてよい.ファイル名を特徴にするオプションもあるので,属性に使用するのであればこだわってください.


ひとつのファイルがひとつのインスタンスに対応する.今回はテストのため,前回つかったARFFを作成するようなデータセットを用意する.spamクラスのテキストファイル5つと,hamクラスのテキストファイル4つ用意した.こんな感じ.

% tree
.
|-- ham
|   |-- 1.txt
|   |-- 2.txt
|   |-- 3.txt
|   `-- 4.txt
`-- spam
    |-- 1.txt
    |-- 2.txt
    |-- 3.txt
    |-- 4.txt
    `-- 5.txt

中身はこんな感じの単なるテキスト

% cat ./spam/1.txt
Well, there's egg and bacon; egg sausage and bacon; egg and spam

ARFFへ変換

データセットがあるディレクトリを指定する.現在の例ではカレントディレクトリに各クラスのディレクトリがあるのでカレントディレクトリを指定する.オプションの説明ではカレントディレクトリは指定しなくてよいとかあるけれど,指定しないと怒られた.

% java weka.core.converters.TextDirectoryLoader -dir ./


できた.

@relation _spam_

@attribute text string
@attribute class {ham,spam}

@data
'Have you got anything without spam?\n',ham
'I don\'t want ANY spam! \n',ham
'Why can\'t she have egg bacon spam and sausage?\n',ham
'THAT\'S got spam in it!\n',ham
'Well, there\'s egg and bacon; egg sausage and bacon; egg and spam\n',spam
'egg bacon and spam; egg bacon sausage and spam;\n',spam
'spam bacon sausage and spam; spam egg spam spam bacon and spam;\n',spam
'spam sausage spam spam bacon spam tomato and spam;\n',spam
'Well, there\'s spam egg sausage and spam, that\'s not got much spam in it.\n',spam


出力先を指定するオプションが見当たらないので,リダイレクトで拾っています.

% java weka.core.converters.TextDirectoryLoader -dir ./ > ./spam.arff

これでようやく前回の話につながる.大規模データでも変換できるのかな?ちょっと色々やってみます.


オプションの解説

例によって適当

Usage:
        TextDirectoryLoader [options]

Options:

-D
        Enables debug output.
        (default: off)
        デバッグメッセージを表示する

-F
        Stores the filename in an additional attribute.
        (default: off)
        ファイル名を属性として与えるオプション
       (ファイル名をインスタンスの属性に使いたい場合に)

-dir <directory>
        The directory to work on.
        (default: current directory)
        データが置いてあるディレクトリを指定
        defaultがあるけれど,指定しなければだめっぽい