聚类分析是一种无监督机器学习(训练样本的标记信息是未知的)算法,它的目标是将相似的对象归到同一个簇中,将不相似的对象归到不同的簇中。如果要使用聚类分析算法对一堆文本分类,关键要解决这几个问题:
- 如何衡量两个对象是否相似
- 算法的性能怎么度量
- 如何确定分类的个数或聚类结束的条件
- 选择哪种分类算法
下面就带着这几个问题,以我工作中的一个业务需求为例,来学习一下怎么对中文文本进行聚类。(此文略长,包含了理论基础、算法院里、代码实现和实验效果分析)
一. 业务需求
我在工作中遇到这样一个需求:有个铁路通信专业的业务系统,收集了一些通信设备的生产厂商信息,共4500多条。由于数据是人工录入的,非常不规范,存在数据重复、信息不规范、错别字等现象,需要对数据进行分析归类,将相同或相似的数据划到一起,再通过人工审核规范数据,最终形成规范的字典数据。
二、理论基础
1. 相似度计算
- 欧氏距离
欧氏距离是一种常用的距离定义,指在m维空间中两个点之间的真实距离,对多维向量A=(A1,A2,……,An),B=(B1,B2,……,Bn),欧氏距离的计算公式如下:
-
余弦相似度
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体差异的大小。相比欧氏距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上的差异。余弦值的计算公式如下:
相对于欧氏距离,余弦相似度更适合计算文本的相似度。首先将文本转换为权值向量,通过计算两个向量的夹角余弦值,就可以评估他们的相似度。余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量方向越接近;越趋近于-1,代表他们的方向越相反。为了方便聚类分析,我们将余弦值做归一化处理,将其转换到[0,1]之间,并且值越小距离越近。
2. 性能度量
在选择聚类算法之前,首先来了解什么样的聚类结果是比较好的。我们希望同一个簇内的样本尽可能相似,不同簇的样本尽可能不同,也就是说聚类结果的“簇内相似度”高且“簇间相似度”低。
考虑聚类结果的簇划分, 定义:
其中,代表簇的中心点; 代表簇内样本的平均距离;代表簇内样本间的最远距离;对应于簇和簇最近样本间的距离;对应于簇和 中心点间的距离。基于以上公式可导出下面两个常用的聚类性能度量内部指标:
- DB指数(Davies-Bouldin Index,简称DBI)
- Dumn指数(Dumn Index,简称DI)