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

devtools/2024/9/23 12:09:25/

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.ppmy.cn/devtools/115983.html

相关文章

使用 HFD 加快 Hugging Face 模型和数据集的下载

Hugging Face 提供了丰富的预训练模型和数据集,而且使用 Hugging Face 提供的 from_pretrained() 方法可以轻松加载它们,但是,模型和数据集文件通常体积庞大,用默认方法下载起来非常花时间。 本文将指导你如何使用 HFD&#xff08…

[Golang] Sync

[Golang] Sync 文章目录 [Golang] Syncsync.WaitGroupsync.Once对比init() sync.Lock互斥锁和读写锁互斥锁读写锁 死锁问题加锁解锁不成对循环等待 sync.Mapsync/atomicatomic和mutex的区别atomic.value sync.Pool如何使用sync.Pool使用场景 Golang中我们一般提倡使用通信来共享…

Mysql梳理7——分页查询

目录 7、分页查询 7.1 背景 7.2 实现规则 分页原理 7.3 使用 LIMIT 的好处 7、分页查询 7.1 背景 背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢? 背景2:表里有 4 条数据&#xff0c…

面试题(六)

48、设计模式 49、继承是否会破坏封装? 继承在面向对象编程中是一个重要的概念,但它确实可能对封装产生影响,具体情况取决于如何使用继承。以下是对这个问题的分析: 封装的定义 封装是面向对象编程中的一个基本原则&#xff0…

yjs08——矩阵、数组的运算

一.数组的运算 1.数组的逻辑运算——比较大小、比较大小+赋值 a.首先是直接用数组写大小于号即可对其各个元素进行比较 b.如果输出判断的式子,那么返回的是布尔类型的数组 c.如果想把数组的所有符合大小的元素全部替换,也可以 arr_1[arr_1>…

Docker 进阶篇-CIG 重量级监控系统

上一篇讲的是轻量级的监控工具,本文就来讲重量级的: CAdvisor InfluxDB Granfana,简称 CIG。 ​ ‍ ‍ docker stats 原生的 Docker 命令中,stats 可以查看每个容器占用的 CPU,内存,网络流量等情况&…

Python|OpenCV-实现识别目标图像中的圆圈(20)

前言 本文是该专栏的第22篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在处理图像检测项目的时候,可能会遇到需要检测目标图像中的“圆圈”需求。笔者在这里举个例子,如下图所示: 在图中有一个篮球,但是我们要找的目标对象并不是篮球,而是篮球它本身的这个…

k8s重要知识点

k8s重要知识点在线链接 k8s重要知识点在线链接: https://h03yz7idw7.feishu.cn/docx/U2ACdKzstotvVBxU1eIcDZzGnOd