python gensim TypeError: coercing to Unicode: need string or buffer, list found
python gensim TypeError: coercing to Unicode: need string or buffer, list found
所以我相信尽管这是许多类似问题的常见问题(尤其是在 Whosebug 上),但这个问题背后的主要原因因情况而异
在我的例子中,我有一个名为 readCorpus
的方法(在下面查找代码)它读取 21 个文件的列表,从每个文件中提取文档然后生成它们
yield操作发生在读取每个文件结束时
我有另一个名为 uploadCorpus
的方法(在下面查找代码)。此方法的主要目的是上传该语料库。
显然使用 yield 的主要原因是语料库可以非常大,我只需要阅读一次。
一旦我运行方法uploadCorpus
我收到下面的错误
TypeError: coercing to Unicode: need string or buffer, list found
错误发生在self.readCorpus()])
行。
阅读类似的问题后,我了解到当列表放错位置时会发生这种情况。我试图将此处的问题行更新为 docs for docs in self.readCorpus()])
,但我以同样的问题结束
我的代码(上传语料库)
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 = []
下面的行需要一个可迭代对象.. 其中 readCorpus
函数应该是一个使用关键字 yield
的生成器
self.readCorpus()
但是,由于 yield
关键字的实施不当,readCorpus
函数的行为方式与生成器的行为方式不同。
当前实现每 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)
所以我相信尽管这是许多类似问题的常见问题(尤其是在 Whosebug 上),但这个问题背后的主要原因因情况而异
在我的例子中,我有一个名为 readCorpus
的方法(在下面查找代码)它读取 21 个文件的列表,从每个文件中提取文档然后生成它们
yield操作发生在读取每个文件结束时
我有另一个名为 uploadCorpus
的方法(在下面查找代码)。此方法的主要目的是上传该语料库。
显然使用 yield 的主要原因是语料库可以非常大,我只需要阅读一次。
一旦我运行方法uploadCorpus
我收到下面的错误
TypeError: coercing to Unicode: need string or buffer, list found
错误发生在self.readCorpus()])
行。
阅读类似的问题后,我了解到当列表放错位置时会发生这种情况。我试图将此处的问题行更新为 docs for docs in self.readCorpus()])
,但我以同样的问题结束
我的代码(上传语料库)
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 = []
下面的行需要一个可迭代对象.. 其中 readCorpus
函数应该是一个使用关键字 yield
self.readCorpus()
但是,由于 yield
关键字的实施不当,readCorpus
函数的行为方式与生成器的行为方式不同。
当前实现每 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)