[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像

news2025/1/13 15:36:41

前言


本文主要讲述以下几点:
        1.通过scikit-learn计算文本内容的tfidf并构造N*M矩阵(N个文档 M个特征词);
        2.调用scikit-learn中的K-means进行文本聚类;
        3.使用PAC进行降维处理,每行文本表示成两维数据;
        4.最后调用Matplotlib显示聚类效果图。

输入


文本输入是读取本地的01_All_BHSpider_Content_Result.txt文件,里面包括1000行数据,其中001~400行为景区、401~600为动物、601~800为人物明星、801~1000为国家地理文本内容(百度百科摘要信息)。
该内容可以自定义爬虫进行爬取,同时分词采用Jieba进行。

 免费下载包括代码py文件和01_All_BHSpider_Content_Result.txt。
下载地址:http://download.csdn.net/detail/eastmount/9410810
 



源代码

代码如下,详见注释和后面的学习笔记推荐:

[python] view plain copy

  1. # coding=utf-8  
  2. """ 
  3. Created on 2016-01-16 @author: Eastmount
  4. 输入:打开txt 对应1000个文本
  5. 001~400 5A景区 401~600 动物 601~800 人物 801~1000 国家 
  6. 输出:txt tfidf值聚类图形 1000个类标 
  7. 参数:weight权重这是一个重要参数 
  8. """
  9. importtime            
  10. importre            
  11. importos    
  12. importsys  
  13. importcodecs  
  14. importshutil  
  15. importnumpy as np  
  16. importmatplotlib  
  17. importscipy  
  18. importpyplot as plt  
  19. fromsklearn importfeature_extraction    
  20. fromfeature_extraction.text importTfidfTransformer    
  21. fromfeature_extraction.text importCountVectorizer  
  22. fromfeature_extraction.text importHashingVectorizer   
  23. if__name__ == "__main__":  
  24. #########################################################################
  25. #                           第一步计算TFIDF  
  26. #文档预料空格连接  
  27. corpus = []  
  28. #读取预料一行预料为一个文档  
  29. forline in open('01_All_BHSpider_Content_Result.txt', 'r').readlines():  
  30. #print line
  31. append(line.strip())  
  32. #print corpus
  33. #参考: http://blog.csdn.net/abcjennifer/article/details/23615947
  34. #vectorizer = HashingVectorizer(n_features = 4000)
  35. #将文本中的词语转换为词频矩阵矩阵元素a[i][j] 表示j词在i类文本下的词频  
  36. vectorizer = CountVectorizer()  
  37. #该类会统计每个词语的tf-idf权值
  38. transformer = TfidfTransformer()  
  39. #第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
  40. tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))  
  41. #获取词袋模型中的所有词语  
  42. word = vectorizer.get_feature_names()  
  43. #将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
  44. weight = tfidf.toarray()  
  45. #打印特征向量文本内容
  46. print'Features length: ' + str(len(word))  
  47. resName = "BHTfidf_Result.txt"
  48. result = codecs.open(resName, 'w', 'utf-8')  
  49. forin range(len(word)):  
  50. write(word[j] + ' ')  
  51. write('\r\n\r\n')  
  52. #打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重  
  53. forin range(len(weight)):  
  54. #print u"-------这里输出第", i, u"类文本的词语tf-idf权重------"  
  55. forin range(len(word)):  
  56. #print weight[i][j],
  57. write(str(weight[i][j]) + ' ')  
  58. write('\r\n\r\n')  
  59. close()  
  60. ########################################################################
  61. #                               第二步聚类Kmeans  
  62. print'Start Kmeans:'  
  63. fromcluster importKMeans  
  64. clf = KMeans(n_clusters=4)   #景区动物 人物 国家  
  65. s = clf.fit(weight)  
  66. prints  
  67. '''''
  68. print 'Start MiniBatchKmeans:'
  69. from sklearn.cluster import MiniBatchKMeans
  70. clf = MiniBatchKMeans(n_clusters=20)
  71. s = clf.fit(weight)
  72. print s
  73. '''
  74. #中心点
  75. print(clf.cluster_centers_)  
  76. #每个样本所属的簇
  77. label = []               #存储1000个类标4个类  
  78. print(clf.labels_)  
  79. i = 1  
  80. whilei <= len(clf.labels_):  
  81. printi, clf.labels_[i-1]  
  82. append(clf.labels_[i-1])  
  83. i = i + 1  
  84. #用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数137281791
  85. print(clf.inertia_)  
  86. ########################################################################
  87. #                               第三步图形输出 降维  
  88. fromdecomposition importPCA  
  89. pca = PCA(n_components=2)             #输出两维
  90. newData = pca.fit_transform(weight)   #载入N维
  91. printnewData  
  92. #5A景区
  93. x1 = []  
  94. y1 = []  
  95. i=0  
  96. whilei<400:  
  97. append(newData[i][0])  
  98. append(newData[i][1])  
  99. i += 1  
  100. #动物
  101. x2 = []  
  102. y2 = []  
  103. i = 400  
  104. whilei<600:  
  105. append(newData[i][0])  
  106. append(newData[i][1])  
  107. i += 1  
  108. #人物
  109. x3 = []  
  110. y3 = []  
  111. i = 600  
  112. whilei<800:  
  113. append(newData[i][0])  
  114. append(newData[i][1])  
  115. i += 1  
  116. #国家
  117. x4 = []  
  118. y4 = []  
  119. i = 800  
  120. whilei<1000:  
  121. append(newData[i][0])  
  122. append(newData[i][1])  
  123. i += 1  
  124. #四种颜色红 绿 蓝 黑  
  125. plot(x1, y1, 'or')  
  126. plot(x2, y2, 'og')  
  127. plot(x3, y3, 'ob')  
  128. plot(x4, y4, 'ok')  
  129. show()  




输出结果


采用Kmeans中设置类簇数为4,分别表示景区、动物、明星和国家。
其中运行结果如下图所示,包括17900维tfidf特征向量: 


聚类输出结果如下图所示:其中"红-景区 绿-动物 蓝-人物 黑-国家"。由于数据集比较小,文本聚类效果还是很明显的,而LDA算法是计算每个主题分布的算法,推荐你也去学习下。




性能评估


这里我想结合文本聚类简单叙述下最常用的评估方法:
        正确率 Precision = 正确识别的个体总数 /  识别出的个体总数
        召回率 Recall = 正确识别的个体总数 /  测试集中存在的个体总数
        F值 F-measure = 正确率 * 召回率 * 2 / (正确率 + 召回率)

由于"clf.labels_"会返回聚类每个样本所属的簇,比如1000行数据,就会返回1000个label值。同时,clf = KMeans(n_clusters=4)设置了类簇为4,故每个值对应在0、1、2、3中的一个,统计结果如下:

其中以世界国家为例,label1数目为198,同时识别出的个体数=198(世界国家)+2(动物)=200,故:
        准确率=198/200=0.990
其中动物里面有两个聚类到了世界国家中。而召回率我以人物明星为例,因为知道测试集中601~800这200个数据对应人物明星,故测试集中存在个体数为200,而正确识别数目为185个,故:
        召回率=185/200=0.925
最后计算F值即可。同时可以计算宏平均聚类准确率(Macro-Prec)和宏平均召回率(Macro-Rec)。




总结及推荐学习资料

代码中有几个问题我没有实现,包括:
        (1) 使用HashingVectorizer(n_features = n)设置维数,如何选择更合理的特征;
        (2) 调用plt.legend([plot1, plot2, plot3, plot4], (u'景区', u'动物', u'明星', u'国家') )
报错"AttributeError: 'NoneType' object has no attribute 'tk'";
        (3) sklearn其它聚类算法以及设置聚类中心点。

但是对那些刚接触Python聚类算法的同学 ,这篇文章还是有一定帮助的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode 安装勾选项解释

1、通过code 打开“操作添加到windows资源管理器文件上下文菜单 &#xff1a;把这个两个勾选上&#xff0c;可以对文件使用鼠标右键&#xff0c;选择VSCode 打开。 2、将code注册为受支持的文件类型的编辑器&#xff1a;不建议勾选&#xff0c;这样会默认使用VSCode打开支持的相…

opencv简单使用

cv2库安装&#xff0c; conda install opencv-python注意cv2使用时&#xff0c;路径不能有中文。&#xff08;不然会一直’None’ _ update # 处理中文路径问题 def cv_imread(file_path): #使用之前需要导入numpy、cv2库&#xff0c;file_path为包含中文的路径return cv2.imd…

使用sklearn函数对模型进行交叉验证

使用sklearn函数对模型进行交叉验证 交叉验证用来做什么sklearn 中的函数 交叉验证用来做什么 交叉验证&#xff08;Cross-Validatio&#xff09;&#xff0c;是用于在驯良过程中对训练模型的性能和参数进行评估选择的技术。 它的意义在于能够充分利用优先的数据集&#xff0…

08-信息收集-架构、搭建、WAF等

信息收集-架构、搭建、WAF等 信息收集-架构、搭建、WAF等一、前言说明二、CMS识别技术三、源码获取技术四、架构信息获取技术五、站点搭建分析1、搭建习惯-目录型站点2、搭建习惯-端口类站点3、搭建习惯-子域名站点4、搭建习惯-类似域名站点5、搭建习惯-旁注&#xff0c;c段站点…

汽车OTA活动高质量发展的“常”与“新”

伴随着车主的频繁崔更&#xff0c;车企除了卷硬件、拼价格&#xff0c;逐渐将精力转移到汽车全生命周期的常用常新。时至下半年&#xff0c;车企OTA圈愈发热闹&#xff0c;以新势力、新实力为代表新一代车企&#xff0c;OTA运营活动逐渐进入高质量发展期。 所谓高质量&#xf…

K8S应用笔记 —— 部署Dolphinscheduler及简单应用(二)告警通知

一、本章目标 演示Dolphinscheduler的告警通知功能&#xff0c;将SQL任务组件查询返回结果集指定为邮件通知内容&#xff08;支持为&#xff1a;表格、附件或表格附件三种模板&#xff09;。 二、 前提条件 已完成Dolphinscheduler部署 K8S集群部署&#xff0c;可参考文章&a…

2023年05月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字放大 给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。 时间限制:1000 内存限制:65536 输入 包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格分开; 第三行包含一个整数(不超过整…

负载均衡下的webshell

文章目录 1.场景描述2.在蚁剑里添加 Shell3.因为负载均衡而出现的问题4.问题解决方案4.1 方案14.2 方案24.3 方案3 1.场景描述 当前手里有一个以docker部署的Tomcat负载均衡环境。主机对外ip和端口为192.168.100.130:18080 我们假设其为一个真实的业务系统&#xff0c;存在一…

QT的布局与间隔器介绍

布局与间隔器 1、概述 QT中使用绝对定位的布局方式&#xff0c;无法适用窗口的变化&#xff0c;但是&#xff0c;也可以通过尺寸策略来进行 调整&#xff0c;使得 可以适用窗口变化。 布局管理器作用最主要用来在qt设计师中进行控件的排列&#xff0c;另外&#xff0c;布局管理…

Newsprk Newspaper新闻报纸WordPress主题

Newsprk Newspaper新闻报纸WordPress主题对于任何使用 WordPress 技术构建的新闻和杂志网站来说都是一个有吸引力且时尚的主题。Newsprk – 报纸 WordPress 主题非常适合任何新闻/杂志或与以下类别匹配的任何特定业务&#xff0c;如博客、体育、时尚、科学、足球、政治、视频、…

足部IMU在复杂场景中行走定位

随着微机电系统&#xff08;MEMS&#xff09;技术的快速发展&#xff0c;基于MEMS的惯性导航系统&#xff08;INS&#xff09;在任意环境的基站定位方面发挥着至关重要的作用。惯性导航具有自主性强、定位频率高、功耗低、实时性强等特点。因此更适合单兵作战、反恐行动、应急救…

基于LSTM深度学习网络的时间序列分析matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 % 随机打乱数据集并划分训练集和测试集 index_list randperm(size(wdata, 1)); ind …

SpringBoot + Vue 微人事 项目 (第八天)

基础信息设置 在该页面添加一个大div&#xff0c;然后添加一个tab选项卡&#xff0c;Element UI里面有 把代码复制到大div里面&#xff0c;把里面的label和name属性改成我们想要的&#xff0c;再把tab-click"handleClick"去掉 <div><el-tabs v-model"a…

vue中实现文字检索时候将搜索内容标红

实现结果 html&#xff1a; <div class"searchBox"><span class"bt">标&#8195&#8195题</span><div class"search"><div class"shuru"><!-- <span class"title">生产经营<…

HTTP 握手过程

HTTP 握手过程 TCP 建立连接 3 次握手 客户端请求连接服务器服务器响应成功客户端回应服务器准备开始连接 TCP 结束连接 4 次挥手 客户端向服务器发送&#xff0c;断开请求服务器向客户端发送&#xff0c;还有数据没有传输完毕&#xff0c;请稍等服务器向客户端发送&#x…

使用css实现点击切换active效果

不使用js&#xff0c;纯css实现点击切换active样式 一个父盒子中嵌套小标签,横向排列 html <div class"box"><a href"#">选项1</a><a href"#">选项2</a><a href"#">选项3</a><a href&…

opencv图像特征-sift(尺度不变特征转换)

图像尺度空间 在一定的范围内&#xff0c;无论物体是大还是小&#xff0c;人眼都可以分辨出来&#xff0c;然而计算机要有相同的能力却很难&#xff0c;所以要让机器能够对物体在不同尺度下有一个统一的认知&#xff0c;就需要考虑图像在不同的尺度下都存在的特点。 尺度空间…

不花一分钱,利用免费电脑软件将视频MV变成歌曲音频MP3

教程 1.点击下载电脑软件下载地址&#xff0c;点击下载&#xff0c;安装。&#xff08;没有利益关系&#xff0c;没有打广告&#xff0c;只是单纯教学&#xff09; 2.安装完成后&#xff0c;点击格式工厂 3.然后如图所示依次&#xff0c;点击【音频】->【-MP3】 3.然后点击…

springBoot 配置文件 spring.mvc.throw-exception-if-no-handler-found 参数的作用

在Spring Boot应用中&#xff0c;可以通过配置文件来控制当找不到请求处理器&#xff08;handler&#xff09;时是否抛出异常。具体的配置参数是spring.mvc.throw-exception-if-no-handler-found。 默认情况下&#xff0c;该参数的值为false&#xff0c;即当找不到请求处理器时…

【C语言知识】数据在内存中的存储

文章目录 一、数据类型介绍二、整型在内存中的存储2.1 原码、反码、补码计算方法&#xff1a; 2.2 大小端介绍 三、浮点数在内存中的存储3.1 浮点数存储规则&#xff1a;3.2 对于M和E的特别规定&#xff1a; 写在最后 深度剖析数据在内存中的存储 一、数据类型介绍 //整型家族…