我需要在java中使用k-means算法执行文档聚类的步骤。 对我来说,轻松提供这些步骤非常有用。 提前谢谢。
答案 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)