最近一段时间在文本聚类的工作,一路也遇到了不少坑,自己也写一篇文章记录了一下自己的过程.
1:什么是文本聚类
先说说聚类的概念,聚类又称群分析,是数据挖掘的一种重要的思想,聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,或者是多维空间中的一个点。聚类分析以相似性为基础,在一个聚类中的模式之间比不在同一聚类中的模式之间具有更多的相似性。(以上来自百度百科).
再说到文本聚类,文本聚类其实也就是在文本方向上的应用,首先我们要把一个个文档的自然语言转换成数学信息,这样形成高维空间点之后再去计算点与点之间的距离,然后将这些距离比较近的聚成一个簇,这些簇的中心成为簇心.而我们做的就是保证簇内点的距离足够近,簇与簇的距离足够远.
我接到的任务是在评论文本上进行聚类操作,起初以为很简单,但是发现其实还是不是很好操作的,有几个原因,一方面是评论有些部分语义其实是重复的,这样导致一些类别会重合,这样使用聚类的方法往往是不准确的,另一方面是一些评论上的词语使用近义词和一些音译字来替换词语,比如”微信”会转成”V信”等这些在分词的时候会有一些问题.并且又因为聚类是一种非监督学习,往往给我们的数据太多(给我的评论数据有80w,有多少类,什么类)我们都不知道,我们也只能轮廓系数不断地测试,找到一个合适的结果出来.
并且我们用的一些算法也有一些问题,比如我们使用的K-means方法,每一次选取的簇心是随机的,这样一来得到的结果也是每次不一样的,所以聚类算法也是比较难评价,这也是一些困难的部分.
2:文本聚类的过程
主要的过程如图所示,其实主要的部分有三个:
第一部分,分词处理,我们要把中文文章要进行分词,这一点中文文章和英文文章有一些区别,因为英文单词是单个构成的,也就不需要分词了,而我们中文是需要分词的,并且中文之间有一些词尽管大量出现,但是对于文章的分类结构起不到太大的意义,比如”的”,”了”,”么””应该”,这些词去计算他们既浪费空间又浪费时间,出于+1s的因素,我们也要节约时间啊,首先我们就加入一个停用词表,在进行分词的时候进行去掉.
第二部分:分词后将分词转换为词向量
关于词向量我们有一些比较常用的模型,比如one-hotm,BOW词袋模型,连续词袋模型(CBOW)和Skip-Gram模型和Word2vec模型,在这次任务中我是用的是BOW词袋模型,在转换为词向量值我们要将其转换成tfidf矩阵,tfidf其实可以看作是提取的特征的一次加权,是根据一个单词在当前文章中出现的频率和该单词在所有语料中出现的频率评估一个单词的重要性,当一个单词在这篇文章中出现的次数很多的时候,这个词语更加重要;但如果它在所有文章中出现的次数都很多,那么它就显得不那么重要
第三部分:选择聚类算法
这里的算法大家常用的是K-means和DBSCAN,这两种算法用的最多,但是在高维空间里边K-means似乎并不是很好,究其原因是因为维度太高,簇与簇之间的距离太小了,如果直接去聚类,这一部分似乎效果不太好,这时候就需要用到主成分分析PCA,大致的思路是大致意思就是取这个高维向量中方差最大的方向经过一些数学变换将有用的部分保留,没用的部分舍弃,这种办法同样适合分类算法中寻找最大的特征.
这一部分似乎也得单独拿出一篇文章好好写一下,毕竟太多坑了.
最后算法评测,对于K-means,我们使用的是簇的距离进行评定,对于Brich层次聚类,我们使用的是轮廓系数来评定,最后发现,这真是一个调参活,感叹真不容易.
最后效果:
红色虚线是轮廓系数,柱状图是类别,尽量多的让柱状在轮廓系数附近,我们可以认为结果取得不错.
具体的再写文章细说吧,困了休息.
祝大家度过愉快的一天