k-means 使用从 minhash 生成的签名矩阵

2024-01-03

我在文档及其木瓦上使用了 minhash,从这些文档生成签名矩阵。我已经验证签名矩阵可以很好地比较已知相似文档(例如,关于同一运动队的两篇文章或关于同一世界赛事的两篇文章)的杰卡德距离,从而给出正确的读数。

我的问题是:使用这个签名矩阵来执行 k 均值聚类有意义吗?

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

[编辑以突出问题]


TL;DR

简短回答:不,使用签名矩阵进行 K 均值聚类没有意义。至少,并非没有重大操纵。

一些解释

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

我猜你正在做类似的事情:

# 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)

这将表现horribly因为致命的缺陷——minhash_values数组是not特征矩阵。每行基本上都是出现在该文本样本中的特征(哈希)列表......但它们不是列对齐的,因此特征分散到错误的维度中。

要把它变成一个feature矩阵,你必须查看所有唯一的哈希值minhash_values然后创建一个矩阵[n_samples x n_unique_hashes], (n_unique_hashes是找到的独特特征的数量)将其设置为1其中文本样本包含该功能,0别处。通常这个矩阵会很大而且稀疏。然后你可以集中于此。

文本聚类的替代方法

但这是多么令人难以置信的麻烦啊!幸运的是,scikit-learn有帮助吗?它提供了一些非常易于使用且可扩展的矢量化器 http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_extraction.text:

这样你的问题就很容易解决了:

# Imports
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.cluster import KMeans

# Get your data
data = get_your_list_of_strings_to_cluster()

# Get your feature matrix
text_features = HashingVectorizer(analyzer="word").fit_transform(data)

# Compute clusters
clusterer = KMeans(n_clusters=2)
clusters = clusterer.fit_predict(text_features)

就这样吧。从那里:

  • 微调你的矢量化器(也尝试 TfidfVectorizer,调整输入参数等),
  • 尝试其他集群器(f/ex 我发现HDBSCAN http://hdbscan.readthedocs.io/en/latest/ miles更好的 比 kmeans - 更快、更稳健、更准确、更少调整)。

希望这可以帮助。

Tom

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k-means 使用从 minhash 生成的签名矩阵 的相关文章

随机推荐