2016-11-16 53 views
0

所以我認爲儘管這是與許多類似的問題(特別是在計算器)的共同問題,這背後的問題的主要原因在每種情況下不同蟒蛇gensim類型錯誤:強迫爲Unicode:需要字符串或緩衝區,列表中找到

在我來說,我有一個名爲方法readCorpus(以下查找代碼),它讀取的21個文件的列表,每個文件提取文檔,然後得到他們

在讀取每個文件

結束時發生的屈服操作

我有另一種方法uploadCorpus查找代碼低於)。這種方法的主要目的是上傳該語料庫。

很顯然,使用yield的主要原因是語料庫可能非常大,我只需要閱讀一次。

一旦我運行的方法uploadCorpus我接收低於

TypeError: coercing to Unicode: need string or buffer, list found

的誤差修改錯誤發生在線路self.readCorpus()])

閱讀中,我才明白,當一個列表放錯了地方發生類似的問題。我想在這裏uplate問題的行docs for docs in self.readCorpus()])但我同樣的問題

我的代碼(uploadCorpus)結束

def uploadCorpus(self): 
     #convert docs to corpus 
     print "uploading" 

     utils.upload_chunked(
      self.service, 
      [{'id': 'doc_%i' % num, 'tokens': utils.simple_preprocess(doc)} 
      for num, doc in enumerate([ 
       self.readCorpus()]) 
       ], 
      chunksize=1000) # send 1k docs at a time 

我的代碼readCorpus()

def readCorpus(self): 
    path = '../data/reuters' 
    doc='' 
    docs = [] 
    docStart=False 

    fileCount=0 

    print 'Reading Corpus' 
    for name in glob.glob(os.path.join(path, '*.sgm')): 
     print 'Reading File| ' + name 
     docCount=0 
     for line in open(name): 
      if(len(re.findall(r'<BODY>', line)) > 0): 
       docStart = True 
       pattern = re.search(r'<BODY>.*', line) 
       doc+= pattern.group()[6:] 

      if(len(re.findall(r'</BODY>\w*', line)) > 0): 
       docStart = False 
       docs.append(doc) 
       doc='' 
       docCount+=1 
       continue 
       #break 
      if(docStart): 
       doc += line 

     fileCount+=1 
     print 'docuemnt[%d][%d]'%(fileCount,docCount) 
     yield docs 
     docs = [] 
+0

嘗試'包裹在圍繞上傳您的列表json.dumps'分塊功能。這會將您的列表轉換爲字符串並使其兼容上傳。 – kpie

+0

@kpie我仍然有同樣的錯誤 –

回答

0

該線以下期待可迭代對象..其中readCorpus功能應該是一個發電機使用關鍵字yield

self.readCorpus() 

然而readCorpus功能沒有表現的發電機被認爲是因爲這樣yield關鍵字的執行效果很差。

當前的實現會在每1000次循環迭代中生成一個項目數組,而正確的方式是逐項生成項目。

因此,readCorpus需要修改如下

def readCorpus(self): 
     path = '../data/reuters' 
     doc='' 
     docStart=False 

     fileCount=0 

     print 'Reading Corpus' 
     for name in glob.glob(os.path.join(path, '*.sgm')): 
      print 'Reading File| ' + name 
      docCount=0 
      for line in open(name): 
       if(len(re.findall(r'<BODY>', line)) > 0): 
        docStart = True 
        pattern = re.search(r'<BODY>.*', line) 
        doc+= pattern.group()[6:] 

       if(len(re.findall(r'</BODY>\w*', line)) > 0): 
        docStart = False 
        #docs.append(doc) 
        yield doc 
        doc='' 
        docCount+=1 
        continue 
        #break 
       if(docStart): 
        doc += line 

      fileCount+=1 
      print 'docuemnt[%d][%d]'%(fileCount,docCount) 
相關問題