0

シリアル化に問題があります

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);
        }
    }

}
4

2 に答える 2

0

yourecompileToメソッドが何をするのかはわかりませんが、Javaシリアル化API(たとえばwriteObject())を使用してオブジェクトをストリームに書き込むと思います。

また、あなたの問題が何であるか完全にはわかりません。がのサブクラスであるmClassifier静的型の場合、型のオブジェクトをそれに割り当てることができないことは明らかです。したがって、toをキャストすると、コンパイラエラーが発生するはずです。DynamicLMClassifierLMClassifierLMClassifierLMClassifier

のインスタンスのみを永続化する場合はDynamicLMClassifier、そのクラスに安全に型キャストできます。

それで、あなたが得ないが欲しがる結果は何ですか?

于 2012-12-17T11:03:24.347 に答える
0

問題を解決しました。オブジェクトを読み戻すためのコードを次に示します(質問で指定されたコードではありません)。

LMClassifier readClassifier;
FileInputStream in = new FileInputStream("C:\\polarity.model");
ObjectInputStream ois = new ObjectInputStream(in);
readClassifier = (LMClassifier)(ois.readObject());
ois.close();
于 2012-12-18T05:04:21.510 に答える