NLTK分类器对象

2024-10-04 11:35:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在为整个数据集训练分类器时遇到内存错误,因此我将数据集分成小部分,并为每个部分训练一个单独的分类器对象。在

为了测试,我需要这些单独的分类器对象的组合。那我该怎么做呢。我可以将这些对象存储在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)

Tags: 对象infor分类器allfindmoviedocuments
1条回答
网友
1楼 · 发布于 2024-10-04 11:35:45

分类器需要在整个数据集(代码中的训练集)上进行训练,以便您能够进行正确的预测和测试(在测试集上),因为用数据集的一部分训练多个分类器是行不通的,或者至少这不是最佳解决方案。我建议以下几点:

  1. 尝试解决内存错误(如果您在windows和python32位上运行,请看一下这个:http://gisgeek.blogspot.gr/2012/01/set-32bit-executable-largeaddressaware.html
  2. 试着优化你的代码/数据,也许使用更少的特性,或者以更节省空间/内存的方式来表示它们。在
  3. 如果1和2不起作用,并且希望将多个分类器对象组合为一个(但仅当涉及到它们的预测时),您可以尝试集成方法,但我真的相信这是除了您正在尝试做的之外,并不能解决您所面临的问题。在任何情况下,下面是一个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()
    

相关问题 更多 >