2016-11-16 11 views
0

Так что я считаю, несмотря на это время общей проблемы со многими подобными вопросами (особенно на StackOverflow), основная причина этого вопроса зависит в каждом конкретном случаепитон gensim TypeError: принуждать к Unicode: нужна строка или буфер, список найден

В моем случае у меня есть метод, называемый readCorpus (находка код ниже) считывает список из 21 файлов, извлекать документы из каждого файла затем дают им

операция выхода происходит в конце чтения каждого файла

У меня есть другой метод с именем uploadCorpus (найти код ниже). Основная цель этого метода - загрузить этот корпус.

Очевидно, что основной причиной использования урожая является то, что корпус может быть очень большим, и мне нужно его только раз читать.

После того, как я бегу метод uploadCorpus я получаю ошибку ниже

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

В erros происходит на линии 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)