シリアル化に問題があります
mClassifierオブジェクトをファイルに書き込むためのコードは次のとおりです。
FileOutputStream fileOut = new FileOutputStream("C:\\polarity.model");
ObjectOutputStream objOut = new ObjectOutputStream(fileOut);
mClassifier.compileTo(objOut);
objOut.close();
それはうまく機能し、ファイルに何かを書き込みます。
しかし、落とし穴があります。myClassifier
オブジェクトはタイプDynamicLMClassifier
です。compileTo
ただし、上記のメソッドはLMClassifier(スーパークラス)のインスタンスを返します
オブジェクトを読み取るための私のコードは次のとおりです。
FileInputStream in = new FileInputStream("C:\\polarity.model");
ObjectInputStream ois = new ObjectInputStream(in);
mClassifier = (DynamicLMClassifier)(ois.readObject());
ois.close();
オブジェクトを読み取ると、型キャストしてDynamicLMClassifier
、それも正常に機能しますが、希望する出力が得られません。LMClassifier
オブジェクトを再度読み取るときに、。ではなくタイプキャストされないようにする必要がありますDynamicLMClassifier
。しかし、私がそうすると、コンパイラーはそれがタイプでなければならないと文句を言いDynamicLMClassifier
ます。
上記が問題になる可能性がありますか、それとも私は他の場所で何か間違ったことをしていますか?つまり、シリアル化されていないコードは完全に正常に機能しており、目的の出力が得られます。つまり、オブジェクトがメモリ内にある場合です。
編集:これが完全なコードです(train()
andgetSentiments()
メソッドのシリアル化部分を削除するだけで意図したとおりに機能します)。また、(1)シリアル化では呼び出しgetSentiments()
ではなく、トレーニング中、つまりtrain()メソッドを呼び出していることに注意してください( 2)(1)の後にシリアル化されたモデルがあり、メインの適切なコードをコメントアウトするだけでtrain()
メソッドを呼び出すのではありません。getSentiment()
public class PolarityBasic{
File mPolarityDir;
String[] mCategories;
DynamicLMClassifier<NGramProcessLM> mClassifier,readClassifier;
PolarityBasic(String[] args) {
System.out.println("\nBASIC POLARITY DEMO");
mPolarityDir = new File("C:\\review_polarity","txt_sentoken");
System.out.println("\nData Directory=" + mPolarityDir);
mCategories = mPolarityDir.list();
int nGram = 8;
mClassifier
= DynamicLMClassifier
.createNGramProcess(mCategories,nGram);
}
void run() throws ClassNotFoundException, IOException {
train();
}
boolean isTrainingFile(File file) {
return file.getName().charAt(2) != '9'; // test on fold 9
}
void train() throws IOException {
int numTrainingCases = 0;
int numTrainingChars = 0;
System.out.println("\nTraining.");
for (int i = 0; i < mCategories.length; ++i) {
String category = mCategories[i];
Classification classification
= new Classification(category);
File file = new File(mPolarityDir,mCategories[i]);
File[] trainFiles = file.listFiles();
for (int j = 0; j < trainFiles.length; ++j) {
File trainFile = trainFiles[j];
if (isTrainingFile(trainFile)) {
++numTrainingCases;
String review = Files.readFromFile(trainFile,"ISO-8859-1");
numTrainingChars += review.length();
Classified<CharSequence> classified
= new Classified<CharSequence>(review,classification);
mClassifier.handle(classified);
}
}
}
FileOutputStream fileOut = new FileOutputStream("C:\\review_polarity/polarity.model");
ObjectOutputStream objOut = new ObjectOutputStream(fileOut);
mClassifier.compileTo(objOut);
objOut.close();
System.out.println(" # Training Cases=" + numTrainingCases);
System.out.println(" # Training Chars=" + numTrainingChars);
}
String getSentiment(String text) {
try{
FileInputStream in = new FileInputStream("C:\\review_polarity/polarity.model");
ObjectInputStream ois = new ObjectInputStream(in);
mClassifier = (DynamicLMClassifier)(ois.readObject());
ois.close();
}
catch(Exception e){}
Classification classification = null;
classification = readClassifier.classify(text);
System.out.println("classification: " + classification);
return (classification.bestCategory());
}
public static void main(String[] args) {
try {
PolarityBasic pB = new PolarityBasic(args);
pB.run();
String text = null;
text = "It was awesome !";
System.out.println("The text \"" + text + "\" is "
+ pB.getSentiment(text));
} catch (Throwable t) {
System.out.println("Thrown: " + t);
t.printStackTrace(System.out);
}
}
}