K-means算法中文文献聚类的Python实现
2019-10-08赵谦益
摘 要: 聚类是对文本信息进行有效组织、摘要和导航的重要手段。K-means算法是非常典型的基于距离的聚类算法,将其用于中文文献聚类,按照内容相似性把一组文献分成几个类并发现其中的隐形知识。本文通过实例,总结了基于Python语言的K-means算法用于中文文献聚类过程,通过CH指标、轮廓系数指标和SSE指标这三个评价指标选取K-means算法的初始聚类簇数,即最优k值的取值范围,然后分别按照基于关键词和基于摘要对文献进行聚类,并对聚类结果进行比较分析,从而得出基于摘要对中文文献进行聚类可以得到更好结果的结论,同一类别中的文献可以进行关键词聚类,从而进一步挖掘其中的隐形知识。
关键词: K-means算法;文献聚类;评价指标
中图分类号: TP311.1. 文献标识码: A DOI:10.3969/j.issn.1003-6970.2019.08.021
本文著录格式:赵谦益. K-means算法中文文献聚类的Python实现[J]. 软件,2019,40(8):8994
【Abstract】: Clustering is an important means of effective organization, summarization and navigation of text information. The K-means algorithm is a very typical distance-based clustering algorithm. It is used for Chinese document clustering. According to the content similarity, a group of documents is divided into several categories and the invisible knowledge is found. In this paper, the K-means algorithm based on Python language is used to summarize the Chinese literature clustering process. The initial cluster cluster number of K-means algorithm is selected by three evaluation indexes: CH index, contour coefficient index and SSE index. The range of optimal k-values is then clustered according to keywords and based on abstracts, and the clustering results are compared and analyzed, so that the clustering of Chinese documents based on abstracts can get better results. In conclusion, the literature in the same category can be clustered by keywords to further explore the invisible knowledge.
【Key words】: K-means algorithm; Literature clustering; Evaluation index
0 引言
聚類算法是一种无监督的知识发现算法。利用其对中文文献进行聚类,目的是发现其中的隐形知识。所谓文献,文,指有关典章制度的文字资料,献,指熟悉掌故的人。文献是记录、积累、传播和继承知识的最有效手段,是人类社会活动中获取情报的最基本、最主要的来源,也是交流传播情报的最基本手段。文献数据为非结构化数据,能够对其进行有效的数据分析,是文本数据挖掘重要的目标。文献聚类是按照内容相似性把一组文献分成几个类的过程。当前使用的文献聚类技术可分为两大类:层次聚类技术
和划分聚类技术。层次聚类技术的代表是凝聚聚类技术,划分聚类技术的代表是K-means聚类技术[1]。有效地对文献进行聚类,才可为后续文本数据分析做准备。简而言之,聚类的结果是样本数据对象构成的多个类或簇(cluster),一个簇中的对象有较高的相似度(similarity),而不同簇中的对象差异较大,而这种相似度通常通过距离来度量[2-4]。
1 K-means算法原理
K-means算法是一种非常典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即该算法认为两个对象的距离越近,其相似度就越大。最常用的样本间距离度量方法欧式距离,其计算公式为:
其中D表示样本之间的距离;1指的是样本特征的维数;d代表样本的总维数,即样本特征的总数量。[5]
该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为聚类结果的最终目标。
k个初始类聚类中心点的选取会对较大地影响聚类结果,因为在该算法第一步中是选取初始聚类的中心,即k值,指定k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。
如下图是一个K=4的聚类示意图,每个点都是到自己所在的簇的均值点更近,而这个均值点可以是原始数据中的点,也可以是一个不存在的点,即不属于原始数据集中的点[6]。
由于本文笔者将研究K-means算法用于中文文献聚类的Python实现方法,而并非某类实证研究,所以笔者只选取了较少的文献数据为例进行说明,选取中国知网中有关大数据方向的被引量前50名的文献进行聚类,从而浅谈K-means算法用于中文文献聚类。
2 文献特征表示
聚類分析首先需要处理数据集的特征选择或变换。实际上,特征选择与特征变换是降维技术的两大分类。特征选择指的是从数据样本集的所有特征(或称属性)中选择更有利于达到某种目标的若干属性,即原始属性集的一一个子集,同时也达到了降低维度的目的;而特征变换则是指通过某种变换将原始输入空间的属性映射到一个新的特征空间,然后在特征空间中根据规则选择某些较为重要的变换后的特征[7-10]。
笔者使用Python语言中的Jieba分词对50篇文献进行分词。在文献特征化表示的过程中,调用Python语言中count_vec.fit_transform方法,即可将文献转换为词篇矩阵,在此过程中类似于“的”等单字和标点符号会被自动删除,所以在此过程中并不需要利用停用词表进行预处理。以下分别按照关键词和摘要对文献进行向量化表示,得到词篇矩阵结果为:
其中将分词后的每一个词作为一个维度,原文献中出现该词语,对出现次数进行计数。以所有词语构成的多维向量空间表示该文献。同理可得到文献摘要的词篇矩阵。将文献转换为词篇矩阵后,即完成了文献特征表示。
3 利用评价指标确定最优聚类簇数
支持由于K-means算法需要事先人为指定算法聚类的簇数,即指定k的取值,所以k值的选取对聚类结果具有较大的影响,在进行最终聚类前,笔者将引用Calinski-Harabaz(CH)指标,轮廓系数(silhouette coefficient)指标和簇内误方差(SSE)指标作为评价指标,首先使用for循环对不同k值的聚类结果进行评价汇总,并利用图像进行可视化表示,从而确定K-means算法最优聚类簇数,即k值。
3.1 Calinski-Harabaz(CH)指标
CH指标是通过计算每个类中各点与类中心点的距离平方和来度量聚类后各类内的紧密程度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。因此,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。
其中,n表示聚类的数目,k表示当前的类,trB(k)表示类间离差矩阵的迹,trW(k)表示类内离差矩阵的迹。类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。Python语言中scikit-learn包中评价指标Calinski-Harabasz Index对应的方法是metrics. calinski_harabaz_score.通过图形可以直观的观察到k对于聚类结果的影响。当簇数量为几的时候出现了峰值,这说明k取几是一个不错的选择。
3.2 轮廓系数(silhouette coefficient)指标
轮廓分析(silhouette analysis),是使用图形工具来度量簇中样本的聚集程度。该评价算法通过三个步骤可以计算出当个样本的轮廓系数(silhouette coefficient):第一步是将样本x与簇内的其他点之间的平均距离作为簇内的内聚度a。第二步是将样本x与最近簇中所有点之间的平均距离看作是与最近簇的分离度b。第三步是将簇的分离度与簇内聚度之差除以二者中比较大的数得到轮廓系数,其计算公式如下:
Python语言中scikit-learn包中该评价指标对应的方法是metrics.silhouette_score.轮廓系数的取值在–1到1之间。当簇内聚度与分度离相等时,轮廓系数为0。当b>>a时,轮廓系数近似取到1,此时模型的性能最佳。通过图形可以直观的观察到k对于聚类结果的影响。当簇数量为几的时候出现了峰值,这说明k取几是一个不错的选择。
3.3 簇内误方差(SSE)指标
在对簇的划分中,我们就使用了SSE作为目标函数来划分簇。当KMeans算法训练完成后,我们可以通过使用inertia属性来获取簇内的误方差,不需要再次进行计算。计算公式为:
Python语言中通过对应kmeans.inertia_属性来获取簇内的误方差,同时可以使用图形工具肘方法,根据簇的数量来可视化簇内误方差。通过图形可以直观的观察到k对于簇内误方差的影响。当簇数量为几的时候出现了肘型,这说明k取几是一个不错的选择。
笔者选用以上三种评价指标用于确定聚类的最优簇数,但需要注意的是不同的评价指标对于不同的数据源,其敏感程度不同,所以笔者同时使用三种评价指标,通过对比观察得到最优k值的取值范围。
4 利用关键词对文献进行聚类
实验利使用CountVectorizer方法将每篇文献的关键词转换为词篇矩阵后,利用Python语言中中对应的KMeans(n_clusters=k, random_state=0).fit()方法对关键词词篇矩阵进行聚类,并利用CH指标,轮廓系数指标和簇内误方差指标(SSE)作为评价指标,确定K-means算法的最优k值,在Python语言中使用for循环进行计算,并对结果使用matplotlib进行绘图展示,其结果见图2,图3,图4。
对比以上三个评价指标,由图像可知CH指标在k取值为13和26时出现波峰,但该波峰并不明显。轮廓系数指标在k取值为14和26时出现波峰,且相对明显。而SSE指标图形在k取值为26以后变化较为稳定。因此笔者将K-means算法的K值确定为14和26,使用Python语言对应的KMeans(n_clusters=k, random_state=0).fit()方法,即将文献按照关键词聚为14类或26类时,分别得到聚类后的结果,再使用PCA(n_components=2)将多维结果降维到二维空间,使用matplotlib对结果进行可视化绘图,最终结果见图5,图6。
由上两张图观察可得,利用三个评价指标选出的最优簇数,无论是将文献分为14簇還是26簇,代表文献的圆点都有明显地交叉,无法将文献较好地进行聚类。
5 利用摘要对文献进行聚类
使用CountVectorizer方法将每篇文献的摘要转换为词篇矩阵后,同样利用Python中对应的KMeans(n_clusters=k, random_state=0).fit()方法,利用for循环多次计算各指标结果,并使用matplotlib绘制CH指标,轮廓系数指标和簇内误方差指标结果图像作为评价指标,确定K-means算法的最优K值。其结果为:
对比以上三个评价指标,由图像可知CH指标在k取值为8时最先出现波峰。轮廓系数指标在k取值为2、3和5时出现相对明显波峰。而SSE指标图形在k取值为8以后变化较为稳定。笔者将K-means算法的K值确定为2、3、5和8,即将文献按照关键词聚为2类、3类、5类或8类时,使用Python语言对应的KMeans(n_clusters=k, random_state=0).fit()方法,分别得到聚类后的结果,再使用PCA(n_components=2)将多维结果降维到二维空间,使用matplotlib对结果进行可视化绘图,分别得到聚类后的结果为:
由上面三个图对比观察可得,当k取值为2时,聚类效果较好,即利用摘要可以较好地将文献分为2类文献聚类结果如下:
文献聚类后,人为观察聚类后的两类文献,笔者发现第一组聚类结果主要涵盖大数据系统、模型、算法等技术类研究文献和数据与金融、教育、城市发展的主题结合的实用类研究文献。第二类聚类结果则是涵盖研究综述,发展现状与展望等理论性研究文献。
为了更准确地对聚类后的文献进行分析,笔者认为可以计算聚类后的文献关键词的相关系数,进一步对聚类后的文献进行分析。笔者在这里选用的是皮尔森相关系数(Pearson correlation coefficient),也称皮尔森积矩相关系数(Pearson product-moment correlation coefficient),是一种线性相关系数。皮尔森相关系数是用来反映两个变量线性相关程度的统计量。相关系数用r表示,其中n为样本量,分别为两个变量的观测值和均值。r描述的是两个变量间线性相关强弱的程度。r的绝对值越大表明相关性越强。计算公式为:
可以通过K-means算法对关键词进行聚类,可得到聚类后文献中个关键词之间的关系,首先是使用Python语言中的.corr()方法对经由CountVectorizer方法特征提取后的关键词词篇矩阵进行相关系数计算,得到一个相关系数矩阵,然后KMeans(n_clusters=k, random_state=0).fit()方法对相关系数矩阵进行聚类,再使用PCA(n_components=2)将多维结果降维到二维空间,最后使用matplotlib对结果进行可视化绘图,其结果为。
由图14可以直观看出,第一组中可将关键词分为5类,即该组文献中涵盖以下几个方面的内容:第一类为深度、智能、机器学习等;第二类为数据分析、大数据等;第三类为数据管理、信息安全等;第四类为知识计算;第五类为互联网金融。
由图15可以看出,第二组中可将关键词分为3类,即该组文献中涵盖以下几个方面的内容:第一类为信息、电网等;第二类为文计算、数据处理技术等;第三类为数据挖掘、数据分析等。
6 总结
作为一种无监督的机器学习方法, 聚类因其不需要训练过程、不需要预先对文档手工标注类别, 故具有较高的灵活性和自动化处理能力,为对文本信息进行有效组织、摘要和导航的重要手段[11-12]。笔者认为利用K-means算法对中文文献进行聚类时,应该使用文献摘要进行聚类,首先利用Python语言对文献摘要进行特征表示,即将中文文献转换为词篇矩阵,再利用Calinski-Harabaz(CH)指标,轮廓系数(silhouette coefficient)指标和簇内误方差(SSE)标作为评价指标,从而确定K-means算法最优聚类簇数,即k值。可以选出多组K值在进行绘图比较,从而确定最优聚类簇数得到最后聚类结果。关键词不能较好地对文献进行聚类,但笔者认为可以计算聚类后同类别文献关键词的相关系数,从而得出各关键词之间的联系,达到进一步对文献进行分析的目的。
参考文献
[1] 李慧, 刘东苏, 任志纯. 文献聚类技术及其评价函数[J]. 情报技术, 2004, 20(7): 17-18.
[2] 陈磊磊. 不同距离测度的K-Means 文本聚类研究[J]. 软件, 2015, 36(1): 56-61.
[3] 申超波, 王志海, 孙艳歌. 基于标签聚类的多标签分类算法[J]. 软件, 2014, 35(8): 16-21.
[4] 唐波. 改进的K?means聚类算法及应用[J]. 软件, 2012, 33(3): 100-104.
[5] DUDARO, HARTPE, TORKDG. Pattern classification (2nd Edition)[M]. New York: John Wiley & Sons, 2001: 47-56.
[6] iphilo.k-mwans算法原理及numpy实现[EB/OL]. https://blog. csdn.net/iphilo/article/details/80735944, 2018-06-19/2019-04-16.
[7] 章永来, 周耀鉴. 聚类算法综述. 计算机应用, 2019. doi: 101177/j..issn.1001-9081.2019010174.
[8] 田瑞, 闫丹凤. 针对特定主题的短文本向量化[J]. 软件, 2012, 33(11): 202-205.
[9] 袁爱领, 齐伟, 钱旭. 基于流形正则化的支持向量机文本分类[J]. 软件, 2013, 34(2): 65-68.
[10] 姚清耘, 刘功申, 李翔. 基于向量空间模型的文本聚类算法[J]. 计算机工程, 2008, 34(18): 39-41中的应用[J]. 软件, 2013, 34(1): 158-159.
[11] 郑世卓, 崔晓燕. 基于半监督LDA的文本分类应用研究[J]. 软件, 2014, 35(1): 46-48.
[12] 张彬. 探讨人工智能在计算机网络技术中的应用[J]. 软件, 2012, 33(11): 265-266.