一、分析背景
烏克蘭局勢這兩天日益緊張,任何戰爭到最后傷害的都是無辜平民,所以沒有真正的贏家!
祈禱戰爭早日結束,世界和平!
油管上討論烏克蘭局勢的評論聲音不斷,采用python的文本情感分析技術,挖掘網友輿論導向,
二、整體思路
選取5個近期”烏克蘭“相關視頻,分析每個視頻下的Top300熱評:

- 爬蟲采集評論(requests)
- 情感分類打分、打標判定結果(積極/中性/消極)(中文用SnowNLP,英文用TextBlob)
- 統計出Top10高頻詞(jieba.analyse)
- 繪制詞云圖(wordcloud)
三、代碼講解
3.1 爬蟲采集
爬蟲程式依然采用上次爬取李子柒油管評論的程式,在此不再贅述,
封裝下爬蟲程式,達到采集多個視頻評論的目的:
video_id_list = ['pYLjb7xIbOk', 'HnFnyNEuCUk', 'F0lYqJmGf-M', 't51ebUWe0Ag', '0RiEMEpKqic']
def download_comments(video_id_list):
"""
下載視頻評論
:param video_id_list: 視頻id串列
:return: None
"""
cnt = 1
for id in video_id_list:
print('正在爬取第{}個視頻的評論'.format(cnt))
cmd = r"python downloader.py -y={} -o={}.json -s 0 -l 300".format(id, id) # 按熱門排序,爬取前300條評論
print('開始爬取:{}'.format(id))
a = os.system(cmd) # 執行爬取評論命令
print('結束爬取:{}'.format(id))
cnt += 1
print('爬取完成:{}'.format(id))
這樣,就把5個代表性視頻的前300條熱門評論爬取到了,爬取下來是json檔案,轉換為excel檔案:
# 把json批量轉換為excel
for file in os.listdir('./'):
if file.endswith('json'):
print(file)
f_head, f_tail = file.split(".")
print(f_head, " || ", f_tail)
try:
df = pd.read_json(file, lines=True)
df.to_excel('{}.xlsx'.format(f_head), index=False, engine='xlsxwriter', encoding='UTF-8')
except Exception as e:
print('Excepted-》{}: {}'.format(file, str(e)))
查看下評論資料的excel檔案:
3.2 情感判定
針對每條評論資料,打情感分,判定情感結果,核心邏輯代碼:
if not is_chinese(comment): # 不是中文,是英文評論
judge = TextBlob(comment)
sentiments_score = judge.sentiment.polarity
if sentiments_score < 0:
tag = '消極'
elif sentiments_score == 0:
tag = '中性'
else:
tag = '積極'
else: # 是中文評論
sentiments_score = SnowNLP(comment).sentiments
if sentiments_score < 0.5:
tag = '消極'
else:
tag = '積極'
情感得分、判定結果:
當然,還可以統計出積極、中性、消極各占多少百分比,畫出餅圖,對分析結果更具有說服力,
3.3 Top10高頻詞
用jieba自帶的統計功能,直接獲取到高頻詞和權重,就不要自己造輪子了!
# 用jieba分詞統計評論內容的前10關鍵詞
keywords_top10 = jieba.analyse.extract_tags(v_cmt_str, withWeight=True, topK=10)
topK引數傳入幾,就是統計前幾名,
以topK=10為例,統計結果:
3.4 詞云圖
采用wordcloud庫繪制詞云圖,詞云圖也是一種體現高頻詞的統計方式,
def make_wordcloud(v_str, v_stopwords, v_outfile):
"""
繪制詞云圖
:param v_str: 輸入字串
:param v_stopwords: 停用詞
:param v_outfile: 輸出檔案
:return: None
"""
print('開始生成詞云圖:{}'.format(v_outfile))
try:
stopwords = v_stopwords # 停用詞
backgroud_Image = plt.imread('烏克蘭地圖.jpg') # 讀取背景圖片
wc = WordCloud(
scale=4, # 清晰度
background_color="white", # 背景顏色
max_words=1500, # 最大詞數
width=1500, # 圖寬
height=1200, # 圖高
font_path='/System/Library/Fonts/SimHei.ttf', # 字體檔案路徑,根據實際情況(Mac)替換
# font_path="C:\Windows\Fonts\simhei.ttf", # 字體檔案路徑,根據實際情況(Windows)替換
stopwords=stopwords, # 停用詞
mask=backgroud_Image, # 背景圖片
)
wc.generate(v_str) # 生成詞云圖
wc.to_file(v_outfile) # 保存圖片檔案
print('詞云檔案保存成功:{}'.format(v_outfile))
except Exception as e:
print('make_wordcloud except: {}'.format(str(e)))
wordcloud的核心引數說明,我已經加到注釋上了↑,請查閱,
采用烏克蘭地圖作為背景圖,最終效果如下:(左:背景圖,右:詞云圖)
四、得出結論
從情感判定、高頻詞統計還有詞云圖體現,網友對此次事件消極和中性的情緒占據了一大部分,
而且仔細查看積極面的評論里,很多評論都是為烏克蘭等人民祈福保佑的內容,所以也不是針對戰爭的積極評價,
所以,整體而言,是負面評價較多,
五、同步視頻演示
https://www.zhihu.com/zvideo/1480526739331387392
by: 馬哥python說
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471764.html
標籤:Python
下一篇:python爬蟲
