如何通过使用“可迭代”来构建Doc2Vec模型。对象

时间:2017-02-21 16:07:53

标签: python iterator gensim doc2vec

由于我在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:列表索引超出范围

1 个答案:

答案 0 :(得分:1)

您正在使用生成器功能,因为您不想存储所有文档,但您仍然将所有文档存储在alldocs中。你可以yield LabeledSentence(tokens[:], tpl[1]]))

目前正在发生的事情是您要附加到列表并返回列表。这就是你得到AttributeError的原因。此外,在每次迭代中,您将附加到列表中,这意味着在每次迭代时,i,您将返回i和我之前的所有文档!