如何找到一个非常大的数组的余弦相似度

Posted

技术标签:

【中文标题】如何找到一个非常大的数组的余弦相似度【英文标题】:How to find cosine similarity for of a very Large Array 【发布时间】:2019-03-20 19:36:01 【问题描述】:

我有一个非常大的域名数据集。数据集的大小约为 100 万。

我想查找由于拼写错误而在数据集中重复的相似域。

所以我一直在使用余弦相似度来查找相似的文档。

dataset = ["example.com","examplecom","googl.com","google.com"........]
tfidf_vectorizer = TfidfVectorizer(analyzer="char")
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
cs = cosine_similarity(tfidf_matrix, tfidf_matrix)

上面的例子对于小数据集运行良好,但对于大数据集,它会抛出内存错误。

系统配置:

1)8GB 内存

2)64位系统和64位python安装

3)i3-3210 处理器

如何找到大型数据集的余弦相似度?

【问题讨论】:

你在使用sklearn.metrics.pairwise.cosine_similarity函数吗?因为这会返回一个 shape=(n_samples, n_samples) 的矩阵,也就是说,如果您的数据集有 100 万个样本,它会尝试返回一个 1e^12 个样本的矩阵,这个矩阵太大了。您需要减少输入的大小或找到某种方法将您的问题分成更小的子问题 @ThijsvanEde,是的,我正在使用 sklearn.metrics.pairwise.cosine_similarity 函数 以后有什么相似的计划?正如@ThijsvanEde 所指出的,您将拥有一个由数万亿个元素组成的数组。你会如何使用它? 【参考方案1】:

您可以使用基于标准化输入的KDTree 来生成余弦距离,根据答案here。那么这只是设置您想要返回的最小距离(因此您不会保留所有较大的距离,这是您正在使用的大部分内存)并使用例如@987654324 返回稀疏距离矩阵的情况@来自scipy.spatial.cKDTree.sparse_distance_matrix

不幸的是,我现在没有方便的解释器来编写完整的答案,但这就是它的要点。

不过,请确保您从该距离矩阵拟合的任何模型都可以接受稀疏输入。

【讨论】:

能否提供更多详细信息?如何使用KDTree?

以上是关于如何找到一个非常大的数组的余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章

非常大数据集的余弦相似度

余弦相似度的应用

如何计算两个向量的余弦相似度?

如何使用Tensorflow获得数组的所有元素与同一数组中的所有其他元素的余弦相似度

PYSPARK:如何在 pyspark 数据框中找到两列的余弦相似度?

余弦计算相似度理解以及计算