背景
在上一节中,利用爬虫爬取了问题下的所有回答,原文链接如下:
python爬取知乎回答并进行舆情分析:爬取数据部分
本节中利用jieba工具对回答分词,统计词频生成词云,并利用折线图统计每日回答数,做一个简单的舆情分析。
生成词云
文本预处理(使用停用词、自定义分词)
jieba分词支持停用词和自定义分词。停用词能够过滤掉与语义无关的单词,自定义分词能够防止指定词汇被切分,例如某些不被一般词典收纳的新潮词汇。
引包:
import pandas as pd
import jieba
import re
import matplotlib
import matplotlib.pyplot as plt
加载词典:
# 加载自定义词典
newdict_path = "./source/newdict.txt"
jieba.load_userdict(newdict_path)
# 加载停用词词典
stop_list = []
stopdict_path = './source/stopdict.txt'
with open(stopdict_path, 'r', encoding='utf-8') as f:
for line in f.readlines():
stop_list.append(line[:-1])
数据预处理:
data = pd.read_csv('./test.csv')
data['回答'] = data['回答'].apply(lambda x : x.replace('\n', ''))
data['回答'] = data['回答'].apply(lambda x : x.replace(' ', ''))
data['分词'] = data['回答'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list])
data['创建时间'] = data['创建时间'].apply(lambda x : x[:10])
统计词频
all_words = data['分词'].to_list()
word_dict = {}
for words in all_words:
for word in words:
if word in word_dict:
word_dict[word] += 1
else:
word_dict[word] = 1
生成词云
利用wordcloud绘制词云:
from wordcloud import WordCloud
# 生成词云
def create_word_cloud(word_dict):
# 支持中文, SimHei.ttf可从以下地址下载:https://github.com/cystanford/word_cloud
wc = WordCloud(
font_path="./source/SimHei.ttf",
background_color='white',
max_words=25,
width=1800,
height=1200,
)
word_cloud = wc.generate_from_frequencies(word_dict)
# 写词云图片
word_cloud.to_file("wordcloud2.jpg")
# 显示词云文件
plt.imshow(word_cloud)
plt.axis("off")
plt.show()
# 根据词频生成词云
create_word_cloud(word_dict)
结果如下:
折线图
统计每日回答数
利用字典统计每日回答的数量。:
# 修正回答时间格式:年-月-日
data['创建时间'] = data['创建时间'].apply(lambda x : x[:10])
date_dict = {}
all_dates = data['创建时间'].to_list()
for date in all_dates:
if date not in date_dict:
date_dict[date] = 1
else:
date_dict[date] += 1
x = []
y = []
for key,value in date_dict.items():
x.append(key)
y.append(value)
生成折线图
%matplotlib inline
#通用设置,背景颜色、图片大小、是否
matplotlib.rc('axes', facecolor = 'white')
matplotlib.rc('figure', figsize = (6, 4))
matplotlib.rc('axes', grid = True)
#数据及线属性
plt.plot(x, y,'.-')
#标题设置
plt.title('test')
plt.xlabel('date')
plt.ylabel('amount')
结果如下:
展望
除了回答和创建时间两个字段以外,爬取结果的其他字段也可以进行数据分析;也可以尝试利用user_token做一个用户画像分析。