我在序列化方面有一些问题
下面是我将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()和getSentiments()方法中的序列化部分,它就能正常工作),还请注意,在(1)使用序列化时,我没有调用getSentiments(),我只是在训练,即调用train ()方法(2)现在我在(1)之后有了一个序列化的模型,我不是通过在main中注释出适当的代码来调用train()方法:
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);
}
}
}发布于 2012-12-18 13:04:22
解决了这个问题。下面是读回对象的代码(而不是问题中给出的代码):
LMClassifier readClassifier;
FileInputStream in = new FileInputStream("C:\\polarity.model");
ObjectInputStream ois = new ObjectInputStream(in);
readClassifier = (LMClassifier)(ois.readObject());
ois.close();发布于 2012-12-17 19:03:24
我不确定您的compileTo方法是做什么的,但我假设它使用Java Serialization API (例如,writeObject())将对象写入流。
我也不完全确定你的问题是什么。如果mClassifier是静态类型DynamicLMClassifier,这是LMClassifier的子类,那么很明显,您不能将LMClassifier类型的对象赋给它。因此,对LMClassifier的强制转换应该会产生一个编译器错误。
如果您只持久化DynamicLMClassifier的实例,那么您可以安全地将类型转换为该类。
那么,除了渴望之外,你没有得到的结果是什么?
https://stackoverflow.com/questions/13912658
复制相似问题