我对集群和相关主题相当陌生,所以请原谅我的问题。
我试图通过做一些测试来介绍这个领域,作为第一个实验,我想根据内容相似性在推文上创建集群。实验的基本思想是将推文存储在数据库中并定期计算聚类(即使用 cron 作业)。请注意,数据库会不时获得新的推文。
在这个领域一无所知,我的想法(可能是幼稚的)会做这样的事情:
1. For each new tweet in the db, extract N-grams (N=3 for example) into a set
2. Perform Jaccard similarity and compare with each of the existing clusters. If result > threshold then it would be assigned to that cluster
3. Once finished I'd get M clusters containing similar tweets
现在我发现这种基本方法存在一些问题。抛开计算成本不谈,一条推文和一个集群如何进行比较?假设我有一条推文 Tn 和一个包含 T1、T4、T10 的集群 C1,我应该将它与哪个比较?鉴于我们谈论的是相似性,很可能会发生 sim(Tn,T1) > 阈值但 sim(Tn,T4) < 阈值。我的直觉告诉我,应该为集群使用平均值之类的东西,以避免这个问题。
此外,sim(Tn, C1) 和 sim(Tn, C2) 都可能 > 阈值,但与 C1 的相似性会更高。在这种情况下,Tn 应该转到 C1。这也可以通过蛮力来完成,以将推文分配给具有最大相似性的集群。
最后,这是计算问题。我一直在阅读一些关于 minhash 的内容,它似乎是这个问题的答案,尽管我需要对它做更多的研究。
无论如何,我的主要问题是:有该领域经验的人可以推荐我应该采用哪种方法吗?我读过一些关于 LSA 和其他方法的提及,但试图应对所有事情变得有点不知所措,所以我很感激一些指导。
从我正在阅读的工具来看,这将是层次聚类,因为它允许在新数据进入时重新组合集群。它是否正确?
请注意,我不是在寻找任何复杂的案例。我的用例想法是能够在没有任何先前信息的情况下将类似的推文分组。例如,来自 Foursquare 的推文(“我正在签到……”彼此相似就是一种情况,或者“我的 klout 分数是……”)。另请注意,我希望这与语言无关,因此我对必须处理特定的语言问题不感兴趣。