2012-04-18 19 views
5

私はWeka Java APIを使用してドキュメントの分類をしようとしています。StringToWordVector()の出力を解釈する - Weka

ここに私のデータファイルのディレクトリ構造があります。

私は 'TextDirectoryLoader'で作成された 'arff'ファイルを持っています。次に、作成されたarffファイルにStringToWordVectorフィルタを使用します(filter.setOutputWordCounts(true))。

以下は、フィルタが適用された後の出力のサンプルです。私は明確にされたものはほとんど得られない。

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

この膨大なリストは、最初のhtmlファイルの内容をトークン化する必要があります。右?最初の3つの項目にはクラス属性が存在しない理由を

は、それから私は、

@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......... 

がありますか? (それはclass1を持つべきです)。 先頭の0は{0 class2、..}、{0 class3 ..}のように何を意味しますか? たとえば、class3フォルダの3番目のhtmlファイルでは、整数32で識別される単語が5回表示されます。ちょうど私が32によって参照される言葉(トークン)を得る方法を見るためにか。

フィーチャベクターの次元をどのように減らすか?すべての特徴ベクトルを同じサイズにする必要はありませんか? (訓練セットの100の最も頻繁な用語だけを考えてみましょう。後でテストになるときは、テスト文書の100語の出現を考慮してください。このように、まったく新しい単語テスト段階では、分類器は無視しますか?)。

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

また、誰かがこのベクトルをStringToWordVectorフィルタで作成したものをどのように使用しているのか説明できれば、本当に助けになります。 @attributeの(それらのウェカコードの内部で起こっている、次元削減、トレーニングデータと語彙を作成するような?)

答えて

8
  1. 巨大なリストには、入力から派生したすべてのトークンが含まれています。
  2. あなたの@dataセクションが疎フォーマットである、つまり属性ごとにある場合、値はゼロと異なる場合にのみ記載されます。最初の3行については、class属性はclass1ですが、それを見ることはできません(不明な場合は最初の3行の先頭に0 ?が表示されます)。どうしてこんなことに? 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()を呼び出します。そのために、nは0でカウントを開始します。
  4. 特徴ベクトルの次元数を減らすために、多くのオプションがあります。最も頻繁に使用される用語が100件だけの場合は、stringToWordVector.setWordsToKeep(100)です。これは、すべてのクラスの100語を保持しようとすることに注意してください。クラスごとに100語を保持したくない場合は、stringToWordVector.setDoNotOperateOnPerClassBasis(true)。同じ頻度で複数の単語がある場合は100をわずかに上回りますので、100は単なる目標値の一種です。
  5. テストフェーズで発生した新しい単語については、分類する前にすべてのインスタンスをstringToWordVectorに渡す必要があるため、この問題は発生しません。私は2つのクラスの設定を使用しているので、私は100%確信していません。そして、私はStringToWordVectorがクラシファイアに何かを伝える前にすべてのインスタンスを変換するようにしました。

私は、Weka KnowledgeFlowツールを試して、さまざまなクラスの使い方を学ぶことができます。そこで何かする方法がわかっているなら、その知識をあなたのJavaコードに使うことができます。 私はあなたに手伝ってもらえましたが、答えは少し遅れました。

+0

はい、答えはちょっと遅いので、私は自分で答えを学びました。しかし、あなたの答えに感謝し、私はそれを受け入れています。あなたはwekaのlibsvm(ラッパー)を使って1つのクラス分類についての経験がありますか?私はそれにこだわっている。 – KillBill

+0

@ user601いいえ、申し訳ありません。 Wekaでlibsvmを使ったことはありませんでした。好奇心からちょうどあなたが機械学習/データマイニングの話題に論文を書いていますか? – Malhelo

+0

はい私はテキストの分類を含む私の上級年度の論文をやっています。似たようなことをしていますか? – KillBill

関連する問題