You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:56:11