Gensim4加载阿拉伯语预训练Word2Vec模型KeyError问题及修正验证
阿拉伯语预训练Word2Vec文本分类代码确认问题
我尝试使用阿拉伯语预训练Word2Vec模型完成文本分类任务,初始代码如下:
unknownArray=[] # load the whole embedding into memory w2v_embeddings_index={} w2v_model =KeyedVectors.load('/content/drive/MyDrive/PythonProjectsUtilities/full_grams_cbow_100_twitter/full_grams_cbow_100_twitter.mdl') for word in w2v_model.wv: try: w2v_embeddings_index[word] = w2v_model.wv[word] except KeyError: unknownArray.append(word) print('Loaded %s word vectors.' % len(w2v_embeddings_index)) # create a weight matrix for words in training docs embedding_matrix = np.zeros((len(word_index) + 1 , embedding_vecor_length)) for word, i in t.word_index.items(): embedding_vector = w2v_embeddings_index.get(word) if embedding_vector is not None: embedding_matrix[i] = embedding_vector print('Embedding Matrix shape:', embedding_matrix.shape)
尽管添加了异常处理,仍持续触发KeyError。于是我修改代码,仅将数据集word_index中存在的词加入w2v_embeddings_index,修改后代码如下:
w2v_embeddings_index={} embedding_matrix = np.zeros((len(word_index) + 1 , embedding_vecor_length)) w2v_model = KeyedVectors.load("/content/drive/MyDrive/PythonProjectsUtilities/full_grams_sg_100_twitter.mdl") print(len(w2v_model.wv)) for word , i in word_index.items(): if word in w2v_model.wv: w2v_embeddings_index[word] = w2v_model.wv[word] print('Loaded %s word vectors.' % len(w2v_embeddings_index)) # create a weight matrix for words in training docs for word, i in word_index.items(): embedding_vector = w2v_embeddings_index.get(word) if embedding_vector is not None: embedding_matrix[i] = embedding_vector print('Embedding Matrix shape:', embedding_matrix.shape)
我不确定修改后的代码是否正确,急需专家确认,任务需在明日交付。
代码正确性确认
修改后的代码逻辑完全正确,有效解决了初始代码的问题:
- 初始代码遍历预训练模型的所有词时触发KeyError,大概率是模型加载或版本兼容导致的异常,你的修改直接聚焦于数据集实际存在的词,从根源避免了无效的词取值操作。
- 先筛选出预训练模型中存在的数据集词汇,再构建嵌入矩阵,逻辑通顺,能确保最终的embedding_matrix只填充有效词向量,未匹配到的词保持初始零向量,符合文本分类任务中嵌入层的常规处理逻辑。
可优化的细节:
- 无需单独维护
w2v_embeddings_index字典,直接在构建嵌入矩阵时判断词汇是否存在,减少一次遍历操作,提升效率:embedding_matrix = np.zeros((len(word_index) + 1, embedding_vecor_length)) w2v_model = KeyedVectors.load("/content/drive/MyDrive/PythonProjectsUtilities/full_grams_sg_100_twitter.mdl") for word, i in word_index.items(): if word in w2v_model.wv: embedding_matrix[i] = w2v_model.wv[word] print('Embedding Matrix shape:', embedding_matrix.shape) - 注意到你两次加载的模型文件不同:初始是CBOW模型,修改后是Skip-Gram模型,若此为无意操作,需确认是否使用了任务目标对应的预训练模型。
- 无需单独维护
内容的提问来源于stack exchange,提问作者Arwa Ahmed
相关产品推荐
相关产品推荐

