You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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)

关键修改点说明

  1. 过滤空值:通过df.dropna(subset=['rev'])直接移除rev列为空的行,彻底避免NaN进入训练列表。
  2. 字符串转列表:用ast.literal_eval()将Excel中存储的字符串列表转换为Python实际的列表对象,确保模型能正确迭代每个词。
  3. 异常处理:加入try-except块捕获格式异常的评论,防止单个错误数据导致整个训练流程中断。
  4. 简化训练调用:Gensim的Word2Vec初始化时传入sentences参数会自动完成训练,无需额外调用train()(增量训练场景除外)。

额外检查建议

  • 可以先打印xp的前几个元素,确认每个元素都是词列表,没有float或单个字符串:
    print(xp[:3])
    
  • 检查Excel的rev列是否存在格式不一致的内容,比如部分空值、部分纯文本(非列表格式),这些都需要提前处理。

内容的提问来源于stack exchange,提问作者user10702710

火山引擎 最新活动