kmeans使用minhash生成的签名矩阵

2024-09-21 05:26:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我用minhash对文档和它们的木片从这些文档生成签名矩阵。我已经验证了签名矩阵的有效性,因为比较已知相似文档的jaccard距离(例如,关于同一个运动队的两篇文章或关于同一个世界事件的两篇文章)给出了正确的读数。在

我的问题是:使用这个特征矩阵执行k-means聚类有意义吗?

我尝试过在迭代kmeans算法中使用文档的签名向量并计算这些向量的欧几里德距离,但我的集群总是一派胡言。我知道应该有两个集群(我的数据集是几千篇关于体育或商业的文章),最后我的两个集群总是随机的。我确信,将单词散列成整数的随机性每次都会使距离函数发生偏移,并压倒两个签名矩阵中相似的哈希值。在

[编辑以突出问题]


Tags: 文档距离文章世界事件集群矩阵特征
1条回答
网友
1楼 · 发布于 2024-09-21 05:26:10

TL;DR

简单回答:不,使用特征矩阵进行K均值聚类是没有意义的。至少,没有明显的操纵。在

一些解释

我是在花了几天的时间来研究如何自己做同样的事情(文本聚类)之后来这里的。我可能错了,但我的看法是你犯了和我一样的错误:使用MinHash构建一个[n_samples x n_perms]矩阵,然后将其用作运行k-means的特征矩阵X。在

我猜你在做类似的事情:

# THIS CODE IS AN EXAMPLE OF WRONG! DON'T IMPLEMENT!
import numpy as np
import MinHash
from sklearn.cluster import KMeans
# Get your data. 
data = get_your_list_of_strings_to_cluster()
n_samples = len(data)
# Minhash all the strings
n_perms = 128
minhash_values = np.zeros((n_samples, n_perms), dtype='uint64')
minhashes = []
for index, string in enumerate(data):
    minhash = MinHash(num_perm=n_perms)
    for gram in ngrams(string, 3):
         minhash.update("".join(gram).encode('utf-8'))
     minhash_values[index, :] = minhash.hashvalues
# Compute clusters
clusterer = KMeans(n_clusters=8)
clusters = clusterer.fit_predict(minhash_values)

由于致命的缺陷,minhash_values数组不是一个特征矩阵,这将表现出可怕的。每一行基本上是出现在文本样本中的特征(哈希)列表。。。但是它们不是列对齐的,所以特征被分散到错误的维度中。在

要将其转换为一个功能矩阵,您必须查看minhash_values中的所有唯一哈希值,然后创建一个[n_samples x n_unique_hashes],(n_unique_hashes是找到的唯一功能的数量)将其设置为1,其中文本示例包含该功能,0在其他地方。一般来说,这个矩阵是大而稀疏的。然后你就可以聚集在一起了。在

文本聚类的另一种方法

多么令人难以置信的麻烦啊!幸运的是,scikit-learn是有帮助的。它提供了一些非常easy to use and scalable vectorisers

所以你的问题很容易解决:

^{pr2}$

就这样。从那里开始:

  • 微调向量器(也可以尝试TfidfVectorizer,调整输入参数等)
  • 试着找到 HDBSCAN英里数更好 比kmeans更快,更健壮,更精确,更少的调整)。在

希望这有帮助。在

汤姆

相关问题 更多 >

    热门问题