我正在用 python 编写一个程序来对电影评论进行 unigram(最终是 bigram 等)分析。目标是创建特征向量以输入 libsvm。我的特征向量中有 50,000 个奇怪的唯一词(这对我来说似乎相当大,但我相对确定我是对的)。
我使用 python 字典实现作为哈希表来跟踪遇到的新单词,但我注意到在处理前 1000 个奇怪的文档后速度大大降低。如果我使用几个较小的哈希表/字典,我会获得更好的效率(考虑到自然语言的分布)还是相同/更差?
更多信息:
数据被分成 1500 个左右的文档,每个文档大约 500 个单词。每个文档中有 100 到 300 个唯一词(相对于所有以前的文档)。
我当前的代码:
#processes each individual file, tok == filename, v == predefined class
def processtok(tok, v):
#n is the number of unique words so far,
#reference is the mapping reference in case I want to add new data later
#hash is the hashtable
#statlist is the massive feature vector I'm trying to build
global n
global reference
global hash
global statlist
cin=open(tok, 'r')
statlist=[0]*43990
statlist[0] = v
lines = cin.readlines()
for l in lines:
line = l.split(" ")
for word in line:
if word in hash.keys():
if statlist[hash[word]] == 0:
statlist[hash[word]] = 1
else:
hash[word]=n
n+=1
ref.write('['+str(word)+','+str(n)+']'+'\n')
statlist[hash[word]] = 1
cin.close()
return statlist
另请记住,我的输入数据约为 6mb,输出数据约为 300mb。我只是惊讶于这需要多长时间,而且我觉得它不应该在运行时如此显着地放慢速度。
减速:前 50 个文档大约需要 5 秒,后 50 个文档大约需要 5 分钟。