gensim 4.0中从词向量获取距离矩阵的Pythonic方法问询
Gensim 4.0.1 生成词向量距离矩阵的优化方案
Gensim 4.x版本没有内置直接输出所有词两两距离矩阵的专用函数,但可以通过内置属性大幅简化现有代码,无需手动遍历生成词向量列表。
优化实现方法
1. 直接调用内置词向量矩阵属性
model.wv.vectors是Gensim 4.x中KeyedVectors类的原生属性,本身就是按model.wv.index_to_key的顺序存储的所有词向量的二维numpy数组,完全可以直接传入pairwise_distances函数,省去手动构造scaled_data的步骤。
如果你和原有代码一样需要按词汇字典序排序后的向量矩阵,只需要对索引做一次映射即可,示例代码如下:
import gensim from sklearn.metrics import pairwise_distances print('Setting up Word2Vec model') model = gensim.models.Word2Vec(genome_tokens, vector_size=100, window=args.window_size, min_count=args.min_cluster_size, workers=args.threads, sg=1) print('Training Word2Vec model') model.train(genome_tokens, total_examples=len(genome_tokens), epochs=10) # 直接获取排序后的词向量矩阵,无需逐个遍历 sorted_indices = [model.wv.key_to_index[w] for w in sorted(model.wv.index_to_key)] sorted_vectors = model.wv.vectors[sorted_indices] print('Calculating distribution distance among clusters') cluster_distrib_distance = pairwise_distances(sorted_vectors, metric=args.metric)
如果你不需要对词汇做自定义排序,直接用model.wv.vectors代替sorted_vectors即可,代码会更简洁。
2. 余弦距离的快捷计算方式
如果你使用的距离度量是余弦距离,也可以通过相似度转换得到:余弦距离 = 1 - 余弦相似度。对于全量两两计算的场景,直接把model.wv.get_normed_vectors()(归一化后的词向量矩阵)传入pairwise_distances并指定metric='cosine'的效率更高。
注意事项
- 词表规模较大时(≥1万词),全量两两距离矩阵的内存占用会呈平方级增长,10万词的单精度浮点距离矩阵会占用约40GB内存,建议提前评估内存容量,必要时先做降维或采用聚类的近似算法。
- 如果只需要获取单个词和所有其他词的距离,可以直接调用
model.wv.distances(word)方法,无需手动计算全量矩阵。
内容的提问来源于stack exchange,提问作者Felipe Hernandes Coutinho
相关产品推荐
相关产品推荐

