基于Amazon评论数据集,Word2Vec结合TF-IDF遇NaN值问题求助
解决Word2Vec与TF-IDF结合时出现NaN值的问题
嘿,我来帮你搞定这个问题!你遇到的invalid value encountered in true_divide报错和所有sent_vec都是NaN的情况,核心原因很明确:你的weight_sum变量在某些句子里变成了0,导致执行sent_vec /= weight_sum时触发了除以0的操作,直接生成了NaN。咱们一步步拆解原因,再给出针对性的修复方案:
问题根源拆解
- 情况一:某个句子里的所有词,要么不在Word2Vec模型的词汇表中,要么对应的TF-IDF值为0,最终导致
weight_sum累加后还是0,除以0就会得到NaN。 - 情况二:
list_of_sent和final_data['CleanedText']的顺序不匹配,导致遍历的句子和TF-IDF矩阵的行对应不上,也会出现大量找不到词、权重为0的情况。
修复方案与优化代码
我给你调整了代码,既解决了除以0的问题,还优化了效率:
1. 先校验数据一致性
首先确保你的句子列表和TF-IDF矩阵的行数完全匹配,避免行对应错误:
assert len(list_of_sent) == final_tf_idf.shape[0], "句子列表和TF-IDF矩阵的行数不匹配!"
2. 修改核心循环逻辑
把原来的循环改成下面这样,重点处理weight_sum为0的场景,同时优化词索引的查找效率:
# 提前把TF-IDF特征名转成字典,提升查找速度(比list.index()快很多) tfidf_word_to_idx = {word: idx for idx, word in enumerate(tfidf_feat)} vector_dim = 50 # 和你的Word2Vec向量维度保持一致 tfidf_sent_vectors = [] row = 0 for sent in list_of_sent: sent_vec = np.zeros(vector_dim) weight_sum = 0.0 for word in sent: # 跳过不在Word2Vec词汇表中的词 if word not in w2v_model.wv: continue # 获取词在TF-IDF中的索引,不存在则跳过 word_idx = tfidf_word_to_idx.get(word) if word_idx is None: continue # 获取该词的TF-IDF值,为0则跳过 tfidf_val = final_tf_idf[row, word_idx] if tfidf_val == 0: continue # 累加加权后的词向量和权重总和 sent_vec += w2v_model.wv[word] * tfidf_val weight_sum += tfidf_val # 处理权重总和为0的情况,避免除以0 if weight_sum != 0: sent_vec /= weight_sum else: # 可选方案1:如果句子里有有效Word2Vec词,用平均词向量代替 valid_word_vecs = [w2v_model.wv[word] for word in sent if word in w2v_model.wv] if valid_word_vecs: sent_vec = np.mean(valid_word_vecs, axis=0) # 可选方案2:直接保留全0向量(如果没有有效词) tfidf_sent_vectors.append(sent_vec) row += 1
3. 额外优化建议
- 预处理文本时,可以过滤掉停用词和极低频率的词,减少无效词的数量,提升
weight_sum不为0的概率。 - 如果你的Word2Vec模型是用当前数据集训练的,可以检查一下训练时的参数(比如最小词频),避免漏掉太多常见词。
这样修改后,你就不会再遇到除以0的报错,NaN值的问题也能彻底解决啦!
内容的提问来源于stack exchange,提问作者kunwarvikrant
相关产品推荐
相关产品推荐

