【问题标题】:NLTK Classifier ObjectNLTK 分类器对象
【发布时间】:2016-08-26 06:12:26
【问题描述】:

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

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

【问题讨论】:

    标签: python nltk


    【解决方案1】:

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

    1. 尝试解决内存错误(如果您在 windows 和 python 32 位上运行,请查看: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()
      

    【讨论】:

    • 感谢您的回答。问题是当我超过 3000 个单词时会出现内存错误,为了正确预测,我需要使用整个数据集,这将超过 100k 个单词。所以我认为point 1 and 2 不会起作用。我觉得我的问题应该是一个非常普遍的问题,因为大多数做机器学习项目的人都必须面对这个问题。这个网站text-processing.com/demo/sentiment 做了一个使用NLTK 的应用程序,它运行良好,所以必须有一个通用的技术或者每个人都必须使用的东西。
    • 我的示例中的存储库是一个情绪分析项目,它使用(在其中一种设置中)约 100000 条推文用于训练数据,约 20000 条推文用于测试数据,它是在没有任何内存的情况下一步完成的问题。它正在使用 scikit-learn(以及其他东西的 nltk)。这就是我提出 1 和 2 的原因。你能告诉我更多关于你在哪里测试你的例子吗? (硬件和设置)
    • 当然,我有一个使用 NLTK 工具包的 6GB RAM,并且与普通计算机中的所有内容一样。顺便说一句,不使用 scikit 模块。但是由于我发布的链接没有使用 scikit 模块并且建立在 NLTK 之上,所以我认为它应该没有任何区别。
    • 就像它甚至没有完全采用 movie_review 语料库一样。如果你愿意,我可以展示完整的代码,你可以在任何安装了 NLTK 的系统中进行测试。因为我没有在该代码中使用任何来自外部的东西。
    • 嗯...我尝试了您的示例,它达到了大约 6.15 GB 的 RAM。经过一番挖掘,我发现了这个nltk.org/book/ch06.html,我目前正在尝试 apply_features 解决方案。会告诉你它是否有效。
    猜你喜欢
    • 2018-04-09
    • 2013-07-22
    • 2019-01-17
    • 1970-01-01
    • 2017-03-04
    • 2017-01-14
    • 2013-04-22
    • 2012-09-05
    • 2014-03-05
    相关资源
    最近更新 更多