文本聚类
文本聚类简单点的来说就是将文本视作一个样本,在其上面进行聚类操作。但是与我们机器学习中常用的聚类操作不同之处在于。
我们的聚类对象不是直接的文本本身,而是文本提取出来的特征。因此如何提取特征因而是非常重要的一步。在HanLP中一共有三个文本聚类方法。前两种都基于词袋模式,第一个是最常见的聚类算法:k-means,但HanLP不光实现了k-means,还实现了速度更快效果更好的repeated bisection算法(重复二分法,还是翻译为累次平方法,好像是第一种)。笔者动笔前段时间刚刚添加了一个新的聚类分析器是,基于词向量的kmens聚类分析器。
基于词向量的kmeans聚类分析器,输入的需要时词向量化后的文件。虽然HanLP的词向量在Java实现中,还算可以,但在Python中使用不算太好用,同时Python也不推荐用HanLP做词向量,我们有更好的工具。所以这里我们也就不画蛇添足了。
而对于前两个聚类分析器而言,其聚类模块可以接受任意文本作为文档,而不需要用特殊分隔符隔开单词。另外,该模块还接受单词列表作为输入,用户可以将英文、日文等预先切分为单词列表后输入本模块。统计方法适用于所有语种,不必拘泥于中文。
分词器的性能问题
在repeated bisection算法无论性能还是速度都要优于kmens,但是在本人的测试中,前者速度基本原作者一致约为kmeans的三倍左右,但是性能略低于后者。此处请读者自行斟酌。
分词器的参数
自动判断聚类个数k(此处来自于原文:HanLP中的文本聚类
很多时候用户可能觉得聚类个数k这个超参数很难准确指定。在repeated bisection算法中,有一种变通的方法,那就是通过给准则函数的增幅设定阈值beta来自动判断k。此时算法的停机条件为,当一个簇的二分增幅小于beta时不再对该簇进行划分,即认为这个簇已经达到最终状态,不可再分;当所有簇都不可再分时,算法终止,此时产生的聚类数量就不再需要人工指定了。
在HanLP中,repeated bisection算法提供了3种接口,分别需要指定k、beta或两者同时指定。当同时指定k和beta时,满足两者的停止条件中任意一个算法都会停止。当只指定一个时,另一个停止条件不起作用。这三个接口列举如下:
public List<Set<K>> repeatedBisection(int nclusters)
public List<Set<K>> repeatedBisection(double limit_eval)
public List<Set<K>> repeatedBisection(int nclusters, double limit_eval)
当我们使用analyzer.repeatedBisection(1.0)时,可以进行自动聚类。
from pyhanlp import *
ClusterAnalyzer = SafeJClass('com.hankcs.hanlp.mining.cluster.ClusterAnalyzer')
analyzer = ClusterAnalyzer()
# 我们需要调用并返回自身
analyzer.addDocument("赵一", "流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 蓝调, 蓝调, 蓝调, 蓝调, 蓝调, 蓝调, 摇滚, 摇滚, 摇滚, 摇滚");
analyzer.addDocument("钱二", "爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲");
analyzer.addDocument("张三", "古典, 古典, 古典, 古典, 民谣, 民谣, 民谣, 民谣");
analyzer.addDocument("李四", "爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 金属, 金属, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲");
analyzer.addDocument("王五", "流行, 流行, 流行, 流行, 摇滚, 摇滚, 摇滚, 嘻哈, 嘻哈, 嘻哈");
analyzer.addDocument("马六", "古典, 古典, 古典, 古典, 古典, 古典, 古典, 古典, 摇滚");
print(analyzer.repeatedBisection(1.0))
[[李四, 钱二], [王五, 赵一], [张三, 马六]]
评测
评测程序仍然使用搜狗文本分类语料库迷你版。过程为首先遍历子目录读取文档,以子目录+文件名作为id将文档传入聚类分析器进行聚类,并且计算F1值返回。该计算过程已被原作者封装为接口,我们可以直接调用
CORPUS_FOLDER = "/home/fonttian/Data/CNLP/textClassification/sogou-mini/搜狗文本分类语料库迷你版"
for i in ["kmeans", "repeated bisection"]:
print(i, ClusterAnalyzer.evaluate(CORPUS_FOLDER, i) * 100)
kmeans 83.97065954968313
repeated bisection 82.71523522720585
文章来源FontTian的博客
相关推荐
文中还提出了一个基于传统模型的中文文本聚类模型,并详细介绍了新算法的实现。实验结果表明,新算法的准确性比传统文本聚类算法高 4%。此外,作者还讨论了文本向量空间模型对分类准确性的影响,并与 K-means 算法、...
java文本聚类程序代码文件,实现文本聚类功能,分词
包含KMeans、DBSCAN、LDA和Single_Pass的文本聚类算法程序(python实现)。 详细信息: 基于KMeans的无监督中文文本聚类 基于DBSCAN的无监督中文文本聚类 基于LDA的无监督文本聚类 基于single pass 策略进行聚类,不...
资料说明:包括数据+代码+文档+代码讲解。 1.项目背景 2.数据获取 3.数据预处理 4.探索性数据分析 5.特征工程 6.构建聚类模型 7.结论与展望
设计并实现了一个并行K-means聚类算法和Web文本聚类原型系统,可进行并行K-means算法的划分聚类和基于层次的组平均聚类。利用几 组Web文本数据集对基本的K-means算法和改进的算法以及基于层次的组平均算法进行试验和...
对文本进行聚类,文本预处理-->构造特征向量-->聚类,压缩包内含有实验用语料亲测可用, 谢谢支持。
基于文本内容的自动文本聚类技术作为文本信息挖掘技术中的核心技术之一,其目标是 将文档集合分成若干个簇,要求同一簇内文档内容的相似度尽可能的大,而不同簇之间的相 似度尽可能的小。 本文以中文文本作为文本...
基于粒子群优化的模糊文本聚类研究,柴瑞敏,王月,针对模糊文本聚类算法对输入顺序以及初始点的敏感的问题,提出了一种粒子群群优化的改进模糊聚类算法。该算法采用粒子群优化算法
java文本聚类使用Kmeans算法实现
互联网信息搜索,文本聚类课件,不错哦,文本聚类课件,不错哦,
java实现的文本聚类使用了kmeans算法
一个简单的K-means文本聚类Java实现,可以让你了解怎样去实现一个自己的文本聚类方法
本数据集是用于文本聚类的中文文本数据,数据集不大属于小型数据集,主要是为了验证本人在博客上写的代码,拿到立马就可使用实现可参考本人的博客
利用十大经典机器学习算法之一的KNN(K近邻)算法,实现文本自动聚类。
kmeans文本聚类算法的简单实现,是用JAVA实现的
文本聚类中的DBSCAN算法的实现,感谢指教
使用python实现中文文本聚类,利用kmeans算法,包含jiba分词方法等
一篇关于几种文本聚类算法的介绍的论文,同时对几种算法进行了比较和分析
文本聚类是文本挖掘的一项重要技术,可广泛应用于文本挖掘与信息检索 等方面,在大规模文本集的组织与浏览、文本集层次归类的自动生成等方面都 具有重要的应用价值。但是,传统的文本聚类算法忽略了文本中单词之间的...