2

現在、検索クエリを次の8つのタイプに分類するプロジェクトに取り組んでいます:{アスリート、俳優、アーティスト、政治家、地理、施設、QA、定義}。少し作業した後、層化された10分割交差検定で分類器を評価したときに、多層パーセプトロン分類器を使用して300のサンプルクエリのセットで78%正しく分類されたインスタンスをスコアリングすることができました。これはかなり良いと思います。

weka javaライブラリを使用して、すべてをJavaコードに実装したので、クエリを分類子に動的にフィードし、そのクエリタイプを取得するプログラムを作成できます。分類器のトレーニング部分全体を正常に実装できました。次のステップは、classifyInstance()またはdistributionForInstance()のいずれかを使用して、クエリが分類されるクラスを決定することです。

ただし、classifyInstance()は、実際のクエリタイプを取得するために私が知らないdouble値のみを返します。wekawik ​​ispacesは私が使用できると言っています

unlabeled.classAttribute().value((int) clsLabel);

classifyInstance()を呼び出してクラスの文字列表現を取得した後、これは私の場合は常に空の文字列を返すようです。

distributionForInstance()を使用すると、0から1までの8つのdouble値を持つ配列を正常に取得できます(これは、8つのクエリタイプに分類するので良いことです)。しかし、この配列の順序は何ですか?結果配列の最初の要素は、トレーニングファイルで発生する最初のクラスですか?または、この結果配列に他の事前定義された要素の順序がありますか(アルファベット順など)?wekaのドキュメントには、これに関する情報は含まれていません。

誰かが私を助けてくれることを願っています!

4

1 に答える 1

2

内部的には、Weka はすべての値を double として扱います。を作成するときにAttribute、可能な公称値をリストする文字列の配列を渡します。分類が返す double は、元の配列で選択された属性のインデックスです。したがって、次のようなコードがあるとします。

String[] attributeValues = {"a", "b", "c"};
Attribute a = new Attribute("attributeName", attributeValues);

classifyInstance()返さ2れた場合、選択したクラスはattributeValues[2]orになりcます。

メソッドを使用するdistributionForInstance()と、2 つの配列のインデックスが一致するためattributeValues[0]、返される配列の最初の要素の文字列名も一致します。

更新Instances(反対票のため) weka にオブジェクト自体を作成させている場合 (たとえば、arff ファイルから読み取っている場合)、上記の方法は機能しません。あなたの質問ではそうではないようですが、そうである場合は、何が起こっているのかを確認できるようにコードを投稿してください。

于 2012-05-25T17:31:56.097 に答える