doc2bow报错求助:期望Unicode词元数组而非单个字符串
解决
TypeError: doc2bow expects an array of unicode tokens on input, not a single string问题 嘿,我看到你卡在这个报错上了,咱们来一步步拆解问题根源,然后搞定它!
错误核心原因
gensim的corpora.Dictionary和doc2bow方法,本质上是为文档集合设计的——它们期望接收的是「多个文档的词元列表组成的列表」,而不是单个词元的列表。你之前的代码里,直接把单个文档的词元列表传给了Dictionary,相当于告诉它“这里有N个独立文档,每个文档只有1个词”,这就触发了类型错误。
你的代码问题点
看这段关键代码:
tokens = tokenizer.tokenize(processed_txt) dictionary = corpora.Dictionary(tokens) # 这里错了!
tokens是类似["stemmed_word1", "stemmed_word2", ...]的单文档词元列表,而Dictionary需要的是[[word1, word2], [word3, word4]]这种多文档结构——哪怕你只有1个文档,也得把它套进一个外层列表里。
另外你注释掉的语料库生成代码也有问题:
# corpus = [dictionary.doc2bow(text) for text in tokens]
这里text会遍历每个单独的词,相当于给每个词生成词袋向量,这显然不是你想要的,应该把整个文档的词元列表传给doc2bow。
修正后的完整代码
我还优化了你的预处理逻辑(用列表存词元比字符串拼接更高效):
# 替换原字符串拼接,改用列表存储处理后的词元 processed_tokens = [] for r in words: if r not in stop_words: # 去掉多余的str转换,ps.stem返回的本身就是字符串 processed_tokens.append(ps.stem(r)) tokenizer = RegexpTokenizer(r'\w+') # 如果processed_tokens已经是干净的词元,这一步可以直接跳过,用processed_tokens作为tokens tokens = tokenizer.tokenize(' '.join(processed_tokens)) # 关键修正:把单文档词元列表套进外层列表,告诉Dictionary这是一个文档 dictionary = corpora.Dictionary([tokens]) # 生成语料库的正确方式:传入整个文档的词元列表 corpus = [dictionary.doc2bow(tokens)] print(dictionary) print(corpus)
额外小提示
如果你的words本身已经是拆分好的词元,那RegexpTokenizer这一步其实可以省略,直接用processed_tokens作为tokens即可,能减少不必要的字符串操作开销。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

