タブ区切りファイルをスタンフォード分類子に入力する際に問題が発生しました。
ニュースグループのチュートリアルを含む、含まれているすべてのスタンフォードチュートリアルを正常にウォークスルーできましたが、自分のトレーニングとテストデータを入力しようとすると、正しく読み込まれません。
最初は、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の両方で同じファイルを使用してこれらの同じコマンドを実行しましたが、結果はそれぞれ同じです。