在java中使用k-means算法执行文档聚类的步骤

时间:2010-08-17 19:25:00

标签: java

我需要在java中使用k-means算法执行文档聚类的步骤。 对我来说,轻松提供这些步骤非常有用。 提前谢谢。

3 个答案:

答案 0 :(得分:3)

您需要计算每个文档中的单词并制作一个通常称为单词包的功能。在此之前,您需要删除停用词(非常常见但不提供诸如a等信息)。您通常可以从文档中获取前n个常用词。计算这些单词的频率并将它们存储在n维向量中。

对于距离测量,您可以使用余弦矢量。

这是针对1维数据点的2均值的简单算法。您可以轻松地将其扩展到k均值和n维数据点。如果您想要实现,请告诉我。


double[] x = {1,2,2.5,3,3.5,4,4.5,5,7,8,8.5,9,9.5,10};

double[] center = new int[2]; double[] precenter = new int[2]; ArrayList[] cluster = new ArrayList[2];

//generate 2 random number from 0 to x.length without replacement int rand = new int[2]; Random rand = new Random(); rand[0] = rand.nextInt(x.length + 1); rand[1] = rand.nextInt(x.length + 1);

while(rand[0] == rand[1] ){ rand[1] = rand.nextInt(x.length + 1); } center[0] = x[rand[0]]; center[1] = x[rand[1]]; //there is a better way to generate k random number (w/o replacement) just search.

do{ cluster[0].clear(); cluster[1].clear(); for(int i = 0; i < x.length; ++i){ if(abs(x[i]-center1[0]) <= abs(x[i]-center1[1])){ cluster[0].add(x[i]); } else{ cluster[0].add(x[i]); } precenter[0] = center[0]; precenter[1] = center[1];
center[0] = mean(cluster[0]); center[1] = mean(cluster[1]); } } while(precenter[0] != center[0] && precenter[1] != center[1]);

double mean(ArrayList list){ double mean = 0; double sum = 0; for(int index=0;index }

簇[0]和簇[1]包含簇中的点和中心[0],中心[1]是2个均值。 你需要做一些调试,因为我已经在R中编写了代码并且只是为你转换成java:)

答案 1 :(得分:0)

您希望基于什么来对文档进行聚类?如果它是相似的,你首先需要做一些自然语言处理,然后你需要一个度量(某种分配算法)来将文档放入簇中(crp工作并且相对简单)。

最困难的部分是NLP(语言处理),如果你没有根据“长度”这样的东西对它们进行聚类。我可以提供所有这些的更多信息,但如果你不需要,我不会潜入兔子洞。

答案 2 :(得分:0)

this会帮助你吗?此外,wiki文章还有一些指向其他语言实现的链接,可以移植到java。

算法的步骤:

  1. 定义您想要拥有的群集数量
  2. 在您的问题空间中大量分配点。
  3. 将每个观察点链接到最近的点。
  4. 计算每个星团的质心,并将该点放在中间。
  5. 再次将点连接到中心点并重复,直到这些点不再移动为止。