使用Gensim Word2Vec实现嵌入层时遇'int不可迭代'错误求助
解决Gensim Word2Vec嵌入层的TypeError问题
先把你的错误核心拆解清楚:TypeError: 'int' object is not iterable,这个问题完全是参数传错和变量混淆导致的,咱们一步步来修复:
1. 定位错误的直接诱因
看你调用train_word2vec的代码:
embedding_weights = train_word2vec(y_train, vocab['w2idx'], num_features=embedding_dim, min_word_count=min_word_count, context=context)
再对比函数定义的参数列表:
def train_word2vec(sentence_matrix, vocabulary_inv, num_features=300, min_word_count=1, context=10):
你犯了两个致命的参数传递错误:
- 第一个参数传成了
y_train(标签数据),但函数需要的是训练用的文本索引矩阵X_train(每个元素是由单词索引组成的句子列表,比如[[0,1,2], [3,4], ...]); - 第二个参数传成了
vocab['w2idx'](word到idx的映射,比如{'hello': 0, 'world':1}),但函数需要的是idx到word的映射vocab['idx2w'](比如{0: 'hello', 1: 'world'})。
这就导致函数里的vocabulary_inv.items()遍历出来的word变量其实是整数类型的索引,而Gensim的Word2Vec模型只接受字符串类型的词作为查询参数。当你传入整数时,它会错误地尝试把这个整数当成可迭代对象遍历(比如像列表那样逐个取元素),于是就抛出了int不可迭代的错误。
2. 修复参数传递问题
先修正调用train_word2vec的代码,把参数传对:
# 注意:第一个参数是训练文本索引矩阵X_train,第二个是idx到word的映射vocab['idx2w'] embedding_weights = train_word2vec(X_train, vocab['idx2w'], num_features=embedding_dim, min_word_count=min_word_count, context=context)
这里的X_train必须是你清洗文本后,将每个句子转换成单词索引序列的二维数组,绝对不能用标签数据y_train。
3. 修复函数内的潜在bug
再看train_word2vec函数里的一行错误代码:
pyplot.scatter(embedding_model)
matplotlib.pyplot.scatter需要传入x和y坐标,直接传Word2Vec模型会报错,建议删除这行,或者换成可视化词向量的正确代码(比如用PCA降维后再绘图):
# 替换掉原来的pyplot.scatter(embedding_model) from sklearn.decomposition import PCA # 取出词向量和对应的词 words = list(embedding_model.wv.vocab.keys()) vectors = embedding_model.wv[words] # PCA降维到2D pca = PCA(n_components=2) reduced_vectors = pca.fit_transform(vectors) # 绘图(只画前50个词避免太拥挤) pyplot.figure(figsize=(10,10)) for i, word in enumerate(words[:50]): pyplot.scatter(reduced_vectors[i,0], reduced_vectors[i,1]) pyplot.text(reduced_vectors[i,0]+0.01, reduced_vectors[i,1]+0.01, word) pyplot.show()
4. 验证修复效果
修正后,函数里生成embedding_weights的代码就能正常工作了:
vocabulary_inv是idx到word的映射,所以word是字符串类型的合法词;embedding_model[word]会正确取出该词对应的词向量,不会再出现类型错误。
内容的提问来源于stack exchange,提问作者Hai.ha
相关产品推荐
相关产品推荐

