处理这么大的语料库我遇到了运行时错误

Processing a corpus so big I'm getting runtime errors

我正在尝试使用以下代码处理大量推文(1,600,000,可以找到 here)以训练朴素贝叶斯分类器,以便进行情绪分析。

我的问题是我从来没有编写过任何必须处理大量内存或大变量的代码。

目前脚本运行了一段时间,然后在几个小时后出现运行时错误(我在 Windows 机器上)。我相信我没有正确管理列表对象。

我在限制 for 循环的同时成功地 运行 程序,但这意味着限制训练集并且很可能得到更差的情绪分析结果。

如何处理整个语料库?我怎样才能更好地管理这些列表?真的是那些导致问题的吗?

这些是进口商品

import pickle
import re
import os, errno
import csv
import nltk, nltk.classify.util, nltk.metrics
from nltk.classify import NaiveBayesClassifier

我在这里加载语料库并创建列表,我想在其中存储我从语料库中提取的特征

inpTweets = csv.reader(open('datasets/training.1600000.processed.noemoticon.csv', 'rb'), delimiter=',', quotechar='"')
tweets = []
featureList = []
n=0

这个 for 循环从语料库中提取内容,感谢 processTweet(),这是一个长算法,我从 .CSV 的每一行中提取特征

for row in inpTweets:
    sentiment = row[0]
    status_text = row[5]
    featureVector = processTweet(status_text.decode('utf-8')) 
    #to know it's doing something
    n = n + 1
    print n
    #we'll need both the featurelist and the tweets variable, carrying tweets and sentiments

我在这里 extend/append 列表/列表的变量,我们仍然在 for 循环中。

    featureList.extend(featureVector)  
    tweets.append((featureVector, sentiment))              

当循环结束时,我删除了 featureList 中的重复项并将其保存到 pickle 中。

featureList = list(set(featureList))
flist = open('fList.pickle', 'w')
pickle.dump(featureList, flist)
flist.close()

我为分类器准备好了特征。

training_set = nltk.classify.util.apply_features(extract_features, tweets)

然后我训练分类器并将其保存到泡菜中。

# Train the Naive Bayes classifier
print "\nTraining the classifier.."
NBClassifier = nltk.NaiveBayesClassifier.train(training_set)
fnbc = open('nb_classifier.pickle', 'w')
pickle.dump(NBClassifier, fnbc)
fnbc.close()

编辑:19:45 gmt+1 - 忘记在 post.

中添加 n=0

edit1:由于时间和计算能力的限制我选择这样缩减语料库-

.....
n=0
i=0
for row in inpTweets:
    i = i+1
    if (i==160):         #limiter
        i = 0
        sentiment = row[0]
        status_text = row[5]  
        n = n + 1
.....

最后,分类器需要很长时间才能训练。关于运行时错误,请参阅评论。谢谢大家的帮助。

你可以使用 csv.field_size_limit(int)

例如:

f = open('datasets/training.1600000.processed.noemoticon.csv', 'rb')
csv.field_size_limit(100000)
inpTweets = csv.reader(f, delimiter=',', quotechar='"')

您可以尝试将值 100,000 更改为更好的值。

+1 关于 Pandas 的评论。

此外,您可能想查看 cPickle here。 (快 1000 倍)


也看看 this question / answer

另一个相关博客 post here.