b站评论词频统计绘制词云图

2024-04-05 00:44

本文主要是介绍b站评论词频统计绘制词云图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、评论爬取

        在笔者之前的文章中,已经专门介绍了b站评论的爬取(传送门),这里只对b站评论的文本数据做展示。如下图所示:

二、分词、去停用词、词频统计

        Python中的Jieba分词作为应用广泛的分词工具之一,其融合了基于词典的分词方法和基于统计的分词方法的优点,在快速地分词的同时,解决了歧义、未登录词等问题。因而Jieba分词是一个很好的分词工具。Jieba分词工具支持中文简体、中文繁体分词,还支持自定义词库,它支持精确模式、全模式和搜索引擎模式三种分词模式,具体说明如下:

        精确模式:试图将语句最精确的切分,不存在冗余数据,适合进行文本分析。

        全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据。

        搜索引擎模式:在精确模式的基础上,对长词再次进行切分。

        停用词是指在信息检索中,为节省存储空间和提高检索效率,在处理自然语言数据之前或之后,过滤掉某些字或词,在Jieba库中可以自定义停用词。 代码如下:

# 读取停用词,创建停用词表
stwlist = [line.strip() for line in open('stop.txt', encoding='utf8').readlines()]# 文本分词
mytext_list = []
number_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
words = jieba.lcut(text, cut_all=False)
for seg in words:for i in number_list:seg = seg.replace(str(i), '')if not seg:continueif seg not in stwlist and seg != " " and len(seg) != 1:mytext_list.append(seg)
cloud_text = ",".join(mytext_list)def word_frequency(txt):# 统计并返回每个单词出现的次数word_list = txt.split(',')d = {}for word in word_list:if word in d:d[word] += 1else:d[word] = 1# 删除词频小于2的关键词for key, value in dict(d).items():if value < 2:del d[key]return dfrequency_result = word_frequency(cloud_text)
frequency_result = list(frequency_result.items())
# 对关键词进行排序
frequency_result.sort(key=lambda x: x[1], reverse=True)
# 输出词频统计表
df = pd.DataFrame(frequency_result, columns=['词', '词频'])
df.to_csv('词频统计.csv', encoding='utf-8-sig', index=False)

三、绘制词云图和高频词条形图

       词云图,也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者只要一眼扫过文本就可领略文本的主旨。就是一大堆关键词形成一张图片,有的是矩形有的是一些特殊形状。而WordCloud的作用,就是制作这种图片。这个模块的使用也是非常方便的,我们需要准备一个文本、一张图片、然后填写一堆参数就好了。

        接下来,介绍下wordcloud的基本使用。wordcloud把词云当作一个对象,它可以将文本中词语出现的频率作为一个参数绘制词云,而词云的大小、颜色、形状等都是可以设定的。高频词条形图可以让我们对词频的数量级有直观地了解。代码如下:

# 读取背景图片
jpg = imread('Background.jpg')
# 绘制词云
wordcloud = WordCloud(mask=jpg,background_color="white",font_path='msyh.ttf',width=1600,height=1200,margin=20,max_words=50
).generate(cloud_text)
plt.figure(figsize=(15, 9))
plt.imshow(wordcloud)
# 去除坐标轴
plt.axis("off")
# plt.show()
plt.savefig("WordCloud.jpg")#绘制条形图
def bar_toolbox() -> Bar:c = (Bar().add_xaxis(x_data[:10]).add_yaxis("关键词", y_data[:10], stack="stack1").set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="高频词条形图"),toolbox_opts=opts.ToolboxOpts(),legend_opts=opts.LegendOpts(is_show=True),xaxis_opts=opts.AxisOpts(name='关键词',name_textstyle_opts=opts.TextStyleOpts(color='red',font_size=20), axislabel_opts=opts.LabelOpts(font_size=15,rotate=45)),yaxis_opts=opts.AxisOpts(name='数量',name_textstyle_opts=opts.TextStyleOpts(color='red',font_size=20),axislabel_opts=opts.LabelOpts(font_size=15,),name_location = "middle")).set_series_opts(label_opts=opts.LabelOpts(position='top',color='black',font_size=15)))return c
bar_toolbox().render('高频词条形图.html')

        词云图效果如下:

 

        条形图如下:

 

四、完整代码

import pandas as pd
import jieba
from imageio.v2 import imread
import matplotlib.pyplot as plt
from pyecharts import options as opts
from pyecharts.globals import SymbolType
from pyecharts.charts import Bar, Page
from wordcloud import WordCloudplt.rcParams['font.sans-serif'] = 'SimHei'df = pd.read_csv('BV1f1421U76k_评论.csv')
text = ''.join(df['内容'])# 读取停用词,创建停用词表
stwlist = [line.strip() for line in open('stop.txt', encoding='utf8').readlines()]# 文本分词
mytext_list = []
number_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
words = jieba.lcut(text, cut_all=False)
for seg in words:for i in number_list:seg = seg.replace(str(i), '')if not seg:continueif seg not in stwlist and seg != " " and len(seg) != 1:mytext_list.append(seg)
cloud_text = ",".join(mytext_list)def word_frequency(txt):# 统计并返回每个单词出现的次数word_list = txt.split(',')d = {}for word in word_list:if word in d:d[word] += 1else:d[word] = 1# 删除词频小于2的关键词for key, value in dict(d).items():if value < 2:del d[key]return dfrequency_result = word_frequency(cloud_text)
frequency_result = list(frequency_result.items())
# 对关键词进行排序
frequency_result.sort(key=lambda x: x[1], reverse=True)
# 输出词频统计表
df = pd.DataFrame(frequency_result, columns=['词', '词频'])
df.to_csv('词频统计.csv', encoding='utf-8-sig', index=False)# 准备数据
x_data = []
y_data = []
for item in frequency_result:x_data.append(item[0])y_data.append(item[1])# 读取背景图片
jpg = imread('Background.jpg')
# 绘制词云
wordcloud = WordCloud(mask=jpg,background_color="white",font_path='msyh.ttf',width=1600,height=1200,margin=20,max_words=50
).generate(cloud_text)
plt.figure(figsize=(15, 9))
plt.imshow(wordcloud)
# 去除坐标轴
plt.axis("off")
# plt.show()
plt.savefig("WordCloud.jpg")#绘制条形图
def bar_toolbox() -> Bar:c = (Bar().add_xaxis(x_data[:10]).add_yaxis("关键词", y_data[:10], stack="stack1").set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="高频词条形图"),toolbox_opts=opts.ToolboxOpts(),legend_opts=opts.LegendOpts(is_show=True),xaxis_opts=opts.AxisOpts(name='关键词',name_textstyle_opts=opts.TextStyleOpts(color='red',font_size=20), axislabel_opts=opts.LabelOpts(font_size=15,rotate=45)),yaxis_opts=opts.AxisOpts(name='数量',name_textstyle_opts=opts.TextStyleOpts(color='red',font_size=20),axislabel_opts=opts.LabelOpts(font_size=15,),name_location = "middle")).set_series_opts(label_opts=opts.LabelOpts(position='top',color='black',font_size=15)))return c
bar_toolbox().render('高频词条形图.html')

 

这篇关于b站评论词频统计绘制词云图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877243

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

Python脚本:TXT文档行数统计

count = 0 #计数变量file_dirs = input('请输入您要统计的文件根路径:')filename = open(file_dirs,'r') #以只读方式打开文件file_contents = filename.read() #读取文档内容到file_contentsfor file_content in file_contents: