使用Gensim训练Word2Vec模型时遇TypeError错误求助
解决Gensim Word2Vec训练时的TypeError: 'float' object is not iterable问题
问题原因分析
你碰到的这个错误,核心问题出在xp列表里混入了float类型的NaN值。Word2Vec要求训练数据是嵌套列表——外层列表的每个元素必须是可迭代的词列表,但当你的代码读取到Excel中rev列的空单元格时,pandas会把它解析成NaN(属于float类型),你直接将这个NaN追加到xp后,模型遍历训练数据时试图迭代这个float对象,自然就触发了TypeError: 'float' object is not iterable。
另外补充一点:从你给出的示例格式来看,rev列的内容是字符串形式的列表(比如"['intrepid', 'bumbling', ...]"),原代码直接把这个字符串追加到xp也有问题——模型需要的是实际的列表对象,而非字符串。不过这次报错的直接诱因是NaN,我们先解决这个核心问题,再处理字符串转列表的问题。
修正后的代码
import gensim import logging import pandas as pd from ast import literal_eval # 用于将字符串形式的列表转换为实际列表 # 读取Excel数据 file = r'FileNamelast.xlsx' df = pd.read_excel(file, sheet_name='FileNamex') # 过滤rev列的空值,从根源避免NaN混入 df = df.dropna(subset=['rev']).reset_index(drop=True) xp = [] # 遍历处理每条评论 for idx in range(len(df)): rev_content = df.loc[idx, 'rev'] # 将字符串形式的列表转为实际列表对象 try: word_list = literal_eval(rev_content) xp.append(word_list) except (SyntaxError, ValueError): # 处理格式异常的评论,避免中断训练 print(f"第{idx}条评论格式异常,已跳过: {rev_content}") continue # 训练Word2Vec模型 model = gensim.models.Word2Vec( xp, size=150, window=10, min_count=2, workers=10, epochs=10 ) # 注意:Gensim的Word2Vec初始化时传入sentences会自动完成训练,无需单独调用train() # 若需增量训练,再使用train()并确保epochs参数匹配: # model.train(xp, total_examples=len(xp), epochs=model.epochs)
关键修改点说明
- 过滤空值:通过
df.dropna(subset=['rev'])直接移除rev列为空的行,彻底避免NaN进入训练列表。 - 字符串转列表:用
ast.literal_eval()将Excel中存储的字符串列表转换为Python实际的列表对象,确保模型能正确迭代每个词。 - 异常处理:加入try-except块捕获格式异常的评论,防止单个错误数据导致整个训练流程中断。
- 简化训练调用:Gensim的
Word2Vec初始化时传入sentences参数会自动完成训练,无需额外调用train()(增量训练场景除外)。
额外检查建议
- 可以先打印
xp的前几个元素,确认每个元素都是词列表,没有float或单个字符串:print(xp[:3]) - 检查Excel的
rev列是否存在格式不一致的内容,比如部分空值、部分纯文本(非列表格式),这些都需要提前处理。
内容的提问来源于stack exchange,提问作者user10702710




