![](/img/trans.png)
[英]python 2.6 TypeError: coercing to Unicode: need string or buffer, list found
[英]python gensim TypeError: coercing to Unicode: need string or buffer, list found
因此,我相信尽管这是许多类似问题(特别是关于stackoverflow的常见问题),但在每种情况下,此问题背后的主要原因
就我而言,我有一个名为readCorpus
的方法( 在下面找到代码 ),它读取21个文件的列表,从每个文件中提取文档,然后产生它们
屈服操作发生在读取每个文件的末尾
我有另一个名为uploadCorpus
方法( 在下面找到代码 )。 这种方法的主要目的是上载该语料库。
显然,使用yield的主要原因是语料库可能很大,我只需要阅读一次即可。
一旦运行方法uploadCorpus
我将收到以下错误
TypeError: coercing to Unicode: need string or buffer, list found
错误发生在self.readCorpus()])
。
读过类似的问题,我才明白,当列表放错位置时就会发生这种情况..我试图将此处的问题线更新为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 = []
下面的行期望一个可迭代的对象..假设readCorpus
函数是使用关键字yield
的生成器
self.readCorpus()
但是,由于yield
关键字的实现不佳,因此readCorpus
函数的行为与生成器的方式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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.