我有几十万个文本文档。其中一些非常相似——它们只是在 ex 上有所不同。名称或一些数字,所有其他文本都是相同的。我想对这些文档进行聚类,所以当我列出它们时,最相似的会分组列出。这就是我如何避免一个接一个地列出许多(几乎)相同的文件。
我在想某种聚类会派上用场。但问题是,我不知道我需要多少个集群。此外,数字必须是动态的。而且,大多数文档不属于一个集群,因为它们没有任何类似的文档。所以我会聚集类似的文件。
任何人都可以指出可以帮助我解决这个问题的方向,或者提供一些类似问题的例子。
我有几十万个文本文档。其中一些非常相似——它们只是在 ex 上有所不同。名称或一些数字,所有其他文本都是相同的。我想对这些文档进行聚类,所以当我列出它们时,最相似的会分组列出。这就是我如何避免一个接一个地列出许多(几乎)相同的文件。
我在想某种聚类会派上用场。但问题是,我不知道我需要多少个集群。此外,数字必须是动态的。而且,大多数文档不属于一个集群,因为它们没有任何类似的文档。所以我会聚集类似的文件。
任何人都可以指出可以帮助我解决这个问题的方向,或者提供一些类似问题的例子。
听起来好像您不需要 clustering。
而是您试图检测附近的重复项。
不同之处在于集群试图组织一切,重点放在更大的整体结构上。但是您的大部分数据可能不是重复的。聚类既困难又缓慢。近似重复更容易,也更快(例如,使用 MinHash 或相似性搜索)
正如您所说,提前考虑集群的数量可能会受到限制。一个简单的解决方案是使用 KNN。
然而,KNN 运行数百 ks 文档的成本可能相当高。为了限制您的搜索空间,您应该首先过滤掉(并快速完成)没有机会与新文档共享集群的文档。所以,我在考虑某种散列,但更简单的解决方案是采用您的 TF-IDF 表示或其他内容中的前导索引。因此,您需要一些字典将索引集(如语料库中的单词)映射到某个整数值。
所以一个通用的方案可以遵循以下几行:
另一种更简单但更基于数学的方法称为MinHash,在 Jure Leskovec 的书《挖掘海量数据集》第 3 章第 3.4 节中有详细描述。该方法使用词袋模型和Jaccard 相似度来计算随机排列签名,然后对签名应用LSH以将相似的文档存储在一起。
祝你好运!