一、实现目标
我们有一些关于庆余年的豆瓣评论,它闪存储在txt文件中,我们要读取这些评论,并进行了中文分词,最后制作了一张词云图,如下。
二、实现步骤
打开txt文件,可以看到内容是一些关于庆余年的评论,它们由句子组成。我们先要读取这些句子,然后将语句拆分成中文词语,再统计各个词语出现的次数,最后再生成词云图。
2.1 读取数据
使用with open()打开文件,由于文件内从较大,需要逐行读取里面的评论。
# 以只读的方式打开"豆瓣评论_庆余庆.txt",里面存放的是关于"庆余庆 第二季的评论"
with open("D:\学习资料\Python\VSCode\yequbiancheng\网络爬虫\豆瓣评论_庆余庆.txt", "r", encoding='utf-8') as fp:
# 读取第一行到line
line = fp.readline()
# 判断line是否为空
while line:
# ....
line = fp.readline()
2.2 中文分词
中文分词是中文信息处理的基本技术,指的是将一个汉字序列切分成一个一个单独的词。在搜索引擎、机器翻译、语音合成等技术中,都需要用到中文分词。中文分词的方法有很多种,我们使用国内人数最多的中文分词工具——jieba 分词
# 导入jieba模块
import jieba
# 1、读取数据
# 定义一个列表用于存放分词结果
wordList = []
# 以只读的方式打开"豆瓣评论_庆余庆.txt",里面存放的是关于"庆余庆 第二季的评论"
with open("D:\学习资料\Python\VSCode\yequbiancheng\网络爬虫\豆瓣评论_庆余庆.txt", "r", encoding='utf-8') as fp:
# 读取第一行到line
line = fp.readline()
# 判断line是否为空
while line:
# 2、中文分词
# 使用jieba.lcut()对line进行中文分词,并将分词结果赋值给words, words是个列表
words = jieba.lcut(line)
# 合并列表
wordList = wordList + words
# 读取txt文件的下一行
line = fp.readline()
在 jieba 模块中,分词的方法有很多种,在这里,我们使用 jieba.lcut(),jieba.lcut() 可以将字符串切分为词语,拆分后的词语列表合并、存放在wordList列表中。
我们看到在列表中,不仅有词语,还有标点符号、数字,甚至还有不是词语的单个字,例如:"是", "的","到"等,这些都是我们不需要的字符串。有什么方法既能把不需要的字符串剔除掉,还能进行词频统计呢?
2.3 词频统计
在这里,我们可以使用字典dict。来进行词频统计。
建立一个空白字典,遍历列表,剔除长度等于1的一些标点符号和语气词,将字符串作为字典的键添加进字典中。如果字典中还没有相同的键,把新元素添加进字典中,对应的值设为1;如果已经存在相同的键,就把对应的值进行累加。这样就可以统计出,列表中相同字符串的个数。
# 3、利用字典词频统计
# 定义一个空字典
wordDict = {}
# 遍历wordList的分词
for word in wordList:
# 如果列表中的元素长度大于1
if len(word) > 1:
# 判断word是否已经在letter字典的key中
if word in wordDict.keys():
# 如果在,该key值加1
wordDict[word] = wordDict[word] + 1
else:
# 如果不在,将word添加到字典中,并设初始值为1
wordDict[word] = 1
如下我们就得到了一个统计结果。
2.4 生成词云图
统计好词频后,接下来就到了最后一个环节——生成词云图。词云图是文本数据的视觉表示,由词汇组成类似云的彩色图形,用于展示大量文本数据。词云图是对文字中出现频率较高的“关键词”的视觉上的突出,过滤掉大量的文本信息,使浏览者只要一眼扫过就可以领略主旨。
生成词云图,要用到 pyecharts 模块,pyecharts 是一个用于生成 echarts 图表的模块。echarts 是百度开源的一个数据可视化模块,使用 pyechart 模块可以在 python 中生成 echarts 数据图。它不是一个内置模块,所以在使用前要先通过代码 pip3 install pyecharts==1.8.1 在终端中进行安装。
pyecharts 模块是基于 echarts 模块构建的,所以我们要使用 pyecharts.charts 中的 WordCloud 来绘制词云图。
# 4、生成词云图
# 从pyecharts.charts中导入WordCloud模块
from pyecharts.charts import WordCloud
# 创建WordCloud对象,赋值给wd
wd = WordCloud()
# 设备词云图的参数
wd.add(series_name = "", data_pair = wordDict.items(), word_size_range = [20,80])
# 生成、保存词云图
wd.render("D:/学习资料/Python/VSCode/yequbiancheng/网络爬虫/庆余年.html")
导入 WordCloud() 类后,需要调用类中的方法,接下来,使用 WordCloud() 函数创建一个对象。
然后,调用 add() 函数可以设置词云图的内容,例如:展示文字,字体大小等。
series_name:指的是数据的统称,例如:降水量、蒸发量。series_name为必须参数,就是必须传入,词云图中展示的是文字内容,这里 series_name 可以设置为空,即 series_name=""。
data_pair:参数是指传入词云图中的数据,它的值的格式为:[(word1, count1), (word2, count2)]这是一个由元组组成的列表,列表中的每项都是元组。word 是词云图中的文字;count 是文字的词频。在这里,我们使用 items() 函数,将字典 wordDict中的每对 key 和 value 组成一个元组,并把这些元组放在列表中返回。例如:对wordDict使用items(),wordDict.items(), 就能获得列表 [('君问', 150), ('归期', 130), ('未有期', 120)] 。items() 函数的返回结果,刚好符合 data_pair 参数的要求,即 data_pair=wordDict.items() 。
word_size_range:是用来设置词云图中字体大小范围,它的数据类型是列表。word_size_range 的默认值为[12, 60],12代表着词云图中频率最低的词语大小,60代表着词云图中频率最高的词语大小。在这里,我们可以修改参数值设置为[20, 80],即 word_size_range = [20,80] 。
最后,调用render() 函数将词云图以 html 格式存储在本地,render() 中要传入字符串,即本地的路径。
完整的代码如下:
# 导入jieba模块
import jieba
# 从pyecharts.charts中导入WordCloud模块
from pyecharts.charts import WordCloud
# 1、读取数据
# 定义一个列表用于存放分词结果
wordList = []
# 以只读的方式打开"豆瓣评论_庆余庆.txt",里面存放的是关于"庆余庆 第二季的评论"
with open("D:\学习资料\Python\VSCode\yequbiancheng\网络爬虫\豆瓣评论_庆余庆.txt", "r", encoding='utf-8') as fp:
# 读取第一行到line
line = fp.readline()
# 判断line是否为空
while line:
# 2、中文分词
# 使用jieba.lcut()对line进行中文分词,并将分词结果赋值给words, words是个列表
words = jieba.lcut(line)
# 合并列表
wordList = wordList + words
# 读取txt文件的下一行
line = fp.readline()
# print(wordList)
# 3、利用字典词频统计
# 定义一个空字典
wordDict = {}
# 遍历wordList的分词
for word in wordList:
# 如果列表中的元素长度大于1
if len(word) > 1:
# 判断word是否已经在letter字典的key中
if word in wordDict.keys():
# 如果在,该key值加1
wordDict[word] = wordDict[word] + 1
else:
# 如果不在,将word添加到字典中,并设初始值为1
wordDict[word] = 1
# 4、生成词云图
# 创建WordCloud对象,赋值给wd
wd = WordCloud()
# 设备词云图的参数
wd.add(series_name = "庆余年", data_pair = wordDict.items(), word_size_range = [20,80])
# 生成、保存词云图
wd.render("D:/学习资料/Python/VSCode/yequbiancheng/网络爬虫/庆余年.html")
执行后,在目录中找到这个 html 文件,点击它,就可以在浏览器中看到生成的词云图啦。
三、总结
本实例中,我们将关于庆余年的豆瓣电影评论进行了中文分词,并制作了一张词云图。使用了jieba、pyecharts模块。
jieba:(结巴分词)是一个开源的中文分词工具,用于将中文文本切分成词语或词汇单位。它是一个 Python 库,广泛用于自然语言处理(NLP)和文本分析领域。
pyecharts:pyecharts模块是生成 Echarts 图表的 Python 类库 , 该模块提供了简单易用的 API , 可以让开发者通过 Python 代码快速生成各种类型的 Echarts 图表 , 包括折线图、柱状图、散点图、饼图、雷达图等。