【发布时间】: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 并非设计用于这种规模。这是一个教学工具包。