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

前言


本文主要讲述以下几点:
        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.rhkb.cn/news/95776.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8 种主流数据迁移工具技术选型

前言 最近有些小伙伴问我&#xff0c;ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…

pdf怎么合并在一起?这几个合并方法了解一下

pdf怎么合并在一起&#xff1f;在日常工作、学习和生活中&#xff0c;我们常常会遇到需要将多个PDF文件合并成一个文件的情况。比如&#xff0c;在学术论文写作中&#xff0c;我们可能需要将多篇论文合并成一个文件进行打印和提交。在工作中&#xff0c;我们可能需要将多个报告…

STM32——SPI外设总线

SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先行 时钟频率&#xff1a; fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主机模型、主或从操作 可…

耕地单目标语义分割实践——Pytorch网络过程实现理解

一、卷积操作 &#xff08;一&#xff09;普通卷积&#xff08;Convolution&#xff09; &#xff08;二&#xff09;空洞卷积&#xff08;Atrous Convolution&#xff09; 根据空洞卷积的定义&#xff0c;显然可以意识到空洞卷积可以提取到同一输入的不同尺度下的特征图&…

excel常见的数学函数篇2

一、数学函数 1、ABS(number)&#xff1a;返回数字的绝对值 语法&#xff1a;ABS(数字)&#xff1b;返回数字的绝对值&#xff1b;若引用单元格&#xff0c;把数字换为单元格地址即可 2、INT(number)&#xff1a;向小取整 语法&#xff1a;INT(数字)&#xff1b;若引用单元格…

Element Plus el-table 数据为空时自定义内容【默认为 No Data】

1. 通过 Table 属性设置 <div class"el-plus-table"><el-table empty-text"暂无数据" :data"tableData" style"width: 100%"><el-table-column prop"date" label"Date" width"180" /&g…

Python Opencv实践 - 图像仿射变换

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols img.shape[:2] print(img.shape[:2])#使用getAffineTransform来获得仿射变换的矩阵M #cv.getAffineTransform(…

Bingchat和ChatGPT主要区别

Bing Chat由chatgpt GPT-4技术提供支持&#xff0c;这是流行的ChatGPT的最新语言模型。Bing Chat通过更具交互性和上下文联动的响应来优化搜索引擎。它允许用户提出问题并获得更人性化、精确化或创造力的答案。用户还可以在答案末尾查看的参考来源。该工具可以充当个人研究、计…

大数据平台是什么意思?有什么用?一般包含哪些模块?

大数据时代&#xff0c;还有很多人不知道大数据平台是什么意思&#xff1f;有什么用&#xff1f;一般包含哪些模块&#xff1f;今天我们就一起来简单了解一下吧&#xff01;仅供参考哦&#xff01; 大数据平台是什么意思&#xff1f;有什么用&#xff1f;一般包含哪些模块&am…

Lnton羚通关于Optimization在【PyTorch】中的基础知识

OPTIMIZING MODEL PARAMETERS &#xff08;模型参数优化&#xff09; 现在我们有了模型和数据&#xff0c;是时候通过优化数据上的参数来训练了&#xff0c;验证和测试我们的模型。训练一个模型是一个迭代的过程&#xff0c;在每次迭代中&#xff0c;模型会对输出进行猜测&…

工程项目管理系统源码+功能清单+项目模块+spring cloud +spring boot em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

衣服材质等整理(时常更新)

参考文章&图片来源 https://zhuanlan.zhihu.com/p/390341736 00. 天然纤维 01. 化学纤维 02. 聚酯纤维&#xff08;即&#xff0c;涤纶&#xff09; 一种由有机二元酸和二元醇通过化学缩聚制成的合成纤维。具有出色的抗皱性和保形性&#xff0c;所制衣物在穿着过程中不容…

解决git reset --soft HEAD^撤销commit时报错

今天在使用git回退功能的时候&#xff0c;遇到以下错误&#xff1a; 解决git reset --soft HEAD^撤销commit时报错 问题&#xff1a; 在进行完commit后&#xff0c;想要撤销该commit&#xff0c;于是使用了git reset --soft HEAD^命令&#xff0c;但是出现如下报错&#xff1…

android 12系统加上TTS引擎

系统层修改&#xff1a; 1.frameworks/base/packages/SettingsProvider/res/values/defaults.xml <string name"def_tts"></string> 2.frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java loadString…

206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&a…

学习左耳听风栏目90天——第七天 7/90(学习左耳朵耗子的工匠精神,对技术的热爱)【每个程序员都该知道的事】

每个程序员都该知道的事 每个程序员都应该要读的书每个搞计算机专业的学生应有的知识LinkedIn 高效的代码复查技巧编程语言和代码质量的研究报告 每个程序员都应该要读的书 每个搞计算机专业的学生应有的知识 LinkedIn 高效的代码复查技巧 编程语言和代码质量的研究报告

MySQL中的锁机制

抛砖引玉&#xff1a;多个查询需要在同一时刻进行数据的修改&#xff0c;就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。 锁的概念 读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源&#xff0c;而相互不干扰。 写…

Spring Clould 注册中心 - Eureka,Nacos

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; Eureka 微服务技术栈导学&#xff08;P1、P2&#xff09; 微服务涉及的的知识 认识微服务-服务架构演变&#xff08;P3、P4&#xff09; 总结&#xff1a; 认识微服务-微服务技…

mysql全文检索使用

数据库数据量10万左右&#xff0c;使用like %test%要耗费30秒左右&#xff0c;放弃该办法 使用mysql的全文检索 第一步:建立索引 首先修改一下设置: my.ini中ngram_token_size 1 可以通过 show variables like %token%;来查看 接下来建立索引:alter table 表名 add f…