Python数据分析案例14——文本计算TF-IDF值和LDA主题模型
本次案例教大家怎么进行文本的TF-idf值的计算,并且使用这个相应的词向量进行LDA文本主题模型的构建,然后画出每个主题的重要词汇的词云图。
任何文本数据,只要是很多条文本,都能进行上面的建模操作。这一套流程对于文本大数据分析是非常实用的。
(部分图片打了马赛克是因为应该有敏感词汇不让显示.....)
文本读取 分词
导入包,读取停用词
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['KaiTi'] #指定默认字体 SimHei黑体
plt.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'
import jieba
stop_list = pd.read_csv("停用词.txt",index_col=False,quoting=3,sep="\t",names=['stopword'], encoding='utf-8')
对我们的本文数据进行读取,然后使用jieba库进行分词操作
#Jieba分词函数
def txt_cut(juzi):lis=[w for w in jieba.lcut(juzi) if w not in stop_list.values]return (" ").join(lis)
df=pd.read_excel('2022新闻.xlsx')
df['cutword']=df['content'].astype('str').apply(txt_cut)
查看我们的数据前五行现在的样子:
df.head()
我使用的数据是2022年所有的央视新闻的文本,day是日期,前五条都是2022年1月1日的,title是这个新闻的标题,content是新闻文本内容,cutword就是进行停用词去除,分词后的词汇。
可以看到分词后,每个词语中间都是空白连接,标点符号都去了,这样方便后面进行文本的词向量化。
jieba分析
首先使用jieba库统计一下,2022年所有新闻文本的词汇重要性排序。
import jieba.analyse
jieba.analyse.set_stop_words('停用词.txt')
#合并一起
text = ''
for i in range(len(df['cutword'])):text += df['cutword'][i]+'\n'
jieba.analyse.extract_tags(text,topK=20,withWeight=True)
我这里只输出了前20个最重要的词汇。既然是央视的新闻,那么央视网,新闻联播这些词显然都是出现得最多的。
发展,中国,国家,这些也都是新闻联播常见的用词了。
病例,新冠,疫情,在2022年,新闻对于这些东西也是播报频率很高的。
Tf-IDF分析
上面的词频统计(TF)分析其实都是新闻联播常用的词汇,那么经过逆词频(idf)计算后,真实的词语重要性排序是什么呢,下面进行TF-IDF计算,词向量化。
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.decomposition import LatentDirichletAllocation
tf_vectorizer = TfidfVectorizer()
#tf_vectorizer = TfidfVectorizer(ngram_range=(2,2)) #2元词袋
X = tf_vectorizer.fit_transform(df.cutword)
#print(tf_vectorizer.get_feature_names_out())
print(X.shape)
可以看到,这里将分词好了的文本变为了48265列数值型的特征变量X。这样就方便模型计算。
查看TF-IDF值排序
data1 = {'word': tf_vectorizer.get_feature_names_out(),'tfidf': X.toarray().sum(axis=0).tolist()}
df1 = pd.DataFrame(data1).sort_values(by="tfidf" ,ascending=False,ignore_index=True)
df1.head(20)
TF-IDF值最高的前20个词汇排序如图,说明真实的最重要的词汇大概是:病例,发展,中国,m国,这些词汇。
像央视网,新闻联播这些几乎每个新闻都有的词汇就排名往下掉了。
LDA建模
LDA模型可以说类似于聚类模型,是一种无监督的算法,就是把文本数据自动划分为几类几类话题,然后每类话题都有一些高频词汇可以输出出来。
说白了就是一种专门针对文本数据的聚类方法。
由于是无监督,所以聚类效果也不好评价。聚类个数也不知道咋选.....
本文主观的将聚类个数定为10,即将文本数据划分为10个主题类别。
n_topics = 10 #分为10类
lda = LatentDirichletAllocation(n_components=n_topics, max_iter=100,learning_method='batch',learning_offset=100,
# doc_topic_prior=0.1,
# topic_word_prior=0.01,random_state=0)
lda.fit(X)
模型拟合好后,查看结果前先定义一个函数,让结果输出更好看一下。
def print_top_words(model, feature_names, n_top_words):tword = []tword2 = []tword3=[]for topic_idx, topic in enumerate(model.components_):print("Topic #%d:" % topic_idx)topic_w = [feature_names[i] for i in topic.argsort()[:-n_top_words - 1:-1]]topic_pro=[str(round(topic[i],3)) for i in topic.argsort()[:-n_top_words - 1:-1]] #(round(topic[i],3))tword.append(topic_w) tword2.append(topic_pro)print(" ".join(topic_w))print(" ".join(topic_pro))print(' ')word_pro=dict(zip(topic_w,topic_pro))tword3.append(word_pro)return tword3
选择每个主题输出前20个重要词汇;
##输出每个主题对应词语和概率
n_top_words = 20
feature_names = tf_vectorizer.get_feature_names_out()
word_pro = print_top_words(lda, feature_names, n_top_words)
可以看到,输出了10个主题,每个主题对应输出20个重要词汇和他们的重要性数值。
那么每条新闻属于哪类话题,可以通过下面代码得到每篇文章对应主题
#输出每篇文章对应主题
topics=lda.transform(X)
topic=np.argmax(topics,axis=1)
df['topic']=topic
#df.to_excel("data_topic.xlsx",index=False)
print(topics.shape)
print(topics[0])
topic[0]
如图预测的类别是一个(5337,10)的数据,5337是样本个数,即5337条新闻,10是分为10类,每一类的概率值。
我们查看第一条数据的10的类别概率值,发现它是第0类话题的概率是0.0213,第1类话题的概率是0.1518,第2类话题的概率是0.52......以此类推。
由于它是第2类话题的概率0.52最大,所以第一条新闻被认为是第2类话题。
词云图
打印出来每个话题关键词不够直观,画出每类话题的词云图看。
先定义一个随机颜色的函数。能随机返回颜色。
import random #定义随机生成颜色函数
def randomcolor():colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']color ="#"+''.join([random.choice(colorArr) for i in range(6)])return color
[randomcolor() for i in range(3)]
词语图设置
from collections import Counter
from wordcloud import WordCloud
from matplotlib import colors
#from imageio import imread #形状设置
#mask = imread('爱心.png') def generate_wordcloud(tup):color_list=[randomcolor() for i in range(10)] #随机生成10个颜色wordcloud = WordCloud(background_color='white',font_path='simhei.ttf',#mask = mask, #形状设置max_words=20, max_font_size=50,random_state=42,colormap=colors.ListedColormap(color_list) #颜色).generate(str(tup))return wordcloud
画多子图
dis_cols = 4 #一行几个
dis_rows = 3
dis_wordnum=20
plt.figure(figsize=(5 * dis_cols, 5 * dis_rows),dpi=128)
kind=len(df['topic'].unique())for i in range(kind):ax=plt.subplot(dis_rows,dis_cols,i+1)most10 = [ (k,float(v)) for k,v in word_pro[i].items()][:dis_wordnum] #高频词ax.imshow(generate_wordcloud(most10), interpolation="bilinear")ax.axis('off')ax.set_title("第{}类话题 前{}词汇".format(i,dis_wordnum), fontsize=30)
plt.tight_layout()
plt.show()
可以看到每一类话题的重要性词汇都画出来了,词语越大说明这个词越重要。
可以看到LDA模型效果还是不错的,比如第2类话题出现了很多中国,合作,发展,人民,全面等词汇,说明第2类话题就是那些新闻联播里面老生常谈的些描述国家发展的新闻。
第7类话题出现了很多病例,输入,确诊,新增,本土,新冠等这些词汇,说明第7类话题就是那些天天报道新冠疫情情况的新闻。
第4类话题出现了很多冬奥会,运动员,滑雪,选手,比赛等这些词汇,说明第4类话题就是描述冬奥会比赛情况的新闻。
其他话题也有各自的主题和道理。
这是2022的央视网新闻,换成任何一个其他的文本都可以进行上述的分析,比如可以分析股吧评论,电影标语,微博热搜等等。最终可以得到每个文本的类别和词云图。
Python数据分析案例14——文本计算TF-IDF值和LDA主题模型相关推荐
- 5.Python数据分析项目之文本分类-自然语言处理
1.总结 预测类数据分析项目 流程 具体操作 基本查看 查看缺失值(可以用直接查看方式isnull.图像查看方式查看缺失值missingno).查看数值类型特征与非数值类型特征.一次性绘制所有特征的分 ...
- 视频教程-Python数据分析案例实战 视频课程-Python
Python数据分析案例实战 视频课程 计算机硕士,多年工作经验,技术和产品负责人. 多年推荐系统/NLP/大数据工作经验. 负责公司多个AI项目产品落地,包括文本分类.关键词抽取.命名实体识别.对话 ...
- python数据分析实战案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- python数据分析实战-Python数据分析案例实战(慕课版)
基本信息 书名:Python数据分析案例实战(慕课版) :59.80元 作者:王浩,袁琴,张明慧 著 出版社:人民邮电出版社 出版日期:2020_06_01 ISBN:9787115520845 字数 ...
- python 数据分析 实际案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘
思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图显示.情感分析.舆情分析.主题挖掘.威胁情报溯源.知识图谱.预测预警及AI和NL ...
- 毕业论文案例-LDA主题模型实现文本聚类
本文结构框架 引言 LDA主题模型的预备知识 (1)多项式分布 Multinomial Distribution (2)狄利克雷分布 Dirichlet Distribution (3)共轭分布 Co ...
- LDA主题模型简介及Python实现
一.LDA主题模型简介 LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类. LDA主题模型不关心文档中单词的顺序,通常使用词袋特 ...
- 文本聚类(一)—— LDA 主题模型
目录 文本聚类 一.LDA 主题模型 1.1 加载数据集 1.2 数据清洗.分词 1.3 构建词典.语料向量化表示 1.4 构建 LDA 模型 1.5 模型的保存.加载以及预测 1.6 小结 Upda ...
最新文章
- 命令获取计算机信息,教你怎么在windows上用命令查看系统信息
- sqlite查询乘以某列如果是null就换成_大数据之Hive group by with cube/rollup分组查询...
- Python的小整数对象池
- 了解PostCSS原理
- 等待其他线程执行完后执行(CountDownLatch)
- aseprite 中心对称绘制脚本
- No installations recognized 以及 nvm use切换node版本无效的解决办法
- c++学习 cout endl使用
- 分布式Ruby解决之道 - DRb
- Linux创建磁盘并分区命令
- 错误1053 服务没有及时响应启动或控制请求
- ArcGIS中ArcMap分割栅格Split Raster工具没有结果的解决
- Sklearn机器学习中的主要算法原理以及实现
- 【网络安全态势感知学习笔记】——“行远自迩”基础篇一:网络安全态势感知的基本概念
- 一些乱七八糟的概念以及定义
- 淘宝网携手富友软件助力时尚行业电子商务营销
- 淘宝商品详情API接口(app、h5端)
- BTOS是固定在微型计算机,给音乐来点不一样的味道!试玩飞傲Q1 Mark ⅡBTR1耳放...
- Java实现 蓝桥杯 算法提高 字符串压缩
- 【SIKI学院】愤怒的小鸟创建过程-1