java中的词聚类

Posted

技术标签:

【中文标题】java中的词聚类【英文标题】:word clustering in java 【发布时间】:2014-04-23 19:38:40 【问题描述】:

我有一个非常大的文本文件。 例如,我想对该文件进行聚类 如果我想将文件分成 5 个集群,那么 从 A 到 Z 词频然后每个簇的质心应该是 c,h,m,r,w 所以输出应该像 最初所有单词都是 a,b,c,d,e 然后 f,g,h,i,j 然后 k,l.m.n.o 然后 p,q,r,s,t 然后是 u,v,w,x,y 和 z

我想在 java 中实现这种类型的集群。 我已经搜索了代码,但在java中找不到单词聚类程序。

【问题讨论】:

如果你有一个好的实现,你的“非常大”可能仍然可以很容易地在内存中处理,而不需要集群。但是我们不知道您的问题出在哪里,因为您没有显示任何代码。 谢谢先生的回答。我已经在java中完成了k-means聚类的编码,但它只适用于数字。 这是代码 【参考方案1】:

好吧,但我的第一句话是,到目前为止,您尝试了哪些方法,您的代码在哪里?然后,我想你知道在你向他们展示你的努力之前,这里的任何人都不会去为你编写代码。找到一些聚类参考并不像Google 那样困难。 一些很好的参考供您开始:

Github:word-clustering Google Code on word-clustering

了解他们如何实现聚类,然后在那里应用您的算法。

【讨论】:

【参考方案2】:

用于机器学习/数据挖掘的完善 Java 库是 Weka。它提供了几种不同类型的集群技术,您可以尝试使用这些技术,这些技术的 API 是 documented here。

他们的下载页面带有各种特定于平台的版本以及安装程序等,但我建议只下载zip,解压缩 jar,然后像使用任何其他 jar 一样使用它(即添加到类路径)然后您就可以完全访问 Weka 模块/API。

【讨论】:

【参考方案3】:
enter code here
    import java.util.*;
    class k_means
    
static int count1,count2,count3;
static int d[];
static int k[][];
static int tempk[][];
static double m[];
static double diff[];
static int n,p;
static int cal_diff(int a) 

int temp1=0;
for(int i=0;i<p;++i)

if(a>m[i])
diff[i]=a-m[i];
else
diff[i]=m[i]-a;

int val=0;
double temp=diff[0];
for(int i=0;i<p;++i)

if(diff[i]<temp)

temp=diff[i];
val=i;


return val;
    
static void cal_mean() 

for(int i=0;i<p;++i)
m[i]=0; 
int cnt=0;
for(int i=0;i<p;++i)

cnt=0;
for(int j=0;j<n-1;++j)

if(k[i][j]!=-1)

m[i]+=k[i][j];
++cnt;


m[i]=m[i]/cnt;


static int check1()

for(int i=0;i<p;++i)
for(int j=0;j<n;++j)
if(tempk[i][j]!=k[i][j])

return 0;

return 1;

public static void main(String args[])

Scanner scr=new Scanner(System.in);
System.out.println("Enter the number of elements ");
n=scr.nextInt();
d=new int[n];
System.out.println("Enter "+n+" elements: ");
for(int i=0;i<n;++i)
d[i]=scr.nextInt();
System.out.println("Enter the number of clusters: ");
p=scr.nextInt();
k=new int[p][n];
tempk=new int[p][n];
m=new double[p];
diff=new double[p];
for(int i=0;i<p;++i)
m[i]=d[i];
int temp=0;
int flag=0;
do

for(int i=0;i<p;++i)
for(int j=0;j<n;++j)
   
k[i][j]=-1;

for(int i=0;i<n;++i) 

temp=cal_diff(d[i]);
if(temp==0)
k[temp][count1++]=d[i];
else
if(temp==1)
k[temp][count2++]=d[i];
else
if(temp==2)
k[temp][count3++]=d[i]; 

cal_mean();
flag=check1();
if(flag!=1)
for(int i=0;i<p;++i)
for(int j=0;j<n;++j)
tempk[i][j]=k[i][j];
System.out.println("\n\nAt this step");
System.out.println("\nValue of clusters");
for(int i=0;i<p;++i)

System.out.print("K"+(i+1)+" ");
for(int j=0;k[i][j]!=-1 && j<n-1;++j)
System.out.print(k[i][j]+" ");
System.out.println("");

System.out.println("\nValue of m ");
for(int i=0;i<p;++i)
System.out.print("m"+(i+1)+"="+m[i]+"  ");
count1=0;count2=0;count3=0;

while(flag==0);
System.out.println("\n\n\nThe Final Clusters By Kmeans are as follows: ");
for(int i=0;i<p;++i)

System.out.print("K"+(i+1)+" ");
for(int j=0;k[i][j]!=-1 && j<n-1;++j)
System.out.print(k[i][j]+" ");
System.out.println("");


    

【讨论】:

以上是关于java中的词聚类的主要内容,如果未能解决你的问题,请参考以下文章

用于词聚类/NLP 的 PHP 库?

在语义上对文档中的词进行无监督聚类

Kmean聚类聚类中的***术语

使用 scikit 选择层次凝聚聚类中的聚类数

聚类中的属性和点有啥区别?

k-means 聚类中的项数