2016-05-01 14 views
1

データセット全体のクラシファイアをトレーニングするときにメモリエラーが発生するため、データセットを小さな部分に分け、個々のクラシファイアオブジェクトをそれぞれトレーニングします。NLTKクラシファイアオブジェクト

私はこれらの個々のクラシファイアオブジェクトの組み合わせが必要です。では、どうやってそれをすることができますか? pickleファイルにオブジェクトを格納することはできますが、再び個々のオブジェクトのみになります。

私はNLTKを使用しています。

コード:

documents = [(list(movie_reviews.words(fileid)), category) 
     for category in movie_reviews.categories() 
     for fileid in movie_reviews.fileids(category)] 

all_words = [] 
for w in movie_reviews.words(): 
    all_words.append(w.lower()) 
all_words = nltk.FreqDist(all_words) 
word_features = list(all_words.keys())[:3000] 

def find_features(document): 
    words = set(document) 
    features = {} 
    for w in word_features: 
     features[w] = (w in words) 
    return features 



#print((find_features(movie_reviews.words('neg/cv000_29416.txt')))) 
featuresets = [(find_features(rev), category) for (rev, category) in documents] 
numtrain = int(len(documents) * 90/100) 
training_set = featuresets[:numtrain] 
testing_set = featuresets[numtrain:] 

classifier = nltk.NaiveBayesClassifier.train(training_set) 

答えて

3
分類器が訓練するので、あなたは(testing_set上の)正しい予測やテストを行うことができるようにするために、全体のデータセット(コード内training_set)で訓練する必要があります

データセットの一部を持つ複数の分類子が機能しません。少なくとも、最適な解決策ではありません。私は、次のことを示唆している:多分

  • あなたのコード/データを最適化しようと:

    1. メモリエラーを解決しようとする(http://gisgeek.blogspot.gr/2012/01/set-32bit-executable-largeaddressaware.htmlあなたは窓やPythonで実行されている場合は32ビット、このを見てみましょう)少ないフィーチャを使用するか、より多くのスペース/メモリ効率の良い方法で表現できます。
    2. 1と2がうまくいかず、多くのクラシファイアオブジェクトを1つに結合したい場合(ただし、その予測に基づいてのみ)、アンサンブルメソッドを試すことができますが、これはあなたのあなたが直面している問題を解決しようとしていません。いずれにせよ、ここでMaxVote分類器の一例です: https://bitbucket.org/roadrunner_team/large-scale-sentiment-analysis/src/a06d51ef42325293f0296270ca975341c847ab9f/SentimentAnalysis/FigurativeTextAnalysis/models/Classifier_.py?at=master&fileviewer=file-view-default

      class MaxVoteClassifier(object): 
          """ 
           Takes as input a list of pre-trained classifiers and calculates the Frequency Distribution of their predictions 
          """ 
          def __init__(self, classifiers): 
           self._classifiers = classifiers 
           self.predictions = None 
      
          def classify(self, tweet_fea): 
           counts = FreqDist() 
           for classifier in self._classifiers: 
            classifier.set_x_trial([tweet_fea]) 
            counts[classifier.predict()[0]] += 1 
      
           return counts.max() 
      
  • +0

    は、あなたの答えをいただき、ありがとうございます。質問は、私は3000単語を超えると、私はメモリエラーを取得し、正しい予測のために私は100キロ語以上の量になります全体のデータセットを使用する必要があります。だから私は 'ポイント1と2'はうまくいくとは思わない。私が感じることは、機械学習プロジェクトを行っているほとんどの人がこれに直面しなければならないので、私の問題は非常に一般的なものでなければならないということです。このサイトhttp://text-processing.com/demo/sentiment/はNLTKを使用してアプリケーションを作成しています。これは完全に機能するので、誰もが使用しなければならない共通のテクニックが必要です。 – Arkham

    +0

    私の例のリポジトリは、(設定の1つで)列車データ用に100000個のツイートを、テストデータ用に約20000個を使用する感情分析プロジェクトであり、メモリの問題なしに1ステップで実行されます。それはscikit-learnを使っています(そして他のものにはnltk)。これが私が1と2を提案した理由です。あなたがあなたの例をどこでテストしているかについてもっと教えてください。 (ハードウェアとセットアップ) – mkaran

    +0

    私はもちろん、NLTKツールキットを使用して6GBのRAMを持っています。 scikitモジュールBTWを使用していません。しかし、私が投稿したリンクはscikitモジュールを使用していないし、NLTK上に構築されているので、私はそれが何か違いがあるとは思わない。 – Arkham