1

WEKA ライブラリを使用して SMS SPAM 分類子を作成しようとしています。「ラベル」と「テキスト」の見出しを持つ CSV ファイルがあります。以下のコードを使用すると、2 つの属性を持つ ARFF ファイルが作成されます。

@attribute label {ham,spam}
@attribute text {'Go until jurong point','Ok lar...', etc.}

現在、テキスト属性は、各メッセージのテキストを値として持つ公称属性としてフォーマットされているようです。しかし、すべてのインスタンスからのすべてのテキストのリストではなく、テキスト属性を文字列属性にする必要があります。テキスト属性を文字列として持つことで、StringToWordVector フィルターを使用して分類器をトレーニングできます。

// load CSV
CSVLoader loader = new CSVLoader();
loader.setSource(new File(args[0]));
Instances data = loader.getDataSet();

// save ARFF
ArffSaver saver = new ArffSaver();
saver.setInstances(data);
saver.setFile(new File(args[1]));
saver.setDestination(new File(args[1]));
saver.writeBatch();

次のような String 属性を作成できることはわかっています。

Attribute tmp = new Attribute("tmp", (FastVector) null);

しかし、現在の属性を置き換える方法や、CSV を読み込む前に属性の種類を設定する方法がわかりません。

新しい文字列属性を挿入して、現在の公称属性を削除しようとしましたが、これによりすべての SMS テキストが削除されます。renameAttributeValueも使用してみましたが、これは属性タイプの変更には機能しないようです。

編集: このNominalToString フィルターが機能すると思われますが、使用方法がわかりません。

どんな提案でも大歓迎です。ありがとう!

4

1 に答える 1

8

これでうまくいきました。テキスト属性タイプは変更されましたが、ラベル属性タイプは変更されませんでした (ただし、一方が変更されたのに他方が変更されなかった理由はわかりません)。

NominalToString filter1 = new NominalToString();
filter1.setInputFormat(data);
data = Filter.useFilter(data, filter1);

ここに小さなヒントがあります

デフォルトでは、非数値属性は NOMINAL 属性としてインポートされます。これは、特に StringToWordVector フィルターを使用する場合、テキスト データには必ずしも必要ではありません。属性を STRING に変更するには、データに対して NominalToString フィルター (パッケージ weka.filters.unsupervised.attribute) を実行し、変換する属性インデックスまたはインデックスの範囲を指定します (注意: このフィルターは、 class 属性は変換から!)。

于 2013-06-19T20:17:51.590 に答える