Python nltk~使用naivebayes处理许多功能而不会遇到MemoryError或ValueError?

时间:2014-06-21 15:26:15

标签: python memory nltk

我有很多带有相关标签的短句(我想预测)。例如:

This is a short sentence, label1

对于每个短句,我提取所有的名词和形容词,并将它们用作朴素贝叶斯分类器的特征。所以对于上面的句子:

short, sentence

是否会提取两个单词。

有多少功能?

总共我有260,000个观测值(50 MB csv文件)。由此我能够提取大约7,103个独特的名词和形容词。但是使用它们都是不切实际的。所以我想使用顶部 N 最常出现的单词作为功能。

如果我使用前50个单词,我的代码运行得很好。这是一个片段:

featuresets   = [(document_features(i), i.label) for i in y]
train_set, test_set = featuresets[testTrainCutoff:], featuresets[:testTrainCutoff]
classifier = nltk.NaiveBayesClassifier.train(train_set)

问题

如果使用前100个单词,我会得到' MemoryError'在尝试构建特征集时#39;从stackoverflow上的另一个问题,我找到了一个潜在的解决方案,即使用nltk.classify.apply_features返回一个对象,该对象的作用类似于列表,但不会将所有的特征集存储在内存中#34; (source)。

所以我更新了我的代码:

train_set, test_set = y[testTrainCutoff:], y[:testTrainCutoff]
train_set, test_set = apply_features(document_features,train_set), apply_features(document_features,test_set)
classifier = nltk.NaiveBayesClassifier.train(train_set)

但是,现在我收到以下错误:

File "C:\Python27\lib\site-packages\nltk\classify\naivebayes.py", line 191, in train
for featureset, label in labeled_featuresets:
ValueError: too many values to unpack

作为旁注:我在40 GB的RAM机器上运行它,所以我发现我收到这些错误很奇怪

1 个答案:

答案 0 :(得分:0)

我看到了同样的问题,对我而言,它与系统资源无关。这是我案例的解决方案。

我正在填充我的要素对象,如特征词:

features = {<features>}

而不是包含dict和分类值的元组:

features = ({<features>},classification)

无论我制作特征数组有多小,它总是给我

ValueError: too many values to unpack

这种不正确的数据结构。一旦我改为元组,一切都运行良好。希望这会有所帮助。