由于我在this page中提出的问题,我的代码内存不足。然后,我编写了第二个代码,使其具有可迭代alldocs
,而不是全内存alldocs
。我根据this page的解释更改了我的代码。我不熟悉流概念,我无法解决我得到的错误。
此代码读取给定路径的所有文件夹的所有文件。每个文件的上下文由文档名称及其上下文两行组成。例如:
clueweb09-en0010-07-00000
鸽子gif剪贴画鸽子剪贴画图片图像hiox免费鸟印度web图标剪贴画添加绊倒
clueweb09-en0010-07-00001
谷歌书签雅虎书签php脚本java脚本jsp脚本行货脚本html教程css教程
第一个代码:
# coding: utf-8
import string
import nltk
import nltk.tokenize
from nltk.corpus import stopwords
import re
import os, sys
import MySQLRepository
from gensim import utils
from gensim.models.doc2vec import Doc2Vec
import gensim.models.doc2vec
from gensim.models.doc2vec import LabeledSentence
from boto.emr.emrobject import KeyValue
def readAllFiles(path):
dirs = os.listdir( path )
for file in dirs:
if os.path.isfile(path+"/"+file):
prepareDoc2VecSetting(path+'/'+file)
else:
pf=path+"/"+file
readAllFiles(pf)
def prepareDoc2VecSetting (fname):
mapDocName_Id=[]
keyValues=set()
with open(fname) as alldata:
a= alldata.readlines()
end=len(a)
label=0
tokens=[]
for i in range(0,end):
if a[i].startswith('clueweb09-en00'):
mapDocName_Id.insert(label,a[i])
label=label+1
alldocs.append(LabeledSentence(tokens[:],[label]))
keyValues |= set(tokens)
tokens=[]
else:
tokens=tokens+a[i].split()
mydb.insertkeyValueData(keyValues)
mydb.insertDocId(mapDocName_Id)
mydb=MySQLRepository.MySQLRepository()
alldocs = []
pth='/home/flr/Desktop/newInput/tokens'
readAllFiles(ipth)
model = Doc2Vec(alldocs, size = 300, window = 5, min_count = 2, workers = 4)
model.save(pth+'/my_model.doc2vec')
第二个代码:(我没有考虑与DB相关的部分)
import gensim
import os
from gensim.models.doc2vec import Doc2Vec
import gensim.models.doc2vec
from gensim.models.doc2vec import LabeledSentence
class prepareAllDocs(object):
def __init__(self, top_dir):
self.top_dir = top_dir
def __iter__(self):
mapDocName_Id=[]
label=1
for root, dirs, files in os.walk(top_directory):
for fname in files:
print fname
inputs=[]
tokens=[]
with open(os.path.join(root, fname)) as f:
for i, line in enumerate(f):
if line.startswith('clueweb09-en00'):
mapDocName_Id.append(line)
if tokens:
yield LabeledSentence(tokens[:],[label])
label+=1
tokens=[]
else:
tokens=tokens+line.split()
yield LabeledSentence(tokens[:],[label])
pth='/home/flashkar/Desktop/newInput/tokens/'
allDocs = prepareAllDocs('/home/flashkar/Desktop/newInput/tokens/')
for doc in allDocs:
model = Doc2Vec(allDocs, size = 300, window = 5, min_count = 2, workers = 4)
model.save(pth+'/my_model.doc2vec')
这是错误:
Traceback(最近一次调用最后一次):文件 " /home/flashkar/git/doc2vec_annoy/Doc2Vec_Annoy/KNN/testiterator.py" ;, 第44行,在 model = Doc2Vec(allDocs,size = 300,window = 5,min_count = 2,> workers = 4)文件 " /home/flashkar/anaconda/lib/python2.7/site->封装/ gensim /模型/ doc2vec.py&#34 ;, 第618行,在 init 中 self.build_vocab(documents,trim_rule = trim_rule)文件>" /home/flashkar/anaconda/lib/python2.7/site-> packages / gensim / models / word2vec.py", 第523行,在build_vocab中 self.scan_vocab(sentences,progress_per = progress_per,> trim_rule = trim_rule)#initial survey File " /home/flashkar/anaconda/lib/python2.7/site->封装/ gensim /模型/ doc2vec.py&#34 ;, 第655行,在scan_vocab中 for document_no,enumerate(documents)中的文档:文件>" /home/flashkar/git/doc2vec_annoy/Doc2Vec_Annoy/KNN/testiterator.py", 第40行, iter yield LabeledSentence(tokens [:],tpl 1)IndexError:列表索引超出范围
答案 0 :(得分:1)
您正在使用生成器功能,因为您不想存储所有文档,但您仍然将所有文档存储在alldocs
中。你可以yield LabeledSentence(tokens[:], tpl[1]]))
。
目前正在发生的事情是您要附加到列表并返回列表。这就是你得到AttributeError的原因。此外,在每次迭代中,您将附加到列表中,这意味着在每次迭代时,i,您将返回i和我之前的所有文档!