2012-10-18 10 views
0

我使用lingpipe進行情感分析(以下代碼爲this),我試圖在訓練它後存儲分類器。問題是,存放後,我無法加載:存儲DynamicLMClassifier(Lingpipe)

java.lang.ClassCastException: com.aliasi.classify.LMClassifier cannot be cast to com.aliasi.classify.DynamicLMClassifier

爲了存儲我用的是分類:

AbstractExternalizable.compileTo(mClassifier, classifierFile); 

並加載它:

mClassifier = (DynamicLMClassifier<NGramProcessLM>) AbstractExternalizable.readObject(classifierFile); 

編輯: 我應該先閱讀lingpipe的javadoc。要存儲分類器並在之後加載,mClassifier的分類應爲LMClassifier<NGramProcessLM, MultivariateEstimator>。因此它可以被初始化爲DynamicLMClassifier<NGramProcessLM>,並且在訓練階段期間有必要將其投射到DynamicLMClassifier<NGramProcessLM>。在此之後,它可以被加載並用於分類新的對象。正如@mjv所說,這使分類器不再可以訓練。

回答

1

AbstractExternalizable.compileTo()方法僅調用正被序列化的對象的compileTo()方法,並將輸出發送到指定的文件。

由於DynamicLMClassifier.compileTo()方法產生一個LMClassifier這就是你反序列化時得到的結果。一個LMClassifier幾乎是一回事,如果有的話,更高效和緊湊,主要的區別是它是不可訓練的;因此,如果您打算在初始創建後繼續對分類器進行訓練,這只是一個問題。

如果您需要繼續訓練分類器,可以分別序列化LanguageModels(大多數LanguageModels實現Compilable),並通過調用其構造函數並將其傳遞給反序列化模型列表來重新創建動態分類器。我從來沒有嘗試過這種方法,但我相信這是推薦的方式,特別是現在已經重構了LingPipe對象的序列化。

+0

這不是我的情況,但如果我打算在編譯後繼續訓練分類器,該怎麼辦? – miguel

+0

@miguel重複動態訓練,你可以堅持LanguageModels代替。 (看我的編輯) – mjv