2016-04-30 164 views
0

因为我们需要在庞大的数据集上训练分类器,所以我们如何才能为情感分析制作工作分类器。使用机器学习的情感分析分类器

我有庞大的数据集来训练,但分类器对象(这里使用Python),使用3000个单词时出现内存错误。我需要训练超过100K字。

我认为是将大数据集分成较小的部分,并为每个部分分别创建一个分类器对象,并将其存储在一个pickle文件中并使用它们。但似乎使用所有的分类器对象进行测试是不可能的,因为它在测试过程中只需要其中一个对象。

我想到的解决方案是将保存在pickle文件中的所有已保存的分类器对象(这不会发生)组合起来,或者用新的训练集继续添加同一对象(但同样,它是被覆盖并且未被附加)。

我不知道为什么,但即使是机器学习的基础,我也找不到解决方案。每个机器学习项目都需要接受大量数据集的训练,并且用于训练这些数据集的对象大小总是会导致内存错误。

那么,如何解决这个问题呢?我愿意接受任何解决方案,但希望听到做实时机器学习项目的人员后续工作。

代码段:

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 

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) 

PS:我使用使用NaiveBayes的NLTK工具包。我的训练数据集正在打开并存储在documents中。

回答

1

有你似乎缺少了两两件事:

  1. 数据集的文本通常是非常稀少的,你应该并将其作为稀疏矩阵。对于这样的表示,你应该能够用词汇在你的记忆中存储数以百万计的文件。 100,000。

  2. 许多现代学习方法都是在小批量情况下进行培训的,这意味着您从不需要整个数据集在内存中,而是将其馈送到具有随机数据子集的模型 - 但仍然需要培训单个模型。这样,您的数据集可以是任意大的,内存消耗是恒定的(通过小批量大小来确定),并且只有样本数量的训练时间比例。

+0

我有我的文本数据形式的文件。每个文件都有几句话。像这样我有成千上万的文件。解析所有这些文档并不会给我带来任何问题。但是我选择培训的词汇数量确实如此。如果我选择超过3000个单词,那么它会开始提供词典错误。 – Arkham

+0

它不像“字典错误”这样的事情 - 这看起来像是一些特定的实现问题,因此没有确切的代码就不可能跟踪这个特定的问题。正如答案中所示 - 现代ML技术没有这样的限制,因此问题出在你的代码上,而不是ML中使用的方法。 – lejlot

+0

我发布了代码片段,我使用的是3000个单词。 – Arkham