1

タブ区切りファイルをスタンフォード分類子に入力する際に​​問題が発生しました。

ニュースグループのチュートリアルを含む、含まれているすべてのスタンフォードチュートリアルを正常にウォークスルーできましたが、自分のトレーニングとテストデータを入力しようとすると、正しく読み込まれません。

最初は、Excelスプレッドシートを使用してデータをタブ区切りファイルに保存していることが問題だと思いました。これは、ある種のエンコーディングの問題でした。

しかし、次のことを行ったときもまったく同じ結果が得られました。まず、以下のデモデータを文字通りgeditに入力し、政治/スポーツクラスとそれに続くテキストの間にタブを使用するようにしました。


politics    Obama today announced a new immigration policy.
sports  The NBA all-star game was last weekend. 
politics    Both parties are eyeing the next midterm elections.
politics    Congress votes tomorrow on electoral reforms.
sports  The Lakers lost again last night, 102-100.
politics    The Supreme Court will rule on gay marriage this spring.
sports  The Red Sox report to spring training in two weeks.
sports  Messi set a world record for goals in a calendar year in 2012.
politics    The Senate will vote on a new budget proposal next week.
politics    The President declared on Friday that he will veto any budget that doesn't include revenue increases.
私はそれをmyproject/demo-train.txtと同様のファイルとして保存しましmyproject/demo-test.txtた。

次に、以下を実行しました。

java -mx1800m -cp stanford-classifier.jar edu.stanford.nlp.classify.ColumnDataClassifier 
-trainFile myproject/demo-train.txt -testFile myproject/demo-test.txt

良いニュース:これは実際にはエラーをスローせずに実行されました。

悪いニュース:特徴を抽出しないため、実際に実際のモデルを推定することはできず、確率はデフォルト1/nで各アイテムに設定されます。ここnで、はクラスの数です。

そこで、同じコマンドを実行しましたが、2つの基本的なオプションを指定しました。

java -mx1800m -cp stanford-classifier.jar edu.stanford.nlp.classify.ColumnDataClassifier 
-trainFile myproject/demo-train.txt -testFile myproject/demo-test.txt -2.useSplitWords =2.splitWordsRegexp "\s+"
その結果、次のようになりました。
Exception in thread "main" java.lang.RuntimeException: Training dataset could not be processed
    at edu.stanford.nlp.classify.ColumnDataClassifier.readDataset(ColumnDataClassifier.java:402)
    at edu.stanford.nlp.classify.ColumnDataClassifier.readTrainingExamples  (ColumnDataClassifier.java:317)
    at edu.stanford.nlp.classify.ColumnDataClassifier.trainClassifier(ColumnDataClassifier.java:1652)
    at edu.stanford.nlp.classify.ColumnDataClassifier.main(ColumnDataClassifier.java:1628)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
    at edu.stanford.nlp.classify.ColumnDataClassifier.makeDatum(ColumnDataClassifier.java:670)
    at edu.stanford.nlp.classify.ColumnDataClassifier.makeDatumFromLine(ColumnDataClassifier.java:267)
    at edu.stanford.nlp.classify.ColumnDataClassifier.makeDatum(ColumnDataClassifier.java:396)
    ... 3 more
これらは、Excelから保存した実際のデータを使用したときに得られる結果とまったく同じです。

さらに、私はの意味を理解する方法がわかりませんArrayIndexOutOfBoundsException。Pythonで、作成したデモファイルと機能したチュートリアルファイルの両方の生の文字列を印刷するために使用したときreadline、フォーマットについては何も変わっていないように見えました。したがって、この例外が1つのファイルセットで発生し、他のセットでは発生しない理由はわかりません。

最後に、もう1つの癖。ある時点で、おそらく改行が問題だと思いました。そこで、タブ区切りを保持したままデモファイルからすべての改行を削除し、同じコマンドを実行しました。

java -mx1800m -cp stanford-classifier.jar edu.stanford.nlp.classify.ColumnDataClassifier 
-trainFile myproject/demo-train.txt -testFile myproject/demo-test.txt -2.useSplitWords =2.splitWordsRegexp "\s+"

驚いたことに、今回はJava例外はスローされません。しかし、繰り返しになりますが、それは価値がありません。ファイル全体を1つの観測値として扱い、結果としてモデルを適切に適合させることができません。

私は今これに8時間を費やし、私が考えることができるすべてを使い果たしました。私はJavaを初めて使用しますが、ここでは問題になるとは思いません。スタンフォード大学のAPIドキュメントによるとColumnDataClassifier、必要なのはタブ区切りファイルだけです。

どんな助けでも大歓迎です。


最後の注意:WindowsとUbuntuの両方で同じファイルを使用してこれらの同じコマンドを実行しましたが、結果はそれぞれ同じです。

4

2 に答える 2

2

プロパティ ファイルを使用します。スタンフォード分類器の例では

trainFile=20news-bydate-devtrain-stanford-classifier.txt
testFile=20news-bydate-devtest-stanford-classifier.txt
2.useSplitWords=true
2.splitWordsTokenizerRegexp=[\\p{L}][\\p{L}0-9]*|(?:\\$ ?)?[0-9]+(?:\\.[0-9]{2})?%?|\\s+|[\\x80-\\uFFFD]|.
2.splitWordsIgnoreRegexp=\\s+

行 3、4、および 5 の先頭にある数字 2 は、tsv ファイル内の列を示します。したがって、あなたの場合は使用します

trainFile=20news-bydate-devtrain-stanford-classifier.txt
testFile=20news-bydate-devtest-stanford-classifier.txt
1.useSplitWords=true
1.splitWordsTokenizerRegexp=[\\p{L}][\\p{L}0-9]*|(?:\\$ ?)?[0-9]+(?:\\.[0-9]{2})?%?|\\s+|[\\x80-\\uFFFD]|.
1.splitWordsIgnoreRegexp=\\s+

または、コマンドライン引数で実行したい場合

java -mx1800m -cp stanford-classifier.jar edu.stanford.nlp.classify.ColumnDataClassifier -trainFile myproject/demo-train.txt -testFile myproject/demo-test.txt -1.useSplitWords =1.splitWordsRegexp "\s+"
于 2013-11-05T20:59:45.167 に答える
0

私はあなたと同じエラーに直面しました。

分類しているテキストのタブに注意してください。

Caused by: java.lang.ArrayIndexOutOfBoundsException: 2

これは、文字列をタブで分割した後、ある時点で分類子が 3 つの要素の配列を期待することを意味します。

各行のタブの数をカウントするメソッドを実行しましたが、ある行にタブが2つない場合-ここにエラーがあります。

于 2013-03-08T19:26:56.947 に答える