【问题标题】:Processing a corpus so big I'm getting runtime errors处理一个这么大的语料库,我遇到了运行时错误
【发布时间】:2015-02-01 17:56:29
【问题描述】:

我正在尝试使用以下代码处理大量推文(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

在这里,我将列表/变量扩展/附加到列表中,我们仍在 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 - 忘记在这篇文章中添加 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
.....

最终分类器需要很长时间来训练。关于运行时错误,请参阅 cmets。感谢大家的帮助。

【问题讨论】:

  • 你得到什么运行时错误?在哪里?
  • 我没有注意到它,抱歉。目前,我正在再次运行该程序以重现并为您提供确切的错误。谢谢你的帮助。错误发生在 for 循环中的某个时间点。它发生在许多循环成功执行之后。
  • 问题可能在任何地方。可能是内存不足,可能是由于数据集中的错误导致的错误(并且可能位于数据集的末尾附近,因此通过限制循环您将看不到它)等。为了避免内存问题,尝试不时卸载内存,例如每 10K 行写入文件。此外,请尝试按块处理数据集:将其分成段并一次处理一个,保存部分结果。
  • 使用panda 获取比示例数据更大的数据
  • 当许多循环已经成功执行时,我发现了在某个时刻出现运行时错误的原因。在我发布的上一个版本中,我不是计算每个周期,而是打印每个 featureVector(这是与此代码的唯一区别)。看起来很漂亮,但在我看来,这是导致运行时错误的原因。可能是因为 python shell 包含了太多的项目。切换到我发布的版本后,我可以成功运行该程序。我很抱歉,因为我在帖子发布几个小时后才想起更改。

标签: python runtime-error nltk pickle sentiment-analysis


【解决方案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

另一篇相关博文here

【讨论】:

  • 谢谢!我不知道我可以像那样限制 csv。那肯定会派上用场。然而,我的数据集在正面和负面推文之间分成两半,首先是负面的,然后是正面的。所以我在我的 for 循环中设置了一个条件,只在每 N 个条目执行一次代码。
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 2021-11-16
  • 2021-11-29
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多