在为整个数据集训练分类器时,我遇到了内存错误,因此我将数据集分成小部分,并为每个部分训练一个单独的分类器对象。
为了进行测试,我需要这些单独的分类器对象的组合。那么我该怎么做呢。我可以将对象存储在 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)
最佳答案
分类器需要在整个数据集(代码中的训练集)上进行训练,以便能够做出正确的预测和测试(在测试集上),因为使用部分数据集训练多个分类器将不起作用——或者至少它不是最佳解决方案。我建议采取以下措施:
- 尝试解决内存错误(如果您在 Windows 和 python 32 位上运行,请看一下:http://gisgeek.blogspot.gr/2012/01/set-32bit-executable-largeaddressaware.html)
- 尝试优化您的代码/数据,也许使用更少的功能,或者以更节省空间/内存的方式表示它们。
如果 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()
关于python - NLTK 分类器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36966184/