2011-02-05 19 views
17

私は、python nltkモジュールとnaivebayesクラシファイアを使ってテキストのスニペットを分類するプロジェクトに取り組んでいます。私はコーパスのデータを訓練し、別のデータセットを分類することができますが、最初の訓練の後に分類子に追加の訓練情報を送りたいと思います。nltkクラシファイアを徐々に訓練する方法

私が誤解していない場合、NaiveBayesClassifier.trainメソッドがトレーニングデータの完全なセットを取るという点で、これを行う方法がないようです。元のフィーチャセットを使用せずにトレーニングデータに追加する方法はありますか?

私は、時間の経過とともに新しいトレーニングデータを受け入れることができる他の分類子を含む提案には公開しています。

1)定期的に新しいデータの分類器を再訓練:

+1

最後にこの問題の解決策を見つけましたか? – w2lame

+0

私は再分類せずに新しいトレーニングデータを提供するために、クラシファイアの内部をちょっとハッキングしました。それはずっと前のことだったので、私は正確に思い出すことはできませんが、実現可能であったと思います。それ以降は私はプロジェクトで遠くまでは行かなかったので、現役ではありません。 – Rog

+0

ありがとう、返信ありがとう@rog :) – w2lame

答えて

9

は、私が知っている2つのオプションがあります。あなたはコーパスに新しい訓練データを蓄積しています(既に元の訓練データを含んでいます)。その後、数時間おきに、&分類子を再読み込みします。これはおそらく最も簡単な解決策です。

2)内部モデルを外部化し、手動で更新します。 NaiveBayesClassifierは、label_prodistfeature_probdistとすることで直接作成できます。これらを別々に作成し、NaiveBayesClassifierに渡して、新しいデータが入ったときに更新することができます。分類子はこの新しいデータをただちに使用します。確率分布を更新する方法の詳細については、trainメソッドを参照する必要があります。

+0

ありがとうJacob!私はパフォーマンスの問題があるかもしれないと思うのでオプション1を避けることを望んでいます(私は別々の分類子をたくさん持っています)。私はオプション2を見てみましょう。それはまた、永続的な分類子(またはそれ以上の知識)を助けるかもしれませんし、全体をピックリングするとかなり大きなファイルが生成されます(スケーラビリティを考慮して)。 – Rog

+3

水平スケーラビリティのために少しスピードを犠牲にしたい場合は、ストレージ/ルックアップにRedis Hashを使用するProbDistIサブクラスを作成して、モデルをRedisに保持することができます。次に、酸洗を行う必要はなく、分類器は「常にオン」です。 – Jacob

+0

提案していただきありがとうございます。私はいくつかのmemcached +データベースオプションも見ています。 – Rog

0

私はちょうどNLTKを学んでいるので、私が間違っている場合は私を修正してください。これは互換性のないNLTKのPython 3ブランチを使用しています。

学習データに追加するように見える NaiveBayesClassifierインスタンスへ update()方法、あり

from textblob.classifiers import NaiveBayesClassifier 

train = [ 
    ('training test totally tubular', 't'), 
] 

cl = NaiveBayesClassifier(train) 
cl.update([('super speeding special sport', 's')]) 

print('t', cl.classify('tubular test')) 
print('s', cl.classify('super special')) 

これはアウト出力します

t t 
s s 
+2

textblobは確率を調整してモデルを実際に「更新」しないが、新しいモデルを再学習することに注意してください。 – alvas

関連する問題