问题描述
通过中文分词、过滤停用词、生成词云图等步骤对评论数据进行处理和可视化。
效果截图如下
非常nice
问题分析
该程序需要使用 Selenium 库来模拟浏览器操作,因此需要下载安装 Chrome 浏览器以及对应版本的 Chromedriver。 程序中需要读取本地 stopwords.txt 文件中的停用词列表,因此需要先准备好该文件。 生成的词云图字体需要下载并放到与文件同级的目录上
前期准备
代码中用到的库和版本如下
- Selenium (3.141.0)
- jieba (0.42.1)
- wordcloud (1.8.1)
- matplotlib(3.4.2)
- numpy (1.20.3)
运行命令
pip install selenium jieba wordcloud matplotlib numpy
进行下载
完整代码及解释
代码语言:javascript复制# 导入所需库
from selenium import webdriver # 网页自动化测试工具
from selenium.webdriver.common.by import By # 定位元素方法
import jieba # 中文分词库
from wordcloud import WordCloud # 词云库
import matplotlib.pyplot as plt # 数据可视化库
import numpy as np # 数学计算库
import os # 操作系统接口库
# 创建浏览器对象并打开目标网页
browser = webdriver.Chrome() # 创建 Chrome 浏览器对象
url = 'https://movie.douban.com/subject/34841067/comments?status=P' # 目标网页的 URL
browser.get(url) # 打开目标网页
# 定义选择器和结果列表
selector = 'span.short' # CSS 选择器,表示评论所在的元素
results = [] # 用于存储获取到的评论
# 判断是否存在下一页按钮,不断翻页并获取评论数据
while True:
elements = browser.find_elements(By.CSS_SELECTOR, selector) # 使用选择器查找所有评论元素
for element in elements:
comment = element.text.strip() # 获取元素的文本,去除空格和换行符
if len(comment) > 0: # 如果评论非空
results.append(comment) # 存储该评论
# 点击下一页按钮
try:
next_btn = browser.find_element(By.LINK_TEXT, '后页>') # 查找“下一页”按钮元素
next_btn.click() # 点击“下一页”按钮
except:
break # 如果没有找到“下一页”按钮,说明已经到达最后一页,退出循环
# 关闭浏览器对象
browser.quit() # 关闭浏览器
# 合并所有评论文本
text = 'n'.join(results) # 将所有评论文本拼接成一个字符串,用换行符隔开
# 使用 jieba 分词库进行中文分词
words = jieba.cut(text) # 对评论文本进行中文分词,返回一个生成器对象
# 获取停用词列表
stop_words_path = 'stopwords.txt' # 停用词文件的路径
with open(stop_words_path, encoding='utf-8') as f:
stop_words = f.read().splitlines() # 读取停用词文件,将每行转换为一个元素,存储为列表
# 过滤出有效词汇
valid_words = [word for word in words if word not in stop_words] # 过滤掉停用词,仅保留有效词汇
# 将过滤后的词汇拼接成字符串
valid_text = ' '.join(valid_words) # 将词汇列表中的所有元素拼接成一个字符串,用空格隔开
# 创建词云对象
wc = WordCloud(
font_path="PingFang Bold.ttf", # 指定词云字体
width=800, # 词云图像宽度
height=600, # 词云图像高度
background_color='white', # 背景颜色
max_words=200, # 最大显示单词数
max_font_size=80, # 最大字号
random_state=42 # 随机状态
)
# 生成词云图
wc.generate(valid_text) # 生成词云图像数据
# 定义输出路径
output_dir = 'output' # 词云图像输出路径
output_path = os.path.join(output_dir, 'wordcloud.png') # 拼接输出文件路径
# 检查输出目录是否存在
if not os.path.exists(output_dir): # 如果输出目录不存在
os.makedirs(output_dir) # 创建该目录及其所有父目录
# 输出词云图
wc.to_file(output_path) # 将词云图像输出到指定文件
# 显示词云图
plt.imshow(wc, interpolation='bilinear') # 将词云图像显示出来,使用双线性差值算法平滑显示
plt.axis('off') # 不显示坐标轴
plt.show() # 显示图像
字体素材
链接: https://pan.baidu.com/s/1-nXL9-8NRbWPd2m4AGOUNw 提取码: esf2