如何在Python中生成Word2Vec向量?训练后转换DataFrame方法
如何将分词后的DataFrame转换为Word2Vec文档向量
嘿,我来帮你搞定这个问题~ Word2Vec本身并没有像一些文本分类模型那样自带transform方法,因为它本质上是训练词向量的,而你需要的是把整个文档(也就是每一行的分词列表)转换成文档向量,这得我们自己来实现一下,其实并不复杂。
核心思路
Word2Vec只给每个单独的词生成了向量,文档向量需要把当前文档里所有词的向量做聚合计算,最常用的方式是取平均值(当然你也可以用加权平均、最大值等方式,这里先讲最通用的平均法)。
具体实现步骤
- 首先,我们可以通过
model.wv获取训练好的词向量集合,它包含了所有满足min_count要求的词对应的向量。 - 写一个辅助函数,输入一个分词列表,返回对应的文档向量:
import numpy as np def get_doc_vector(tokens, word2vec_model, feature_dim): # 初始化一个全0的向量,维度和你训练时设置的size一致 doc_vector = np.zeros(feature_dim, dtype="float32") valid_token_count = 0 # 遍历每个分词,累加存在于词向量中的词的向量 for token in tokens: if token in word2vec_model.wv: doc_vector += word2vec_model.wv[token] valid_token_count += 1 # 如果有有效词,就取平均值;否则保持全0向量 if valid_token_count > 0: doc_vector /= valid_token_count return doc_vector
- 把这个函数应用到你的DataFrame的
token列上,生成文档向量列:
# 这里的num_features就是你训练Word2Vec时设置的size参数 df["doc_vector"] = df["token"].apply( lambda x: get_doc_vector(x, model, num_features) )
额外说明
- 如果你想追求更高的效率,可以用列表推导式代替
apply:
doc_vectors = [get_doc_vector(tokens, model, num_features) for tokens in df["token"]] df["doc_vector"] = doc_vectors
- 除了平均法,你也可以尝试其他聚合方式,比如用TF-IDF权重对词向量做加权平均,或者取每个维度的最大值,这取决于你的业务需求。
- 注意:训练时设置的
min_count参数会过滤掉低频词,这些词不会出现在model.wv中,所以在生成文档向量时会被自动忽略。
内容的提问来源于stack exchange,提问作者Jerry George
相关产品推荐
相关产品推荐

