python 文本聚类分析案例——从若干文本中聚类出一些主题词团

python 文本聚类分析案例——从若干文本中聚类出一些主题词团python 文本聚类分析案例说明摘要 1 结巴分词 2 去除停用词 3 生成 tfidf 矩阵 4 K means 聚类 5 获取主题词 主题词团说明实验要求 对若干条文本进行聚类分析 最终得到几个主题词团 实验思路 将数据进行预处理之后 先进行结巴分词 去除停用词 然后把文档生成 tfidf 矩阵文件 再通过 K means 聚类 最后得到几个类的主题词 实验说明 如何用爬虫获取数据可以参考其他博客 这里

说明

实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。
实验思路:将数据进行预处理之后,先进行结巴分词、去除停用词,然后把文档生成tfidf矩阵,再通过K-means聚类,最后得到几个类的主题词。
实验说明:如何用爬虫获取数据可以参考其他博客,这里我们直接用一个周杰伦的歌词文本为例进行分析,把28条歌词聚成3个类。




摘要

实验源数据放在文件sourceData中,中间文件放在resultData中。

1、结巴分词

直接上代码,经测试后,我采用的是精确模式,效果最好。

# jieba分词 精确模式 def get_jiebaword(): # enconding视文本保存的编码而定,utf-8或gbk try: with open('sourceData/JayZhou.txt', "r", encoding='gbk') as fr: lines = fr.readlines() except FileNotFoundError: print("no file like this") jiebaword = [] for line in lines: line = line.strip('\n') # 清除多余的空格 line = "".join(line.split()) # 默认精确模式 seg_list = jieba.cut(line, cut_all=False) word = "/".join(seg_list) jiebaword.append(word) return jiebaword 

2、去除停用词

首先加载停用词表,可以到其他博客出搜寻一个别人整理好的停用词表,保存为StopWord.txt。

# 获取停用词表 def get_stopword(): stopword = [] try: with open('sourceData/StopWord.txt', "r", encoding='utf-8') as fr: lines = fr.readlines() except FileNotFoundError: print("no file like this") for line in lines: line = line.strip('\n') stopword.append(line) return stopword 

然后是去除停用词,我们把去掉停用词的结果放到CleanWord.txt中。

# 去除停用词 def clean_stopword(jiebaword,stopword): fw = open('resultData/CleanWords.txt', 'a+',encoding='utf-8') for words in jiebaword: words = words.split('/') for word in words: if word not in stopword: fw.write(word + '\t') fw.write('\n') fw.close() 

在这里插入图片描述
这里我们发现文档其实并不Clean,因为存在”- – -“、“10”…这些其他词语。所以我们要在main函数中再对停用词表进行补充:

# ---停用词补充,视具体情况而定--- stopword.append('---') stopword.append('----') i = 0 for i in range(19): stopword.append(str(10+i)) # ---------------------- 

3、生成tfidf矩阵

我们只有把文章词语转化成数字,才能进行计算。转化成tfidf矩阵是一个不错的选择,具体而言tfidf是体现文档相似度的,关于它的解释很多。

以下我的理解:同一个词语,如果在文章A和文章B中都出现了很多次,那说明这两篇文章很相似,这就是tf;相反地,同一个词语,在所有文章中极少出现,而恰恰在文章A和文章B中出现过,也可以说明这两篇文章相似,这就是idf。同时考虑这两个维度,就是我们常说的tfidf。

# 生成tf-idf矩阵文档 def get_tfidf(): try: with open('resultData/CleanWords.txt', "r", encoding='utf-8') as fr: lines = fr.readlines() except FileNotFoundError: print("no file like this") transformer=TfidfVectorizer() tfidf = transformer.fit_transform(lines) # 转为数组形式 tfidf_arr = tfidf.toarray() return tfidf_arr 

这里我们可以把结果输出一下:

print(tfidf_arr) print(tfidf_arr.shape) 

在这里插入图片描述
这是一个28行x268列的矩阵,代表分出来的268个词在28个短文本中的tfidf值。值为0,说明该词未在此文章中出现过。

4、K-means聚类

接下来我们就可以进行聚类了,这里我们直接调用nltk包。

# K-means聚类 def get_cluster(tfidf_arr,k): kmeans = KMeansClusterer(num_means=k, distance=cosine_distance) # 分成k类,使用余弦相似分析 kmeans.cluster(tfidf_arr) # 获取分类 kinds = pd.Series([kmeans.classify(i) for i in tfidf_arr]) fw = open('resultData/ClusterText.txt', 'a+', encoding='utf-8') for i, v in kinds.items(): fw.write(str(i) + '\t' + str(v) + '\n') fw.close() 

5、获取主题词 / 主题词团

分完类之后,我们还要找出这个类的主题词,所以我们先按照分类结果,把28个文本放到对应的3个类之中。

# 获取分类文档 def cluster_text(): index_cluser = [] try: with open('resultData/ClusterText.txt', "r", encoding='utf-8') as fr: lines = fr.readlines() except FileNotFoundError: print("no file like this") for line in lines: line = line.strip('\n') line = line.split('\t') index_cluser.append(line) # index_cluser[i][j]表示第i行第j列 try: with open('resultData/CleanWords.txt', "r", encoding='utf-8') as fr: lines = fr.readlines() except FileNotFoundError: print("no file like this") for index,line in enumerate(lines): for i in range(28): if str(index) == index_cluser[i][0]: fw = open('resultData/cluster' + index_cluser[i][1] + '.txt', 'a+', encoding='utf-8') fw.write(line) fw.close() 
# 获取主题词 def get_title(cluster): for i in range(cluster): try: with open('resultData/cluster' + str(i) + '.txt', "r", encoding='utf-8') as fr: lines = fr.readlines() except FileNotFoundError: print("no file like this") all_words = [] for line in lines: line = line.strip('\n') line = line.split('\t') for word in line: all_words.append(word) c = Counter() for x in all_words: if len(x) > 1 and x != '\r\n': c[x] += 1 print('主题' + str(i+1) + '\n词频统计结果:') # 输出词频最高的那个词,也可以输出多个高频词 for (k, v) in c.most_common(1): print(k,':',v,'\n') 

以下是头文件和main函数中的调用:

import jieba import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from nltk.cluster.kmeans import KMeansClusterer from nltk.cluster.util import cosine_distance from collections import Counter 
if __name__ == '__main__': # 定义聚类的个数 cluster = 3 # 结巴分词 jiebaword = get_jiebaword() # 获取停用词 stopword = get_stopword() # ---停用词补充,视具体情况而定--- stopword.append('---') stopword.append('----') i = 0 for i in range(19): stopword.append(str(10+i)) # ---------------------- # 去除停用词 clean_stopword(jiebaword,stopword) # 获取tfidf矩阵 tfidf_arr = get_tfidf() # ---输出测试--- # print(tfidf_arr) # print(tfidf_arr.shape) # ------------- # K-means聚类 get_cluster(tfidf_arr,cluster) # 获取分类文件 cluster_text() # 统计出主题词 get_title(cluster) 

以上就是使用python进行文本聚类分析的一个案例,代码可以组合后直接使用,但要注意文本条数的更改和停用词清理的具体情况。经测试可以对1000条左右的文本进行聚类,结果仍然可观。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199374.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午1:07
下一篇 2026年3月20日 下午1:08


相关推荐

  • ZOJ 3826 Hierarchical Notation 模拟

    ZOJ 3826 Hierarchical Notation 模拟

    2022年1月2日
    46
  • Python抛出异常_python抛出异常的作用

    Python抛出异常_python抛出异常的作用在工作中都会遇到异常报错问题,那么在这抽空码一些内容以作记录。在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误AttributeError#试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError#输入/输出异常;基本上是无法打开文件ImportError#无法引入模块或包;基本上是路径问题或名称错误Indentati.

    2022年10月17日
    5
  • 讯飞星火怎么用_讯飞星火认知大模型怎么用

    讯飞星火怎么用_讯飞星火认知大模型怎么用

    2026年3月14日
    3
  • QTime 计时(正计时)

    #include<QDebug>#include<QTime>Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);QTimetime;time.start();//开始计时qDebug()<<QTime::currentTime().msec();//打印当前时间

    2022年4月10日
    174
  • awr报告 解读_十步解析awr报告

    awr报告 解读_十步解析awr报告十步解析 awr 报告从这期开始讲解 awr 报告的部分 首先讲解 awr 整体的部分后续会针对不同的点进行讲解 1 数据库细节这部分可以看到数据库的版本数据库 DBID 数据库实例名称及实例号数据库最近一次启动时间数据库版本数据库是否为 rac2 主机配置信息这部分可以看到数据库主机名数据库主机平台服务器 CPU 及核数服务器 CPU 个数服务器内存大小 3 SnapShot 信息这部分可以看到 awr 报告的起止时间以及

    2026年3月19日
    2
  • getmethods和getdeclaredmethods_java中的method

    getmethods和getdeclaredmethods_java中的methodMethodgetDeclaredMethod(Stringname,Class…parameterTypes)d返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法。Method[]getDeclaredMethods()返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访…

    2026年2月25日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号