5

Weka Java API を使用して文書分類を行おうとしています。

これが私のデータファイルのディレクトリ構造です。

+- text_example
|
+- class1
|  |
|  3 html files
|
+- class2
|   |
|   1 html file
|
+- class3
    |
    3 html files

「TextDirectoryLoader」で作成された「arff」ファイルがあります。次にStringToWordVector、作成した arff ファイルにフィルターを使用しますfilter.setOutputWordCounts(true)

以下は、フィルターが適用された後の出力のサンプルです。私はいくつかのことを明確にする必要があります。

@attribute </form> numeric
@attribute </h1> numeric
.
.
@attribute earth numeric
@attribute easy numeric

この膨大なリストは、最初の html ファイルの内容をトークン化する必要があります。右?

で、〜がある、

@data
{1 2,3 2,4 1,11 1,12 7,..............}
{10 4,34 1,37 5,.......}
{2 1,5 6,6 16,...}
{0 class2,34 11,40 15,.....,4900 3,...
{0 class3,1 2,37 3,40 5....
{0 class3,1 2,31 20,32 17......
{0 class3,32 5,42 1,43 10.........

最初の 3 つの項目にクラス属性がないのはなぜですか? (class1 が必要です)。{0 class2,..}、{0 class3..} のように先頭の 0 は何を意味しますか。たとえば、class3 フォルダの 3 番目の html ファイルには、整数 32 で識別される単語が 5 回出現することが示されています。32 によって参照される単語 (トークン) を取得するにはどうすればよいですか?

特徴ベクトルの次元を減らすにはどうすればよいですか? すべての特徴ベクトルを同じサイズにする必要はありませんか? (たとえば、トレーニング セットから最も頻繁に使用される 100 の単語だけを考えて、後でテストするときに、テスト ドキュメントでそれら 100 の単語だけが出現することを考えます。テスト段階では、分類器はそれを無視しますか?)。

ここで何か不足していますか?私はWekaが初めてです。

StringToWordVectorまた、分類子がフィルターで作成されたこのベクトルをどのように使用するかを誰かが説明してくれれば、本当に助かります。(トレーニング データを使用した語彙の作成、次元削減など、これらは Weka コード内で行われますか?)

4

1 に答える 1

8
  1. の巨大なリストに@attributeは、入力から派生したすべてのトークンが含まれています。
  2. @dataセクションはスパース形式です。つまり、属性ごとに、値がゼロ以外の場合にのみ示されます。最初の 3 行では、class 属性は class1 であり、それを確認することはできません (不明な場合は0 ?、最初の 3 行の先頭に a が表示されます)。どうしてこんなことに?Weka は内部的に名義属性 (クラスを含む) を double として表し、ゼロからカウントを開始します。したがって、3 つのクラスは内部的には、class1=0.0、class2=1.0、class3=2.0 です。スパース形式ではゼロ値が記述されていないため、最初の 3 行でクラスを確認できません。( http://www.cs.waikato.ac.nz/ml/weka/arff.html の「スパース ARFF ファイル」セクションも参照してください)
  3. インデックス n で表される単語/トークンを取得するには、カウントするか、Instancesオブジェクトがある場合はそれを呼び出すことができますattribute(n).name()。そのために、n0 からカウントを開始します。
  4. 特徴ベクトルの次元を減らすには、多くのオプションがあります。最も頻繁に使用される 100 の用語のみが必要な場合は、stringToWordVector.setWordsToKeep(100). これは、すべてのクラスの 100 語を保持しようとすることに注意してください。クラスごとに 100 単語を維持したくない場合は、stringToWordVector.setDoNotOperateOnPerClassBasis(true). 同じ頻度の単語が複数ある場合は 100 をわずかに上回ります。したがって、100 は一種の目標値です。
  5. テスト段階で出てくる新語に関しては、stringToWordVector分類する前にすべてのインスタンスを渡さなければならないので、そうはならないと思います。私は 2 クラスの設定を使用してStringToWordVectorおり、分類子に何かを伝える前にすべてのインスタンスを変換させているため、100% 確実ではありません。

Weka KnowledgeFlow ツールを試して、さまざまなクラスの使用方法を学習することをお勧めします。そこで行う方法を知っていれば、その知識を Java コードに簡単に使用できます。回答が少し遅くなりましたが、お役に立てれば幸いです。

于 2012-05-12T15:36:45.493 に答える