0

由于我在此页面中提出的问题,我的代码内存不足。然后,我编写了第二个代码来获得一个 iterable alldocs,而不是一个 all-in-memory alldocs。我根据this page的解释更改了我的代码。我不熟悉流概念,我无法解决我得到的错误。

此代码读取给定路径的所有文件夹的所有文件。每个文件的上下文由两行文件名及其上下文组成。例如:

线索网09-en0010-07-00000

鸽子 gif 剪贴画 鸽子 剪贴画 图片 图像 hiox 免费 鸟类 印度 网络 图标 剪贴画 添加 偶然发现

线索web09-en0010-07-00001

google 书签 yahoo 书签 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')

这是错误:

回溯(最后一次调用):文件“/home/flashkar/git/doc2vec_annoy/Doc2Vec_Annoy/KNN/testiterator.py”,第 44 行,模型 = Doc2Vec(allDocs, size = 300, window = 5, min_count = 2, >workers = 4) 文件“/home/flashkar/anaconda/lib/python2.7/site->packages/gensim/models/doc2vec.py”,第 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) # 初始调查文件“/home/flashkar/anaconda/lib/python2.7/site->packages/gensim/models/doc2vec.py”,第 655 行,在 scan_vocab 中为 document_no,枚举中的文档(文档):文件>“/home/flashkar/git/doc2vec_annoy/Doc2Vec_Annoy/KNN/testiterator.py”,第 40 行,在迭代中 产生 LabeledSentence(tokens[:],tpl 1 ) IndexError: list index out of范围

4

1 回答 1

1

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

当前正在发生的是您正在附加到列表并返回列表。这就是您收到 AttributeError 的原因。此外,在每次迭代中,您都将附加到列表中,这意味着在每次迭代中,i,您将返回 i 和 i 之前的所有文档!

于 2017-02-21T17:40:35.200 回答