kmeans实现文本聚类

  • Post author:
  • Post category:其他


需求

拿到的需求是输入n个文本,对文本进行聚类,由于这些输入不能通过历史数据进行训练,所以这个主要就是用无监督学习来解决。

kmeans

谈到聚类就会想到kmeans,它的核心思想是给定的K值和K个初始质心将样本中每个点都分到距离最近的类簇中,当所有点分配完后根据每个类簇的所有点重新计算质心,一般是通过平均值计算,然后再将每个点分到距离最近的新类簇中,不断循环此操作,直到质心不再变化或达到一定的迭代次数。

分词

会使用一些工具进行分词,比如IKAnalyzer,同时也支持将停词去掉。

词库

刚开始分类效果不是很好,于是改进词库。对于特定行业的分词,为提高分词的准确性及专业性,可以收集更准确的词库用于分词。可以由搜狗

pinyin.sogou.com/dict/

搜索各种类别的词汇,自己下载下来再整理,它的格式为scel,可以使用深蓝词汇转换工具转成txt方便使用。

特征集

特征集的确定是文本向量化的第一步,只有特征集确定好了才能进一步确定向量的值,那么怎么确定特征集呢?一般的做法可以是将所有样本的词都提取出来作为特征集。比如我们有两个文本 “小学生上学”和“股票大跌”,那特征集就是{“小学生”,”上学”,”股票”,”大跌”}。

特征权重

向量化第二部就是确定特征集的权重,特征集可以看成是向量的维数,而对于每个样本来说就需要确定每个维度的值了,这个值就可以看成是特征的权重,常常用TF-IDF作为值。TF-IDF又是什么?简单来说TF就是某文档中某个term出现的次数,而IDF即逆文档频率,可由下面公式计算:

其中,T为统计样本中总文档数,t为包含某term的文档数。

TF和IDF的相乘则为特征权重。

特征降维

其实就是通过某种方法选择出比较相关的一些特征,将一些无关的特征去掉,达到特征降维效果。比如可以通过卡方检验,这里选择了用其他方式,提取热词。即认为每个文档的热词能代表该文档,由热词组成特征。

主要代码

public int[] learn(List textList) {
    List vectorList = VectorUtil.getVectorDimension(textList);
    double[][] datas = VectorUtil.getVector(textList.size(), vectorList, idf);
    KMeans kmeans = new KMeans(datas, K, ITERATE);
    return kmeans.getClusterLabel();
}复制代码

Github


github.com/sea-boat/Te…

以下是


广告





相关阅读

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到

item.jd.com/12185360.ht…

进行预定。感谢各位朋友。

=========================

相关阅读:


k-means 聚类算法



如何用机器学习对文本分类



如何对热词进行提取

欢迎关注:

这里写图片描述