我用minhash对文档和它们的木片从这些文档生成签名矩阵。我已经验证了签名矩阵的有效性,因为比较已知相似文档的jaccard距离(例如,关于同一个运动队的两篇文章或关于同一个世界事件的两篇文章)给出了正确的读数。在
我的问题是:使用这个特征矩阵执行k-means聚类有意义吗?
我尝试过在迭代kmeans算法中使用文档的签名向量并计算这些向量的欧几里德距离,但我的集群总是一派胡言。我知道应该有两个集群(我的数据集是几千篇关于体育或商业的文章),最后我的两个集群总是随机的。我确信,将单词散列成整数的随机性每次都会使距离函数发生偏移,并压倒两个签名矩阵中相似的哈希值。在
[编辑以突出问题]
TL;DR
简单回答:不,使用特征矩阵进行K均值聚类是没有意义的。至少,没有明显的操纵。在
一些解释
我是在花了几天的时间来研究如何自己做同样的事情(文本聚类)之后来这里的。我可能错了,但我的看法是你犯了和我一样的错误:使用MinHash构建一个
[n_samples x n_perms]
矩阵,然后将其用作运行k-means的特征矩阵X
。在我猜你在做类似的事情:
由于致命的缺陷,
minhash_values
数组不是一个特征矩阵,这将表现出可怕的。每一行基本上是出现在文本样本中的特征(哈希)列表。。。但是它们不是列对齐的,所以特征被分散到错误的维度中。在要将其转换为一个功能矩阵,您必须查看
minhash_values
中的所有唯一哈希值,然后创建一个[n_samples x n_unique_hashes]
,(n_unique_hashes
是找到的唯一功能的数量)将其设置为1
,其中文本示例包含该功能,0
在其他地方。一般来说,这个矩阵是大而稀疏的。然后你就可以聚集在一起了。在文本聚类的另一种方法
多么令人难以置信的麻烦啊!幸运的是,
scikit-learn
是有帮助的。它提供了一些非常easy to use and scalable vectorisers:所以你的问题很容易解决:
^{pr2}$就这样。从那里开始:
希望这有帮助。在
汤姆
相关问题 更多 >
编程相关推荐