【问题标题】:python gensim TypeError: coercing to Unicode: need string or buffer, list foundpython gensim TypeError:强制转换为Unicode:需要字符串或缓冲区,找到列表
【发布时间】:2017-03-31 07:08:46
【问题描述】:

因此,我相信尽管这是许多类似问题的常见问题(尤其是在 stackoverflow 上),但此问题背后的主要原因在每种情况下各不相同

在我的例子中,我有一个名为 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 = []

【问题讨论】:

  • 尝试在上传分块功能中将json.dumps 包裹在您的列表周围。这会将您的列表转换为字符串并使其与上传兼容。
  • @kpie 我仍然遇到同样的错误

标签: python python-2.7 typeerror iterable gensim


【解决方案1】:

下面的行需要一个可迭代的对象.. 其中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)

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2015-02-01
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多