在java中 - 对相似值进行分组
Posted
技术标签:
【中文标题】在java中 - 对相似值进行分组【英文标题】:In java - Grouping similar values 【发布时间】:2011-01-14 10:58:48 【问题描述】:首先,感谢您阅读我的问题。
我使用了TF/IDF,然后在这些值上,我计算了余弦相似度,看看有多少文档更相似。您可以看到以下矩阵。列名与 doc1、doc2、doc3 类似,行名与 doc1、doc2、doc3 等相同。借助以下矩阵,我可以看到 doc1 和 doc4 具有 72% 的相似性(0.722711142)。即使我看到它们相似的两个文件也是正确的。我有 1000 个文档,我可以看到每个文档的频率。在矩阵中查看其中有多少是相似的。 我使用了不同的聚类,比如 k-means 和 agnes (hierarchy) 来组合它们。它制造了集群。例如 Cluster1 有 (doc4, doc5, doc3) 因为它们的值 (0.722711142, 0.602301766, 0.69912109) 分别更接近。但是当我手动查看这三个文件是否真的相同时,它们不是。 :( 我在做什么或者我应该使用集群以外的其他东西??????
1 0.067305859 -0.027552299 0.602301766 0.722711142
0.067305859 1 0.048492904 0.029151952 -0.034714695
-0.027552299 0.748492904 1 0.610617214 0.010912109
0.602301766 0.029151952 -0.061617214 1 0.034410392
0.722711142 -0.034714695 0.69912109 0.034410392 1
P.S:值可能是错误的,这只是给你一个想法。 如果您有任何问题,请务必提出。 谢谢
【问题讨论】:
任何提示??任何帮助???????????????????????? 小问题:无法应用该问题的现有解决方案,或者您为什么要从头开始开发它?我的感觉是lucene(或solr)也应该实现这个...... 嗯,lucene 或 solr 是做什么的。我已经做到了。现在我有 CSV 文件,但我的问题不同。如果你能解释你的问题。我可以用更好的方式回答它 矩阵似乎有些不对劲。它有一些奇怪的非对称性。对于您的示例集群 m[3,4] 是 -0.062 但 m[4,3] 是 0.611 而 m[3,5] 是 0.035 但 m[5,3] 是 0.699。 GeoffReedy 请阅读我的最后一行。我说我编辑这个矩阵让你知道我想做什么。值可能有问题 【参考方案1】:我对 TF/IDF 不熟悉,但这个过程通常会在很多阶段出错:
1,您是否删除了停用词?
2,您是否应用了词干提取?例如波特词干分析器。
3,您是否对文档长度的频率进行了标准化? (也许 TFIDF 的事情有解决方案,我不知道)
4,聚类是一种发现方法,但不是圣杯。它作为一个组检索的文档可能或多或少相关,但这取决于数据、调整、聚类算法等。
你想达到什么目标?你的设置是什么? 祝你好运!
【讨论】:
您好罗恩,感谢您的回复。是的,我使用了你上面提到的所有东西。我有一个很大的相似度矩阵,我现在想对所有相似的文档进行分组。例如,如果 10 个文档与文档 15 相似,那么应该有一个包含 11 个文档(1 到 10 和 15 个文档)的集群,但集群在距离上工作,并将文档分组。其中有频率。更接近者可以说 70%,而该集群中的所有文档都不同:( 还有其他技术。你可以提一下吗? 正确的聚类方法很大程度上取决于文档空间的分布。您可以尝试 CURE 算法或 DENCLUE。或者有一些聚类可以处理连接数据的图形表示,例如 Markov Clustering (micans.org/mcl)【参考方案2】:我的方法是根本不使用预先计算的相似度值,因为文档之间的相似度应该由聚类算法本身找到。我将简单地设置一个特征空间,在语料库中每个术语一列,以便列数等于词汇表的大小(如果需要,减去停用词)。每个特征值都包含该文档中相应术语的相对频率。我想您也可以使用 tf*idf 值,尽管我不希望这有太大帮助。根据您使用的聚类算法,应该自动找到特定术语的区分能力,即如果一个术语以相似的相对频率出现在所有文档中,那么该术语不能很好地区分类别,算法应该检测到.
【讨论】:
对不起,我听不懂。对于我的计算,我正在计算 LSI 和 VSM 的相似性基础。聚类无助于相似性。如果确实如此,请解释是哪一个以及如何? 在聚类中,一个文档是一个特征空间中的一个点,一个对应的。算法将彼此接近的数据点分组。如果特征是词频,那么包含相同词的文档,即 similar 文档,将在同一个组中。这就是聚类的全部内容:对相似的数据点(此处为文档)进行分组,其中相似性取决于所采用的特征。我认为本书的第 16 至 18 章:nlp.stanford.edu/IR-book/information-retrieval-book.html 会很好地指导您(可在线免费获得)。以上是关于在java中 - 对相似值进行分组的主要内容,如果未能解决你的问题,请参考以下文章