Word2Vec平均嵌入数组长度与语料行数不匹配问题排查
问题原因与修复方案
问题原因
你的final_embeddings长度比flatten_corpus少,核心原因是存在部分评论的所有词汇都不在Word2Vec模型的词汇表vocabulary中。
在现有代码逻辑里,这类评论循环结束后avg_embeddings会保持None,无法触发if avg_embeddings is not None的判断,因此不会被添加到final_embeddings列表中,最终导致结果数组长度小于原语料行数。
另外代码还有一个隐藏错误:计算平均时用了avg_embeddings / len(avg_embeddings),这里len(avg_embeddings)是词嵌入的维度(比如常见的300),而非这条评论中有效词汇的数量,会导致嵌入向量被错误缩放。
修复方案
要让结果数组长度和原语料一致,需要处理无有效词汇的评论,同时修正平均计算的错误:
import numpy as np # Building vocabulary vocabulary = set(model.wv.index_to_key) embedding_dim = model.wv.vector_size # 获取词嵌入的维度,比如300 final_embeddings = [] for comment_words in flatten_corpus: avg_embeddings = None valid_word_count = 0 # 统计评论中在词汇表里的单词数量 for word in comment_words: if word in vocabulary: valid_word_count += 1 if avg_embeddings is None: avg_embeddings = model.wv[word].copy() # 避免修改模型原向量 else: avg_embeddings += model.wv[word] # 处理两种情况:有有效词汇/无有效词汇 if avg_embeddings is not None: avg_embeddings = avg_embeddings / valid_word_count # 除以有效词数量 else: avg_embeddings = np.zeros(embedding_dim) # 用全零向量填充无有效词的评论 final_embeddings.append(avg_embeddings)
关键修改点
- 新增
valid_word_count统计有效词汇数量,修正平均计算的除数错误 - 对无有效词汇的评论生成全零向量(也可替换为随机向量或模型词汇表的平均向量,按需调整),确保每条评论都有对应的嵌入结果
- 给
model.wv[word]添加copy(),避免意外修改模型中的原向量
可选方案:过滤无有效词汇的评论
如果不需要保留无有效词汇的评论,可以在处理前先过滤语料:
# 过滤掉所有词汇都不在vocabulary里的评论 filtered_corpus = [words for words in flatten_corpus if any(word in vocabulary for word in words)] # 再用原逻辑处理filtered_corpus即可
内容的提问来源于stack exchange,提问作者YuvrajSingh
相关产品推荐
相关产品推荐

