如何基于重叠标识符对文档进行聚类?

时间:2014-09-10 07:10:13

标签: cluster-analysis data-mining hierarchical-clustering

我有3.5M文档,每个文档都有k个唯一标识符。我需要根据文档的相似性对文档进行聚类。如果两个文档具有m个重叠标识符,则它们类似。 m< ķ

如果我在群集中选择任何两个文档(对于群集大小> 1),则必须至少具有m个重叠标识符。

什么是快速的方法。另外,我想最小化集群数量。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您正在寻找图表聚类,这是一个难以解决的问题。

Here is an article关于图谱聚类,但如果您谷歌搜索它,您可能会找到更多/更好的信息。

至于“最快的方法是什么”。由于您未提供有关数据集或环境的任何信息,因此几乎无法回答。但是,我确实怀疑以某种方式将其加载到图形数据库中,其中一些内置了图形聚类功能,可以很快地将其加载。

对于解决此问题的一般过程,这里有一些伪代码:

define calculate_similarity(doc1, doc2)
    score = 0
    foreach identifier in doc1.identifiers 
        score += 1 if doc2.identifiers.contain(identifier)
    return score

similarity_double_hash = new hash(default = new Hash)
foreach document1 in all_documents
    foreach document2 in all_document
        next if document1 == document2
        similarity = calculate_similarity(document1,document2)
        similarity_double_hash[document1][document2] = similarity
        similarity_double_hash[document2][document1] = similarity

因为我们现在在双哈希中有一个“任意到任意”的关系,我们可以通过查看该文档的“m”来找到文档所在的任何聚类。具有相同m编号的任何两个将在群集中。

一个这样的群体的例子:

define get_groups_from_document(doc, similarity_double_hash)
    groups = new hash(default = new list)
    foreach sim_score, hash_key in similarity_double_hash[doc]
        groups[sim_score].append(hash_key) #Remember, hash_key is the other document
    return groups

返回的组散列是一个指针,指向属于该组的文档的m值,该文档源自文档。其他文件保证对该组中至少 m的其他文件有分数。它不能保证完全是m。

如果从另一个文档开始,m的相同值可以,也可能在列表中包含其他文档。

如果要获取给定m的最大群集,则必须确定要从哪个文档获取最大群集。此外,文档可以是多个集群的一部分。如果你不想那样,那么你就会回到图形聚类的难题。

要查找每个给定m的最大组,您可以这样做:

all_groups = new hash
foreach document in all_documents
    all_groups[document] = get_groups_from_document(document, similarity_double_hash)

max_groups = new hash
foreach group in all_groups
    foreach score, document_list in group
        if max_groups[score].length < document_list.length
            max_groups[score] = document_list

foreach score, document_list in max_groups
    print "Largest group for " + score + " is " + document_list.to_string

现在你有一个很好的任何给定m的最大组列表,但正如我所说,文件可以在多个列表中,这里的“m”组实际上是“m或更大”,而不是“完全m” ”。