本文主要讲述一个层次聚类实例,使用层次聚类算法将相似图书的目录进行聚类。由于不知道要聚为多少类,所以Kmeans聚类算法不适用,而层次聚类由于不需要设置聚类中心数,只要传递一个阈值即可,所以正好适合于这个问题。本文将结合层次聚算法的原理以及其Java代码实现来展现文本聚类的一个实现方式。具体代码见我的GitHub(点击打开链接)
public static void main(String[] args) throws IOException{
double disThreshold = 0.8;
//加载数据
ArrayList sentencelist = new ArrayList<>();
ArrayList senindex = new ArrayList<>();
int count = 0;
try (InputStreamReader output1 = new InputStreamReader(new FileInputStream(sentWordsavepath), "utf-8")) {
BufferedReader reader = new BufferedReader(output1);
String line = "";
while((line = reader.readLine()) != null) {
// if (count == 10) break;
sentencelist.add(line.split("\t")[0].split(":")[1]);
senindex.add(count);
count++;
}
}
ArrayList sen2vec_word = TextSimilarity.getVector(sentWordsavepath);
ArrayList sen2vec_doc = TextSimilarity.getVector(sentDocsavepath);
//计算相似度矩阵
double[][] simmatrix1 = TextSimilarity.CalSimMatrix(sen2vec_word);
double[][] simmatrix2 = TextSimilarity.CalSimMatrix(sen2vec_doc);
//层次聚类
HierarchicalClustering hc = new HierarchicalClustering();
List cluste_res1 = hc.starAnalysis(senindex, simmatrix1, disThreshold);
List cluste_res2 = hc.starAnalysis(senindex, simmatrix2, disThreshold);
HierarchicalClustering.writeClusterToFile(clusterFilePath1, cluste_res1, sentencelist);
HierarchicalClustering.writeClusterToFile(clusterFilePath2, cluste_res2, sentencelist);
}
/**
* 对输入的句子进行聚类
* @param CatalogList
* @param sim
* @param threshold
* @return
* @throws IOException
*/
public List starAnalysis(ArrayList CatalogList, double[][] sim,double threshold) throws IOException{
List finalClusters = new ArrayList();
List originalClusters = initialCluster(CatalogList);
finalClusters = originalClusters;
while(finalClusters.size() > 1){
double max = Double.MIN_VALUE;
int mergeIndexA = 0;
int mergeIndexB = 0;
for (int i = 0; i < finalClusters.size(); i++) {
for (int j = i + 1; j < finalClusters.size(); j++) {
Cluster clusterA = finalClusters.get(i);//获取聚类1
Cluster clusterB = finalClusters.get(j);//获取聚类2
List dataPointsA = clusterA.getDataPoints();
List dataPointsB = clusterB.getDataPoints();
//以下两个for循环来确定应聚那两个类
double minTempWeight = Double.MAX_VALUE;
boolean flag = false;
for (int m = 0; m < dataPointsA.size(); m++) {
for (int n = 0; n < dataPointsB.size(); n++) {//划分类的标准: 两类中相似度最低的两个focus作为类的距离。
//计算两个聚类focus之间的相似度,选择相似度最低的focus之间的相似度作为类的相似度
double tempWeight = sim[dataPointsA.get(m)][dataPointsB.get(n)];
if (tempWeight > 0.7)
System.out.println(tempWeight);
if(tempWeight < minTempWeight){
minTempWeight = tempWeight;
flag = true;
}
}//end_for
}//end_for
if (minTempWeight > max && flag == true) {
max = minTempWeight;
mergeIndexA = i;// --保存相似度最高的focus所在的簇
mergeIndexB = j;// --保存相似度最高的focus所在的簇
}//end_if
} // end for j
}// end for i
//将cluster[mergeIndexA]与cluster[mergeIndexB]合并
if(max < threshold) {
System.out.println("相似度小于指定的阈值,聚类结束!");
break;
}
finalClusters = mergeCluster(finalClusters, mergeIndexA, mergeIndexB);
}// end while
return finalClusters;
}
Cluster 0
953664:数据传输与通信接口
952103:数据传输
Cluster 1
953665:数据链路控制
912973:数据链路控制
Cluster 2
953666:网络层与传送层
1132928:传送层与会话层
959433:会晤层、表示层和应用层
716323:物量层
Cluster 3
953667:高层协议
798185:高层协议
1127825:高层协议
1130729:高层协议
898055:传输协议及高层协议
Cluster 4
953668:局域网
956411:局域网
705438:局域网
810551:局域网
813180:局域网
796715:局域网
838449:局域网
870661:局域网
845949:局域网
1127826:局域网
955068:局域网
716326:局域网
755213:局域网
785957:局域网
872479:局域网
852828:局域网
846647:局域网
888551:局域网
904831:局域网
905050:局域网
908543:局域网
908593:局域网
897097:局域网
705375:局域网与广域网
934294:局域网与广域网
799471:局域网与广域网
953848:Novell局域网
1130727:局域网的体系结构
841870:局域网互联
915305:虚拟局域网VLAN
Cluster 5
953669:高速局域网
845950:高速以太网
Cluster 6
953670:网络管理
798189:网络管理
817528:网络管理
845952:网络管理
898060:网络管理
952315:网络管理
758307:网络管理
796710:网络管理
876976:网络管理
852832:网络管理
934303:网络管理
798959:网络软件和网络管理
764079:网络管理技术
895232:网络管理技术
Cluster 7
953671:网络的规划与设计
705342:网络系统集成、规划与设计
954290:网络设计
705404:网络设计
846649:网络设计
743259:WindowsNT网络设计与架设
959439:企业网络的设计
Cluster 8
953846:计算机网络与社会
956410:计算机网络的体系结构
1127819:计算机网络的体系结构
818600:计算机网络的体系结构
888550:计算机网络的体系结构
904093:计算机网络的通信子网
915303:计算机网络寻址
852690:计算机网络的若干热点问题
766470:计算机网络的层次化结构
1132924:计算机网络的结构
954284:计算机网络的结构
Cluster 9
953847:计算机信息系统与网络基本概念
749728:计算机网络基本概念
874002:计算机网络的基本概念
1035678:计算机网络基本概念
724660:计算机网络基本概念
762865:计算机网络的基本概念
835686:计算机网络的基本概念
Cluster 11
953849:Internet网
813703:工作组网与资源共享
952388:CHINAPAC网、INTERNET网、CHINANET网介绍
877339:网浏览
952001:Novell网与NetWare网络操作系统
Cluster 12
953850:+以太网
Cluster 13
953851:计算机网络安全
852698:计算机网络安全
705407:计算机网络安全
798175:计算机网络安全
951887:计算机局域网络
30890:计算机局域网络
1108079:计算机局域网络
824918:计算机局域网络
841578:计算机局域网络
753420:计算机联网
799149:计算机局域网和城域网
705338:计算机局域网
705400:计算机局域网
796704:计算机局域网
813706:计算机局域网
951131:计算机局域网
951539:计算机局域网
952393:计算机局域网
926089:计算机局域网
1075062:计算机局域网
951540:计算机广域网络
Cluster 14
956408:计算机网络基础知识
705437:计算机网络基础知识
736376:计算机网络基础知识
751993:计算机网络基础知识
785954:计算机网络基础知识
813700:计算机网络基础知识
860486:计算机网络基础知识
844435:计算机网络基础知识
951999:计算机网络的基础知识
1052997:计算机网络的基础知识
798168:计算机网络与数据通信基础知识
705397:计算机网络基础
743258:计算机网络基础
808552:计算机网络基础
828866:计算机网络基础
863160:计算机网络基础
846636:计算机网络基础
904828:计算机网络基础
907770:计算机网络基础
951537:计算机网络基础
796702:计算机网络技术基础
837683:计算机网络技术基础
915298:计算机网络技术基础
1035313:计算机网络技术基础
841576:计算机网络与网络体系结构概述
845946:网络概述
905049:网络的概述
860715:网络技术基础
879169:网络基础
852827:网络基础
897422:网络基础
877334:网络基础知识
877898:网络基础知识
Cluster 15
956409:网络中的数据通信技术
876968:网络数据通信技术
1154291:网络中的数据通信技术
749729:数据通信技术基础
1035679:数据通信技术基础
810596:数据通信技术基础
796460:数据通信技术概论
810550:数据通信技术
887789:数据通信技术
824914:数据通信技术
904829:数据通信技术
897100:计算机网络通信技术及发展
Cluster 18
956412:网络互连技术
751999:网络互连技术
796707:网络互连技术
798958:网络互连技术
888553:网络互连技术
951543:网络互连技术及应用
30891:网络互联及建网技术
824920:网络互联及建网技术
846648:网络互联技术
841580:网络互联与路由技术
852830:网络互联与接入技术
709927:ATM与宽带网络技术
876980:网络存储与磁盘阵列技术
705340:高速网络技术
1035683:网络技术发展
818599:网络技术的发展
724665:网络技术发展及应用
954292:网络技术
1154296:Unix网络技术
915308:VPN网络技术
Cluster 19
956413:国际互联网Internet
798187:国际互联网Internet
951542:国际互联网——INTERNET
Cluster 20
956414:NetWare网络操作系统的使用
Cluster 0
953664:数据传输与通信接口
Cluster 1
953665:数据链路控制
912973:数据链路控制
Cluster 2
953666:网络层与传送层
Cluster 3
953667:高层协议
798185:高层协议
897098:网络高层协议
898055:传输协议及高层协议
Cluster 4
953668:局域网
Cluster 5
953669:高速局域网
Cluster 6
953670:网络管理
Cluster 7
953671:网络的规划与设计
705342:网络系统集成、规划与设计
926093:计算机网络应用及网络规划
Cluster 8
953846:计算机网络与社会
953847:计算机信息系统与网络基本概念
749728:计算机网络基本概念
724660:计算机网络基本概念
874002:计算机网络的基本概念
762865:计算机网络的基本概念
835686:计算机网络的基本概念
1035678:计算机网络基本概念
Cluster 10
953848:Novell局域网
959438:Novell局域网的基本原理
Cluster 11
953849:Internet网
Cluster 12
953850:+以太网
Cluster 13
953851:计算机网络安全
852698:计算机网络安全
705407:计算机网络安全
798175:计算机网络安全
819903:计算机网络安全技术概论
828867:计算机网络安全基础
874007:计算机网络安全与管理
828875:计算机网络安全管理技术
Cluster 14
956408:计算机网络基础知识
705437:计算机网络基础知识
736376:计算机网络基础知识
751993:计算机网络基础知识
813700:计算机网络基础知识
844435:计算机网络基础知识
860486:计算机网络基础知识
951999:计算机网络的基础知识
785954:计算机网络基础知识
1052997:计算机网络的基础知识
798168:计算机网络与数据通信基础知识
753419:计算机基础知识
Cluster 15
956409:网络中的数据通信技术
876968:网络数据通信技术
810550:数据通信技术
824914:数据通信技术
887789:数据通信技术
904829:数据通信技术
796460:数据通信技术概论
30888:数据通信的基础知识
769585:数据通信的基础知识
749729:数据通信技术基础
1035679:数据通信技术基础
810596:数据通信技术基础
Cluster 16
956410:计算机网络的体系结构
818600:计算机网络的体系结构
888550:计算机网络的体系结构
1127819:计算机网络的体系结构
Cluster 17
956411:局域网
Cluster 18
956412:网络互连技术
751999:网络互连技术
796707:网络互连技术
888553:网络互连技术
951543:网络互连技术及应用
Cluster 19
956413:国际互联网Internet
798187:国际互联网Internet
951542:国际互联网——INTERNET
Cluster 20
956414:NetWare网络操作系统的使用
844437:NetWare网络操作系统
952395:网络操作系统NetWare