在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中 - 对相似值进行分组的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中对数组中的相似字符串进行分组

如何在 pymongo 中使用“组”对相似的行进行分组?

对相似的 URL 进行分组

对相似参数进行分组的逻辑

在列表中匹配和分组彼此相关(相关)的相似词

是否有代码对列中包含的相似单词进行分组