使用Gensim匹配预训练Word2Vec词表时出现NameError求助
问题解决
错误原因
你的列表推导式循环顺序完全颠倒了,Python会从左到右执行列表推导式的循环,原代码里[i for i in j for j in x]先尝试遍历j,但此时j还未被定义,直接触发NameError。另外原代码会把所有嵌套的词扁平化,不符合你需要保留原嵌套结构的需求,同时没处理nan元素。
修正方案
首先将词表转为集合(提升查找效率),然后按原嵌套层级依次过滤:
import gensim import numpy as np # 加载预训练模型 pretrained_model = gensim.models.KeyedVectors.load_word2vec_format('Downloads/GoogleNews-vectors-negative300.bin', binary=True) # 转为集合,加快存在性判断 vocab_set = set(pretrained_model.key_to_index.keys()) documents = [] for group in result: filtered_group = [] for item in group: # 跳过nan元素 if isinstance(item, list): # 过滤不在词表中的词 filtered_words = [word for word in item if word in vocab_set] # 仅保留非空的子列表(如果需要保留空列表可去掉此判断) if filtered_words: filtered_group.append(filtered_words) documents.append(filtered_group)
也可以用嵌套列表推导式简化写法:
documents = [ [ [word for word in sublist if word in vocab_set] for sublist in group if isinstance(sublist, list) ] for group in result ]
效果验证
运行后documents的结构将完全符合你的期望:
[[['apple'], ['banana'], ['green','grapes']], [['orange'], ['hat'], ['party','hat']], [['blue'], ['navy'], ['red','t'], ['angry']]]
内容的提问来源于stack exchange,提问作者Mimieffle
相关产品推荐
相关产品推荐

