使用gensim的wmd函数进行句子聚类

问题描述 投票:0回答:1

我有一个句子列表。我想使用WMD(移词器的距离)将句子的相似性聚类。我正在使用gensim的word2vec模型为我的单词创建嵌入。

我知道的聚类算法(nltk,sklearn)使用数字向量作为输入,因此我需要将句子作为单词中嵌入词的数组(或列表)。我想我可以将nltk聚类方法与自定义距离函数一起使用。我想将WMD用作他的自定义功能。但是gensim的WMD函数使用2个字符串列表作为输入。

是否存在使用嵌入而非字符串作为输入的预构建WMD函数?还是有一个可以处理字符串列表作为输入并且可以将WMD作为自定义距离函数的聚类(kmeans或其他)?

谢谢

python gensim word2vec
1个回答
0
投票

聚类算法不会将字符串(或字符串列表)作为输入。相反,您始终必须将文本预处理为某种数值数据,以供聚类算法使用。

但是documentation for scikit-learn's clustering指出:

要注意的一件事是,在此实现的算法模块可以采用不同类型的矩阵作为输入。所有方法接受形状为scikit-learn的标准数据矩阵。这些可以从[n_samples, n_features]中的类获得模块。对于sklearn.feature_extractionAffinityPropagationSpectralClustering,可以还输入形状为DBSCAN的相似度矩阵。这些可以从[n_samples, n_samples]中的功能获得模块。

[进一步澄清其含义:如果该算法采用形状为sklearn.metrics.pairwise的输入,则假定您的每个文本都已被缩减为固定大小的矢量([n_samples, n_features]大小)。像“移词器的距离”之类的计算并不会固有地将单个文本缩小为固定大小的矢量-正如您所注意到的,WMD仅适用于成对的文本。因此,您将无法直接使用WMD将单个文本单独转换为这些算法所具有的n_features大小的向量。 (但也:请参阅底部的“最终说明”。)

另一方面,如果算法能够接受形状为n_features的输入,则它需要所有可能的成对相似性。这样,您可以在文本的几个循环中使用WMD进行预先计算(或使用[n_samples, n_samples]实用程序功能scikit-learn)。请注意,这些pairwise_distances()算法需要指定scikit-learn,并期望similarity值,其中更相似的对返回更高的值,而不是distance值,其中更相似的对返回更高的值。因此,您需要将WMD距离转换为某种相似度。 (一种满足要求的简单方法是取反距离值。)

例如,如果affinity='precomputed'包含您所有(加标记的)文本,并且texts包含您的wv单词向量:

gensim

import numpy as np from sklearn.metrics import pairwise_distances dist_matrix = pairwise_distances(texts, lambda t1, t2: wv.wmdistance(t1, t2)) sim_matrix = -dist_matrix 应该在接受sim_matrix选项的scikit-learn算法之一中起作用。

但是要注意:WMD的计算非常昂贵(尤其是较长的文本),因此,取决于句子集的大小,仅预先计算所有成对距离可能非常耗时。

最后一点:您也可以考虑像使用相似矩阵一样,使用WMD计算将单个文本转换为固定大小的矢量,但可以通过将每个文本转换为其距离(或相似性)为all其他文字

即,基本上使用与上述相同的成对过程-但随后将所得矩阵传递给采用affinity='precomputed'形输入的算法之一。

我不确定这是否会像为这种输入设计的算法一样有效,但是只要您花了时间计算所有成对的距离(或相似性),就值得尝试。

© www.soinside.com 2019 - 2024. All rights reserved.