2016-11-16 79 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) 
相关问题