首页 > 解决方案 > 从 gensim 4.0 中的词向量获取距离矩阵的 Pythonic 方法

问题描述

我目前正在使用 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 存储库上似乎确实对此主题进行了一些讨论,但那里描述的方法似乎特定于旧版本,就像这里提供的解决方案一样

标签: pythonnlpgensimword2vec

解决方案


没有内置的实用程序方法。

但是,您可以在model.wv.vectors属性中获取原始支持数组,其中包含所有向量。每行是 中相同位置的相应单词的单词向量index_to_key

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

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

在这种情况下,您将再次希望从一组外部向量开始工作——通过使用get_vector(key, norm=True)1×1 获取它们,或者get_normed_vectors()获取.vectors数组的完全单位规范版本。


推荐阅读