基于python的文本聚类分析与可视化实现,使用kmeans聚类,手肘法分析

news2024/12/28 22:33:54

1、数据预处理

由于在数据分析之前数据集通常都存在数据重复、脏数据等问题,所以为了提高

数据分析结果的质量,在应用之前就必须对数据集进行数据预处理。数据预处理的方法通常有清洗、集成、转换、规约这四个方面,接下来详细介绍这对爬取数据的预处理的去重、去停用词、数据转换这几个方法。

1.1数据去重

数据集中存在重复的样本时,会影响数据挖掘的速度和精确度,所以在利用数

据之前进行数据去重是必不可少的步骤。当数据集中的几个样本的每个属性对应的值完全一致时我们就可以认为这几个样本是重复样本。本文对爬取数据的去重,采用python 语言中的 drop_duplicates()方法实现,首先利用读入需要处理的数据,再利用上面的函数,就可以删除数据集中的重复数据,最后再将处理后的数据保存在dataframe中,完成数据的去重。在去重之前数据集的样本量为22091。而数据去重后保留15462条数据。总共删除了6629条重复数据,结果展示见图。

1.2清除脏数据

清洗脏数据的过程主要通过分词和去除停用词来实现。首先,从数据集中提取书名,并将其转换为列表格式,以便使用jieba分词工具进行处理。接下来,引入停用词库,停用词是指一些在文本中频繁出现但对文本分析没有实际意义的词汇。通过读取stopwords2.txt文件,停用词被加载到DataFrame中,并提取为列表格式。

清洗的核心在于drop_stopwords函数。该函数遍历分词后的内容,对于每个分词,检查其是否在停用词列表中。如果是,则跳过;如果不是,则将其添加到清洗后的结果中。最终,返回去除停用词后的内容和所有有效词汇,并将结果存储到新的DataFrame中。这一过程确保了后续文本分析的准确性和有效性。清洗结果如下:

1.3数据转换

主要是通过将文本数据转换成dataframe结构。通过jieba.lcut函数对每个书名进行分词,生成的分词结果存储在content_s列表中。接着,使用NumPy将content_s转换为数组,并创建一个包含分词结果的DataFrame df_content。最后得到一个所有关键词的dataframe。如下图:

  1. 词云分析

主要通过词云图的方式对文本数据进行可视化分析。首先,将包含所有词汇的DataFrame df_all_words 进行处理,通过 groupby 和 agg 方法计算每个词的频次,并按照频次降序排列。然后,将这些数据导出为Excel文件 词频.xlsx,方便后续使用。使用 WordCloud 库生成词云图。在配置中,指定了字体路径、最大词数、背景颜色及字体大小等参数。将前100个词汇及其频次传递给 fit_words 方法,用于生成词云。最后,通过 plt.imshow() 展示词云图,并用 plt.title() 设置标题为“书名词云图”,完成图像的呈现。

这种分析方式直观地展示了文本中高频出现的词汇,有助于快速理解文本的主题和重点。如下图:

根据词云图结果,"版"、"数学"、"中国" 等词汇的出现频次较高,反映了这些词在文本中占据了重要地位。"版"可能涉及不同版本的教材、丛书或教辅材料,显示了出版物在内容中的核心地位。"数学"高频出现,表明与数学相关的主题在文本中有较大份额,紧随其后的"中国"则可能与中国的学术研究、技术应用等领域相关。

高频词如"理论"、"力学"、"研究"、"技术" 和 "基础" 等,表明文本内容可能集中在科学研究、理论探索以及技术应用方面。此外,"物理"、"动力学"、"量子力学" 等词汇也显示了物理学在该文本中的重要性。

此外,出现次数较多的 "教程"、"教材"、"讲义" 等词汇表明,这些内容可能是教育资源或学习材料。总体而言,该词频分析展示了文本对数学、物理及相关教育和研究内容的重视。

  1. 书名信息的聚类实现过程

为了发现书籍名称中可能存在有价值的信息,选择使用无监督学习方法去提取文本信息内容,经过多次尝试,最后决定使用 K-Means 方法对文本信息价值信息提取。将文本数据转换为适合 TfidfVectorizer 处理的字符串格式,并使用该工具将文本转化为TF-IDF特征矩阵,提取前20个重要特征。生成的特征矩阵通过 normalize 函数进行归一化处理,确保每个样本的模长为1,以便计算样本之间的距离。使用 MiniBatchKMeans 进行K-Means聚类,并通过评估指标 Calinski-Harabasz (CH) 分数选择最佳聚类数目K。该分数越高,聚类效果越好。通过循环计算不同K值对应的CH分数,找到最佳K值。利用最佳K值对数据进行聚类,并输出每个簇中前4个特征值最高的关键词及其特征值,从而揭示每个聚类中主要的书名特征。通过这种方法,可以有效地将书名信息按照其内容或主题进行分类。

3.1数据预处理:

将经过清洗的书名信息转化为字符串格式,以适应TfidfVectorizer的输入要求。接着,使用TfidfVectorizer提取文本的TF-IDF特征,并将其转化为特征矩阵。转换的矩阵如下图:

通过使用 TfidfVectorizer 提取文本的 TF-IDF 特征,我们得到了一个特征矩阵,这个矩阵显示了每个词在文档中的权重。矩阵中的每一行代表一个文档,每一列代表一个词。值是该词在该文档中的 TF-IDF 权重。TF-IDF(词频-逆文档频率)反映了一个词在文档中的重要性——它不仅考虑词的频率,还减少了在所有文档中普遍出现的常用词的重要性。从示例矩阵中可以看到,大多数位置上的值为0,这表明大部分词在大多数文档中并未出现。这是文本特征矩阵的典型特征,因为每个文档通常只会使用特定的词汇集。在矩阵中的每一行(对应一个文档),存在少数几个非零值,这些值对应于该文档中具有较高重要性的词。例如,在第一行,"物理学"的值为1.0,这意味着该文档主要与“物理学”有关,而其他词汇在该文档中的权重为0。相同的逻辑也适用于其他行,例如第三行的"科学"和第四行的"数学",它们的值均为1.0。

从上述矩阵可以看到:

第0行:“物理学”这个词在该文档中的TF-IDF值为1.0,这表示“物理学”在此文档中是一个非常重要的词,并且可能是文档的主要主题词汇。

第3行:“数学”这个词的TF-IDF值为1.0,说明“数学”在该文档中占有重要地位。

零值的含义:大多数词的值是0,表示这些词并不出现在该文档中,或者它们的出现频率和逆文档频率相抵消,权重变得无足轻重。

这个TF-IDF特征矩阵有效地捕捉了每个文档的主要内容特征,表明了文档中高频但在其他文档中不常见的词的重要性,有助于后续的文本分析任务如聚类或分类。

3.2数据归一化

在对数据进行聚类分析前,对每个样本的数据进行归一化处理,使得每个样本的模长为1,以保证聚类算法能够准确地计算样本间的距离。归一化结果如下图:

数据归一化后的结果显示,大部分值为0,只有少数位置的值为1或接近1。这表明数据经过归一化处理后,样本的特征向量被缩放到单位长度,每个特征在样本中的相对重要性被保留,而整体尺度得到了标准化,使得样本之间的距离计算更加一致和可比。

3.3KMeans聚类

使用MiniBatchKMeans算法进行聚类分析。首先,设置一个超参数K的搜索范围,针对每一个K值,计算Calinski-Harabasz指数(CH指数),这个指数用于评估聚类效果,值越大说明聚类效果越好。计算结果如下:

  1. means 聚类分析中,不同的簇数(K值)对应了不同的 Calinski-Harabasz (CH) 指数。CH 指数用于评估聚类结果的优劣,指数越高,表示聚类效果越好。

3.4最佳K值选择

通过绘制不同K值对应的CH指数曲线,选择使CH指数最大的K值作为最佳K值,并基于该K值进行最终的聚类分析。结果如下图:

随着 K 值的增加,CH 指数总体上呈上升趋势,说明聚类效果逐渐变好。特别是在 K 值从 2 增加到 22 的过程中,CH 指数从 849.99 增加到 4661.31,聚类效果明显改善。

在 K = 22 达到最高点 (4661.31) 后,CH 指数开始出现波动,并且逐渐下降,说明进一步增加簇数并不能持续提升聚类质量,反而可能导致过度聚类。

最佳 K 值:

K = 22 是一个显著的拐点,在此 K 值下,CH 指数达到了最高峰(4661.31),意味着 22 个簇可能是最适合的聚类数目。再增加 K 值,虽然初期指数还有所增加,但幅度变小,并且最终开始下降。

K 值在 23 到 25 之间,CH 指数有所下降,表明在这个范围内的聚类效果并不如 K = 22 时好。

K 值较大时的趋势:

在 K > 22 的区域,CH 指数逐渐下降或波动,例如在 K = 50 时,CH 指数降到了 3143.97,这低于 K = 22 的值。这表明在较大的 K 值下,簇的数量过多,聚类效果反而下降。

基于 CH 指数,K = 22 是最佳的聚类数目,此时聚类效果最佳。

3.4k-means 文本聚类

定义K_cluster_analysis 函数,其中使用 MiniBatchKMeans 对文本数据进行聚类。函数接收聚类数量 K 和特征矩阵 X 作为输入。通过 fit_predict 方法,函数将文本数据聚成 K 个簇,并返回聚类模型对象、预测的簇标签 y_pred 以及 Calinski-Harabasz (CH) 指数,用于评估聚类效果。通过前面的分析确定了最佳 K 值(Best_K)。使用该最佳 K 值调用 K_cluster_analysis 函数,对训练数据 x_train 进行最终聚类。获取聚类模型、簇标签以及 CH 指数。利用 Counter 统计每个簇中包含的数据个数,帮助了解各簇的分布情况。获取向量化器中的特征名称(关键词)。对于每一个簇,通过访问 K-means 质心向量中的特征值,找到特征值最大的前4个关键词及其对应的特征值。这些关键词可以代表每个簇的主题。

输出每个簇中前4个最具代表性的关键词及其特征值,帮助解释各个簇的主题特征。这样一来,可以从文本聚类结果中提取出有意义的信息,辅助后续的文本分析和解读工作。结果如下图

K-means文本聚类结果,每个簇中前4个关键词及其特征值,能够帮助我们理解各个簇的主题和内容。

簇0,关键词如"物理"、"力学"、"数学"表明该簇的主题可能与基础科学有关,尤其是物理学领域的基础知识。

簇1的关键词均为0,可能由于这个簇中的文本较少或者文本内容相对分散,导致聚类时特征值接近0。

簇2,以"研究"和"中国"为关键词,可能涵盖了以中国为背景的学术研究。

簇3的关键词"力学"、"中国"表明该簇内容主要涉及力学领域,可能与中国相关的研究或丛书。

其他簇(如簇13、簇15等)分别表现出明显的主题聚焦,比如"教程"与教学相关,"量子力学"和"物理学"显示该簇的主题偏向量子物理领域。

这些结果为后续文本内容的深入分析提供了有价值的主题线索。

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

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

相关文章

学习记录:js算法(四十二): 寻找两个正序数组的中位数

文章目录 寻找两个正序数组的中位数我的思路网上思路 总结 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 1: 输入:nums1 [1,3], n…

力扣72-编辑距离(Java详细题解)

题目链接:力扣72-编辑距离 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个dp…

网络层协议 —— IP协议

目录 0.前言 1.IP协议的格式 2.IP地址 2.1IP地址的划分 国际间IP地址的划分 公有IP 私有IP 特殊的IP地址 国内IP地址的划分 2.2IP地址不足问题 2.3IP地址的功能 2.4如何使用IP地址 2.5IP地址的构成 3.网段划分 以前的方案 现在的方案 4.认识宏观网络 5.路由 …

MySQL篇(事务 - 基础)

目录 一、简介 二、事务操作 1. 数据准备 2. 未控制事务 2.1. 测试正常情况 2.2. 测试异常情况 3. 控制事务 3.1. 控制事务一 查看/设置事务提交方式 提交事务 回滚事务 3.2. 控制事务二 开启事务 提交事务 回滚事务 3.3. 转账案例 四、事务的好处 五、事务四…

入门数据结构JAVA DS——二叉树的介绍 (构建,性质,基本操作等) (1)

前言 二叉树的概念和性质 二叉树的基本概念 二叉树的种类 二叉树的性质 二叉树的构建存储与遍历 存储 构建 遍历 前序遍历 后序遍历 中序遍历 层序遍历 二叉树的基本操作 获取树中结点个数 获取叶子结点个数 获取第K层结点的个数 获取二叉树的高度 检测值为v…

C++ —— vector 的模拟实现

目录 前言 1. vector深度剖析 2. 基础框架 3. 核心接口 3.1 reserve 3.2 push_back 和 pop_back 3.3 print 3.4 insert 3.5 erase 3.6 resize 4. 拷贝构造 4.1 构造与析构 4.2 拷贝构造 4.3 赋值重载 4.4 迭代器区间 5. 使用memcpy拷贝问题 前言 接:C —— 关于…

FX5 CPU模块和以太网模块的以太网通信功能

FX5 CPU模块和以太网模块的以太网通信功能的概要如下所示。 CPU模块的内置以太网端口的通信规格如下所示。 1、与MELSOFT的直接连接 不使用集线器,用1根以太网电缆直接连接以太网搭载模块与工程工具(GX Torks3)。无需设定IP地址,仅连接目标指定即可进行…

学习Java(一)类和对象

package demo.ceshi;public class Puppy {private int age;private String name;//构造器public Puppy( String name){this.name name;System.out.println("公主的名字叫:"name);}//设置age的值public void setAge(int age){this.age age;System.out.pr…

数值计算 --- 平方根倒数快速算法(中)

平方根倒数快速算法 --- 向Greg Walsh致敬! 1,平方根倒数快速算法是如何选择初值的?WTF中的神秘数字究竟是怎么来的? 花开两朵,各表一枝。在前面的介绍中,我们已经知道了这段代码的作者在函数的最后使用了NR-iteratio…

CVE-2024-46103

前言 CVE-2024-46103 SEMCMS的sql漏洞。 漏洞简介 SEMCMS v4.8中,SEMCMS_Images.php的search参数,以及SEMCMS_Products.php的search参数,存在sql注入漏洞。 (这个之前就有两个sql的cve,这次属于是捡漏了&#x1f6…

【MATLAB源码-第268期】基于simulink的永磁同步电机PMSM双闭环矢量控制系统SVPWM仿真,输出转速响应曲线。

操作环境: MATLAB 2022a 1、算法描述 永磁同步电机(PMSM)是目前工业领域中广泛使用的一种高效电机,其具有高功率密度、运行效率高、动态响应快等优点。在控制永磁同步电机时,通常采用矢量控制(也称为磁场…

新160个crackme - 060-snake

运行分析 需破解Name和Serial PE分析 32位,未知程序和壳 点击Scan/t按钮外部扫描,发现是C程序 静态分析&动态调试 ida搜索关键字符串,双击进入 发现无法反编译 选中该函数(地址:401048 - 401172)Edit -…

认识结构体

目录 一.结构体类型的声明 1.结构的声明 2.定义结构体变量 3.结构体变量初始化 4.结构体的特殊声明 二.结构体对齐(重点难点) 1.结构体对齐规则 2.结构体对齐练习 (一)简单结构体对齐 (二)嵌套结构体对齐 3.为什么存在内存对齐 4.修改默认对齐数 三.结构体传参 1…

PMP--二模--解题--51-60

文章目录 14.敏捷--术语表--完成的定义DoD--它是团队需要满足的所有标准的核对单,只有可交付成果满足该核对单才能视为准备就绪可供客户使用。51、 [单选] 在冲刺计划会议上,Scrum主管重申,如果在冲刺结束时敏捷项目团队正在构建的产品增量没…

五种IO模型和阻塞IO

文章目录 五种 IO 模型和阻塞 IO1、五种 IO 模型1.1、阻塞 IO1.2、非阻塞 IO1.3、信号驱动 IO1.4、IO 多路转接1.5、异步 IO1.6、总结 2、高级 IO 概念2.1、同步通信(synchronous communication)和异步通信(asynchronous communication&#…

第十五章:使用html、css、js编程制作一个网页版的下雪场景动画

背景:这是一个充满诗意的下雪场景代码。打开网页时,雪花轻轻飘落,覆盖住你的屏幕,仿佛置身于冬日的夜空下。背景音乐《我期待的不是雪》缓缓响起,伴随着雪花的飘动,仿佛心中的那份爱与温柔悄然绽放。 雪花的飘落是梦境般的存在,每一片雪花都是轻盈的告白,旋转着从天际…

使用GitHub Actions自动发布electron多端安装程序

GitHub Actions 是一个强大的自动化工具,可以帮助开发者在 GitHub 仓库中自动化构建、测试和部署工作流程。我们的客户端就是使用github action来打包项目发布的。 以下是关于 GitHub Actions 自动化构建的一些关键点和步骤: GitHub Actions 的基本概念…

go注册中心Eureka,注册到线上和线下,都可以访问

go注册中心Eureka,注册到线上和线下,都可以访问 本地通过127访问, 线上通过内网ip访问 package mainimport ("github.com/SimonWang00/goeureka""github.com/gin-gonic/gin""wbGo/controller""wbGo/task…

【工具变量】地市环保法庭试点城市DID数据集(2005-2023年)

数据简介:环保法庭是中国司法体系中专门处理环境资源案件的审判机构,其主要职责包括审理涉及自然环境污染、矿产资源保护、自然资源环境开发等环境资源民事纠纷案件,对不服下级人民法院生效裁判的环境资源民事案件进行审查,以及对…

Java_Se--方法

方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义(不要背, 重在体会): 1. 是能够模块化的组织代码 ( 当代码规模比较复杂的时候 ). 2. 做到代码被重复使用 , 一份代码可以在多个位置使用 . 3. 让代码更好理解更简单 . 4. 直接调用现有方法开…