从gensim 4.0中的词向量获取距离矩阵的Pythonic方法

Pythonic way to obtain a distance matrix from word vectors in gensim 4.0

我目前使用gensim 4.0.1版本生成词向量。我的最终目标是计算所有成对组合词向量之间的余弦距离,并使用获得的距离矩阵对词向量进行聚类。到目前为止,我一直在使用以下代码生成距离矩阵:

    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)

    words = sorted(model.wv.index_to_key)
    scaled_data = [model.wv[w] for w in words]
    print('Calculating distribution distance among clusters')
    cluster_distrib_distance = pairwise_distances(scaled_data, metric=args.metric)

我想知道是否有一个特定的函数可以直接从模型对象中获取距离矩阵,而不必创建单词和缩放数据对象。

通过 gensim 文档,我主要找到了有关计算相似性的方法的信息,而不是距离,并且通常是在文档之间而不是单个单词之间。 github repository, but the methods described there seem to be specific to the older versions as is the case for the solution presented here

上似乎确实有一些关于此主题的讨论

没有内置的实用方法。

但是,您可以在 model.wv.vectors 属性 中获得原始支持数组,其中包含所有向量。每行是 index_to_key.

中相同位置的对应词的词向量

您可以直接将其输入 sklearn.metrics.pairwise_distances(或类似的),而无需在外部单独(和不同排序的)scaled_data

请注意,如果使用类似欧氏距离的方法,您可能希望在计算距离之前对词向量进行单位长度归一化。然后所有距离都在 [0.0, 2.0] 范围内,排名距离将与排名余弦相似度完全相反。

在那种情况下,您将再次希望从一组外部向量开始工作——或者通过使用 get_vector(key, norm=True) to get them 1-by-1, or get_normed_vectors() 来获得 .vectors 数组的完全单位规范版本。