DynamicLMClassifier.createNGramProcess(categories,nGram)20 GB を超える大きなデータセットでトレーニングしようとしています。現在、トレーニング ファイル全体を文字列としてトレーニング メソッドに供給していますが、明らかな理由から、java.lang.OutOfMemoryError: Java heap space
このようなトレーニングをサポートするために JVM ヒープ サイズを増やすことは可能かもしれませんが、漸進的な方法を見つけることに興味があります。
トレーニング コードは次のようになります。
char[] csBuf = new char[numChars];
for (int i = 0; i < categories.length; ++i) {
String category = categories[i];
File trainingFile = new File(new File(dataDir,category),
category + ".txt");
FileInputStream fileIn
= new FileInputStream(trainingFile);
InputStreamReader reader
= new InputStreamReader(fileIn,Strings.UTF8);
reader.read(csBuf);
String text = new String(csBuf,0,numChars);
Classification c = new Classification(category);
Classified<CharSequence> classified
= new Classified<CharSequence>(text,c);
classifier.handle(classified);
reader.close();
}
理想的な解決策は、トレーニング セットの N 個のサブセットのループで classifier.handle() をフィードすることです。モデルは、MLE を計算するためにそれぞれのカウントを含む ngrams タプルを記憶するだけでよいため、理論的にはこれは可能であると思います。