2016-04-19 8 views
4

センチメント解析のためにNLTKクラシファイアをトレーニングし、次にpickleを使用してクラシファイアを保存しようとしています。 新しく訓練された分類器は正常に動作します。しかし、保存された分類器をロードすると、分類子はすべての例に対して「正」または「負」を出力します。Python:ロードされたNLTKクラシファイアが動作しない

私は

classifier = nltk.NaiveBayesClassifier.train(training_set) 
classifier.classify(words_in_tweet) 
f = open('classifier.pickle', 'wb') 
pickle.dump(classifier, f) 
f.close() 

を使用して分類器を節約し、私はすべてのエラーを取得していないよ

f = open('classifier.pickle', 'rb') 
classifier = pickle.load(f) 
f.close() 
classifier.classify(words_in_tweet) 

を使用して分類器をロードしています。 問題が何であるか、またはこれを正しくデバッグする方法

+0

トレーニングの仕組みや分類子の使用方法を示すことはできますか?上のコードは上手く見えます。 – Eli

+0

クラシファイアは 'classifier = nltk.NaiveBayesClassifier.train(training_set)' を使用して訓練され、 'classifier.classify(tweet_features)'によって使用されます。私が言ったように、新しく分類子を訓練してそれを新しいデータに適用すると、うまくいきます。読み込まれたものだけがうんざりです。 – Exzone

+0

まだ問題を理解しようとしています。どちらのケースでも、あなたが期待していることについての説明を追加できますか? 「肯定的」または「否定的」を出力する感情分析分類器は、それが訓練されたものであれば妥当である。 – Eli

答えて

1

ピクル分類器が間違っている可能性が最も高い場所は、特徴抽出機能です。これは、分類器が機能する特徴ベクトルを生成するために使用されなければならない。

NaiveBayesClassifierには、トレーニングと分類の両方のための機能ベクトルが必要です。あなたのコードは、生の言葉を代わりに分類子に渡したように見えます(ただし、unpicklingの後でなければ、そうでなければunpicklingの前後で別の動作をしません)。フィーチャ抽出コードは別のファイルに保存し、トレーニングと分類(またはテスト)スクリプトの両方にimportを保存する必要があります。

私はこれがOPに当てはまるのではないかと疑いますが、一部のNLTK分類器は、特徴抽出機能をコンストラクタの引数として取ります。トレーニングと分類のために別々のスクリプトを用意している場合、unpickled分類子が同じ関数を見つけられることを確実にするのは難しいことがあります。これは、pickleの仕組みのためです:酸洗だけではなく、コードを保存します。それを動作させるには、抽出関数をスクリプトがインポートする別のファイル(モジュール)に入れてください。 「メイン」スクリプトに入れた場合、pickle.loadは間違った場所でそれを探します。

関連する問題