python - 从 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 存储库上似乎确实对此主题进行了一些讨论,但那里描述的方法似乎特定于旧版本,就像这里提供的解决方案一样
解决方案
没有内置的实用程序方法。
但是,您可以在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
数组的完全单位规范版本。
推荐阅读
- php - Laravel 将某个参数传递给所有视图中的所有路由
- scala - 无法运行加特林测试(jvm 问题)
- linux - Chromium 是否使用 fontconfig 机制?
- html - 如何使边框高度在所有设备上显示相同
- c++ - 有没有办法从项目的主程序文件中设置对象成员数组大小,该文件#includes 用于声明/定义对象的.h 文件?
- mobile - 从移动浏览器获取 GPS 数据是否已知有些不稳定?
- python - 不带括号的列表或元组不用于打印
- windows - Windows 10 中缺少 IPP 驱动程序(需要连接到 CUPS)
- google-analytics - 未检测到 HTTP 响应 - Wix 上的 Google Analytics(分析)
- jahia - DigitalExperienceManager-CommunityDistribution-7.3.1.0 以错误“无法将 maven 可执行文件设置为 mvn,请检查您的配置”开始