【问题标题】:Python nltk ~ Handling many features with naivebayes without getting MemoryError or ValueError?Python nltk ~ 使用 naivebayes 处理许多功能而不会出现 MemoryError 或 ValueError?
【发布时间】:2015-01-21 01:14:20
【问题描述】:

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

This is a short sentence, label1

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

short, sentence

是要提取的两个词。

有多少功能?

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

如果我使用前 50 个单词,我的代码运行良好。这是一个sn-p:

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”。从关于 stackoverflow 的另一个问题中,我找到了一个潜在的解决方案,即“使用 nltk.classify.apply_features,它返回一个类似于列表但不将所有功能集存储在内存中的对象”(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 的机器上运行它,所以我发现出现这些错误很奇怪

【问题讨论】:

  • 使用最常出现的词作为特征是个坏主意。这些通常是非区分词(停用词、功能词)。 7k 特征也不是很适合文本分类。
  • 拉尔斯曼,真的;理想情况下,我希望包含所有 7k 功能,并且在 40 GB RAM 机器上我认为我可以,但即使有 100 个功能,我也会得到 memoryError。 NaiveBayes 假设独立,因此分类器所要做的就是将每个特征和不同标签的计数制成表格。所以我不确定我为什么会遇到 MemoryError。
  • NLTK 并非设计用于这种规模。这是一个教学工具包。

标签: python memory nltk


【解决方案1】:

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

我将我的特征对象填充为特征的字典:

features = {<features>}

而不是作为包含字典和分类值的元组:

features = ({<features>},classification)

无论我把特征数组做得多么小,它总是给我

ValueError: too many values to unpack

使用这种不正确的数据结构。一旦我更改为元组,一切正常。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 2017-02-04
    • 1970-01-01
    • 2014-12-20
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多