2015-11-10 43 views
0

我正努力從sqlalchemy的查詢創建迭代器。作爲迭代器的sqlachemy查詢的結果

這裏是我試過到目前爲止

創建一個表

from sqlalchemy import create_engine, Column, MetaData, Table , Integer, String 
engine = create_engine('sqlite:///test90.db') 
conn = engine.connect() 
metadata = MetaData() 
myTable = Table('myTable', metadata, 
    Column('Doc_id', Integer, primary_key=True), 
    Column('Doc_Text', String)) 
metadata.create_all(engine) 

conn.execute(myTable.insert(), [{'Doc_id': 1, 'Doc_Text' : 'first sentence'}, 
      {'Doc_id': 2, 'Doc_Text' : 'second sentence'}, 
      {'Doc_id': 3, 'Doc_Text' : 'third sentence'}, 
      {'Doc_id': 4, 'Doc_Text' : 'fourth sentence'} 
      ]) 

我讀了迭代器盡我所能,但不明白這一點。 這裏的I類創建得到一個迭代器,但它不工作 (溢出,雖然我指定休息)

from sqlalchemy import create_engine 

class RecordsIterator: 
def __init__(self, xDB, xSQL): 
    self.engine = create_engine(xDB) 
    self.conn = self.engine.connect() 
    self.xResultCollection = self.conn.execute(xSQL) 
def __iter__(self): 
    return self 
def next (self): 
    while self.xResultCollection.closed is False: 
     xText = (self.xResultCollection.fetchone())[1] 
     xText = xText.encode('utf-8') 
     yield xText.split() 
     if not self.xResultCollection: 
      break 


x1 = RecordsIterator(xDB = 'sqlite:///test91.db', xSQL = 'select * from myTable') 

如果你想知道爲什麼我不只是使用發電機。 我需要養活的gensim.Word2Vec迭代器不幸的是,它並不需要一臺發電機

import gensim 
    gensim.models.Word2Vec(x1) 

在此先感謝

+0

謝謝。看編輯。 gensim不會接受它或我錯過了什麼? – user1043144

+0

發佈了一個anser--正如我從快速瀏覽Word2Vec的源頭所看到的那樣,問題是生成器被明確禁止作爲'句子'參數。可能有一些我無法看到的原因,因爲它不應該真的有所作爲。也許它與C優化有關... – mata

+0

謝謝。你的解決方案有效我認爲在gensim word2vec教程中存在一個問題http://rare-technologies.com/word2vec-tutorial/ – user1043144

回答

1

你的檢查if not self.xResultCollection總是會返回False,作爲結果對象的truth value會永遠是True

在你的next方法中,你有一個for和while循環,這實際上不需要,next方法應該只返回一個元素,不需要循環。

由於self.xResultCollection本身就是一個迭代,你可以只是做:

class RecordsIterator: 
    def __init__(self, xDB, xSQL): 
     self.engine = create_engine(xDB) 
     self.conn = self.engine.connect() 
     self.resultIterator = iter(self.conn.execute(xSQL)) 
    def __iter__(self): 
     return self 
    def next (self): 
     return next(self.resultIterator)[1].encode('utf-8').split() 
0

對於那些熱衷於使用這種具有gensim。

事實證明,問題是gensim需要一個迭代器,我們可以返回它(遍歷查詢遊標的結果,消耗它)。

見討論here

這是似乎爲我

import gensim 
from sqlalchemy import create_engine 


xDB = 'sqlite:///test91.db' 
xSQL = 'select * from myTable' 
engine = create_engine(xDB) 
conn = engine.connect() 
xResultIterator = conn.execute(xSQL) 


class MyIterator(object): 
def __init__(self, xResults, xNrCol): 
    self.xResults = xResults 
    self.xNrCol = xNrCol 
def __iter__(self): 
    for xRecord in self.xResults: 
     xText = (xRecord[self.xNrCol]).lower().encode('utf8') 
     xToken = xText.split() 
     if not xToken: 
      continue 
     yield xToken 
    self.xResults = conn.execute(xSQL) ### THIS SEEMS TO FIX IT 


#to use    

q1 = MyIterator(xResultIterator, xNrCol = 1) 
model = gensim.models.Word2Vec(sentences = q1 , min_count = 1) 

這裏的詞彙

model.vocab.keys() 

工作,我與1萬個條目的(標題的PostgreSQL可以運行在這科學論文)在大約90秒內沒有問題 我希望這會幫助別人