说明

实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。

实验思路:将数据进行预处理之后,先进行结巴分词、去除停用词,然后把文档生成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()

将分类的结果写入ClusterText.txt文件,前一个数字代表文本的下标,后一个数字代表分类的编号。

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')

结果如图所示:

学过K-means算法的都知道,每个类的中心一开始随机选取,故每次聚类的结果不同,可能要多试几次,才有满意结果。

以下是头文件和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://blog.csdn.net/weixin_40754097/article/details/105155729

python数据分类聚类案例_python 文本聚类分析案例——从若干文本中聚类出一些主题词团...相关推荐

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

    python 文本聚类分析案例 说明 摘要 1.结巴分词 2.去除停用词 3.生成tfidf矩阵 4.K-means聚类 5.获取主题词 / 主题词团 说明 实验要求:对若干条文本进行聚类分析,最终得 ...

  2. python文件审计系统_Python代码审计实战案例总结之CRLF和任意文件读取

    介绍 Python代码审计方法多种多样,但是总而言之是根据前人思路的迁移融合扩展而形成.目前Python代码审计思路,呈现分散和多样的趋势.Python微薄研发经验以及结合实际遇到的思路和技巧进行总结 ...

  3. python金融数据分析案例_Python数据分析行业案例课程--欺诈检测

    注意: 1. 本行业案例课程为Python 3 数据分析系列课程的行业案例部分,学员请务必先观看课程介绍免费视频,确认已学习本课程所需Python分析技能. 2. 本课程的核心目的是协助学员学习具体业 ...

  4. python 豆瓣评论数据分析_Python爬虫实战案例:豆瓣影评大数据分析报告之网页分析...

    个人希望,通过这个完整的爬虫案例(预计总共4篇短文),能够让爬虫小白学会怎么做爬虫的开发,所以在高手们看来,会有很多浅显的废话,如果觉得啰嗦,可以跳过一些内容~ 上一篇文章给大家简单介绍了Python ...

  5. python求近似值_python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配...

    已知一个元素,在一个list中找出相似的元素 使用场景: 已知一个其它来源的字符串, 它有可能是不完全与我数据库中相应的字符串匹配的,因此,我需要将其转为适合我数据库中的字符串 使用场景太绕了, 直接 ...

  6. python实验数据预处理案例_Python数据分析小案例——红楼梦文本分析(一) 文本预处理...

    本文开始介绍一个简单的数据分析案例,分析红楼梦文本,本文主要内容是将红楼梦文本按照章节获取每一回的标题,字数,段落数并保存到csv中方便后续数据分析 红楼梦小说文本可以在这里下载 链接:https:/ ...

  7. python用于数据分析的案例_Python数据分析经典案例

    从事机器学习,数据分析,数据挖掘的同学们以及python使用者 选择经典案例基于真实数据集,从数据预处理开始到建立机器学习模型以及效果评估,完整的讲解如何使用python及其常用库进行数据的分析和模型 ...

  8. python引入模块教程_python导入模块--案例

    1 导入模块 1.1 问题 本案例要求先编写一个star模块,主要要求如下: 建立工作目录 ~/bin/ 创建模块文件 ~/bin/star.py 模块中创建pstar函数,实现打印50个星号的功能 ...

  9. python录音详解_Python爬虫实战案例:取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

最新文章

  1. boost::hana::insert_range用法的测试程序
  2. Palo Alto Networks漏洞防护扩展至云端
  3. flex组件使用【PopUpButton】
  4. linux打印软件,KX-MB2033CN Linux
  5. Mybatis 动态表名,插入数据
  6. 浅谈React Hooks
  7. C# Cookie工具类
  8. python shell运行_Python 执行 Shell 命令
  9. scara机器人dh参数表_机器人之DH参数例子-SCARA机器人
  10. redis安装及运行
  11. Ameya:蔡司激光共聚焦显微镜的优势特点及应用领域
  12. 计算广告学(Computational Advertising)概述学习
  13. 如何在学习中找到乐趣?怎样才能找到学习的乐趣
  14. Oracle 应用篇+Oracle Siebel CRM
  15. [ERROR] The distro “Ubuntu“ has running processes and can‘t be operated. “wsl -t <name>“ ......
  16. 暴力破解--利用计算机执行速度
  17. 使用selenium爬取网页
  18. 获取解析后的html内容,Android通过WebView获取解析html内容
  19. BT TWS 听音乐无声问题
  20. 华三comware跳槽_小灰的网工日常之华三瘦转胖AP,我与华三的又一段孽缘呀~~~

热门文章

  1. FLUENT多孔介质数值模拟设置【转载】
  2. 15款国内移动应用开发者都必须知道的小而美SDK
  3. 代码随想录训练营day35
  4. 视觉融合里程计SLAM算法SE2Lam解析-论文篇
  5. ADV流速仪坐标系统
  6. python表情代码_python如何实现表情识别 python实现表情识别代码示例
  7. 如何完整干净卸载JDK,有疑惑的兄弟进来看看吧!
  8. js字符串转日期,兼容IE所有版本
  9. Chrome谷歌浏览器弹框提示:代理要求提供用户名与密码
  10. 机器学习在水文地质方面的文章--文献阅读