2017-02-21 17 views
0

this pageで質問したため、コードのメモリが不足しています。次に、2番目のコードを作成して、すべてのメモリがalldocsではなく、反復可能なコードalldocsを作成しました。 this pageの説明に基づいてコードを変更しました。私はストリームコンセプトに精通していないし、私は私が得たエラーを解決することができませんでした。'iterable'オブジェクトを使用してDoc2Vecモデルを構築するには

このコードでは、ドキュメント名で構成されている各ファイルの特定のpath.Theコンテキストのすべてのフォルダのすべてのファイルを読み込み、インスタンスlines.For 2でそのコンテキスト:

clueweb09-en0010-07-00000

dove gif clipart pigeon clip art picture image hiox free birds india web icons clipart add stumble upon

clueweb09-en0010-07-00001

google bookmarks yahoo bookmarks php script java script jsp script licensed scripts html tutorials css tutorials

まずコード:

# 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 (most recent call last): File "/home/flashkar/git/doc2vec_annoy/Doc2Vec_Annoy/KNN/testiterator.py", line 44, in model = Doc2Vec(allDocs, size = 300, window = 5, min_count = 2, >workers = 4) File "/home/flashkar/anaconda/lib/python2.7/site->packages/gensim/models/doc2vec.py", line 618, in init self.build_vocab(documents, trim_rule=trim_rule) File >"/home/flashkar/anaconda/lib/python2.7/site->packages/gensim/models/word2vec.py", line 523, in build_vocab self.scan_vocab(sentences, progress_per=progress_per, >trim_rule=trim_rule) # initial survey File "/home/flashkar/anaconda/lib/python2.7/site->packages/gensim/models/doc2vec.py", line 655, in scan_vocab for document_no, document in enumerate(documents): File >"/home/flashkar/git/doc2vec_annoy/Doc2Vec_Annoy/KNN/testiterator.py", line 40, in iter yield LabeledSentence(tokens[:],tpl 1) IndexError: list index out of range

+0

あなたの「2番目のコード」は適切なトラックにありますが、(1)すべての 'line'を' mapDocName_Id'に追加しています。 (2)ループの繰り返しの前に '[]'に設定されているので、 'tokens'がテストしているところで空でないことは不可能です。何も返さないでしょう。 (3)あなたは今、2つのリストではなく、LabeledSentenceに1つのタプルを渡しています。 (4) 'alldocs'を自分でループする必要はありません。正しく動作しているときは' alldocs'をDoc2Vecに一度だけ渡します。 – gojomo

答えて

1

、あなたのすべてのドキュメントを保存したくないので、あなたはジェネレータ関数を使用していますが、あなたはまだalldocsであなたのすべての文書を格納しています。ちょうどyield LabeledSentence(tokens[:], tpl[1]]))です。

現在、リストに追加してリストを返すことが起こっています。これがAttributeErrorを取得している理由です。さらに、各繰り返しで、リストに追加しています。つまり、各繰り返しで、iとiの前に来たすべてのドキュメントを返すことになります。

+0

私は自分のコードを更新しましたが、私は新しいエラーを受け取りました。また、あなたの答えの後半部分についてもっと説明できますか?私はそれを手に入れることができませんでした。 – user3092781

+0

私はあなたがまずあなたのコードをデバッグしようとすると、本当に特定の問題に立ち往生したときに来るべきだと思います。正しい方向を指すためには、prepareAllDocsのiter_documentとiterをマージしてより簡単にする必要があります。また、Pythonで列挙をチェックアウトして、readlines()ですべてのデータを読む必要はなく、iter_documentでラベルをインクリメントする必要はありません。 – aberger

+0

デバッグしようとしましたが、問題が見つかりました。なぜあなたは_readlines()_の代わりに一行ずつ読むのですか? – user3092781

関連する問題