Python文字挖掘:知乎網友如何評價《人民的名義》
文字分析使用愈來愈廣泛,包括對新聞、電視劇、書籍、評論等等方面的文字挖掘並進行分析,可以深入找到表面文字看不到的細節。
介於《人民的名義》這部劇這麼火,本人以此為基礎,通過對知乎上網友提出的問題進行爬取,並蒐集到每一問題的關注、瀏覽數,進行分析。在未登入的情況下,找到知乎——《人民的名義》主題網頁下的等待回答——全部問題(見下圖),時間截止到2017年4月15日,地址為:https://www.zhihu.com/topic/20047590/questions 。
(在登入狀態下,可以顯示更多資訊,但是需要設定知乎登入函式,同時登入之後可能反爬蟲機制會嚴格)。
每一個問題對應一個連結,點選進去會有該問題的關注者、瀏覽者等相關資訊,如果有人回答還會有回答人數等等,如圖。
(1)抓取問題資訊 基於上述構造,本文編寫爬蟲函式來爬取這些資訊,第一步先通過《人民的名義》主題網頁抓取每一個問題的連結,第二步再通過每一個連結,抓取每一個問題的內容、關注者、瀏覽者資訊。
from bs4 import BeautifulSoup import urllib.request import time,re import pandas as pd import numpy as np import matplotlib.pyplot as plt import socket socket.setdefaulttimeout(20) #對整個socket層設定超時時間。 def url_open(url): req = urllib.request.Request(url) req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0') page = urllib.request.urlopen(req) # 模仿瀏覽器登入 txt = page.read().decode('utf-8') soup = BeautifulSoup(txt, 'lxml') return soup #封裝問題的連結 page_url =[] for num in range(1,45): url = 'https://www.zhihu.com/topic/20047590/questions?page={}'.format(num) soup = url_open(url) urllist = soup.find_all(attrs={'class': 'question-item-title'}) time.sleep(10) for i in urllist: page =i.a['href'] page_url.append('https://www.zhihu.com' + page) def get_info(page_url): soup = url_open(page_url) titles= soup.find_all(attrs= {'class':'QuestionHeader-title'})[0].get_text() focus = soup.select('div.NumberBoard-value')[0].get_text() reviews = soup.select('div.NumberBoard-value')[1].get_text() frame = pd.DataFrame([titles, focus, reviews], index=['titles', 'focus', 'reviews']) # 轉入資料列表 frame = frame.T return frame
(2)將資訊轉入dataframe資料結構,並進行統計分析 在構建get_info(page_url)的基礎上,採用map抓取資訊,並裝入dataframe資料結構中。
socket.setdefaulttimeout(20) frame_list = list(map(get_info,page_url)) time.sleep(10) i, j, k,= [], [], [], [(i.extend(x['titles'])) for x in frame_list] [(j.extend(x['focus'])) for x in frame_list] [(k.extend(x['reviews'])) for x in frame_list] df = pd.DataFrame([i, j, k, l], index=['titles', 'focus', 'reviews']) df1 = df.T print(df1)
最終抓取到了800多條問題,首先對df1資料按照關注者的數量“focus”進行排序,並篩選出關注者最高的前10個問題。 df1['focus'] = df1['focus'].astype('int') df1['reviews'] = df1['reviews'].astype('int') df2 = df1.sort(columns='focus',ascending=False) df3=df2.iloc[0:10,0:2] #loc通過標籤選擇資料,iloc通過位置選擇資料 df3
得到結果為:
可以看到,知乎網友關注較多的還是劇中的角色,特別是達康書記——該劇目前最火也最有話題性的人物,其次該劇一些爭議性的話題,包括穿幫與硬傷等,對陸毅扮演侯亮平的演技,以及比較令人討厭的角色(鄭氏父子、林華華等)的討論,趙東來撩妹作為近期比較火的一個話題也上了top10.
(3)瀏覽者最多的問題 對df1資料按照瀏覽者的數量“reviews”進行排序,並篩選出關注者最高的前10個問題。
df4 = df1.sort(columns='reviews',ascending=False)
df5=df2.iloc[0:10,[0,2]]
df5
可以看到瀏覽者的top10與關注者基本一致。
Paste_Image.png
(4)對問題的文字分析 對這800多個問題進行分本分析與挖掘,以便深入分析網友提問的關注角度。
titles=list(df1['titles']) #將titles列專門提取出來,並轉化為列表形式 titles1=''.join(titles) #將列表形式轉化為文字 import jieba #使用jieba進行分詞 blacklist = [u'如何', u'評價', u'人民的名義', u'應',u'是', u'也', u'上', u'後', u'前', u'為什麼', u'再', u',', u'以及', u'因為', u'從而', u'但', u'像',u'更', u'用', u'“', u'這', u'有', u'在', u'什麼', u'都',u'是否',u'一個',u'是不是', u'”', u'還', u'使', u',', u'把', u'向',u'中', u'新', u'對', u' ', u' ', u')', u'、', u'。', u';', u'%', u':', u'?', u'(', u'的',u'和', u'了', u'湖南衛視', u'將', u'到', u'',u'人民',u'名義',u'電視劇',u'怎麼', u'從', u'年', u'今天', u'要', u'並', u'n', u'《', u'為', u'月', u'號', u'日', u'大',u'如果',u'哪些', u'看待', u'怎樣', u'還是', u'應該',u'這個', u'這麼',u'沒有',u'這部',u'哪個', u'可以',u'有沒有']
#設定blacklist黑名單過濾無關詞語 hist = {} #將詞語轉入字典 for word in jieba.cut(titles1): #jieba分詞 if word in blacklist: #採用黑名單過濾 continue if len(word)<2: #去除單個字的詞語 continue hist[word] = hist.get(word, 0) + 1 #相同詞語進行彙總統計 hist
根據分詞結果,排序找到知乎網友提問問題中使用較多的詞,這是從另一個角度分析知乎網友對《人民的名義》關注的相關點。
zhfont = matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/msyh.ttf')#載入字型 # 對詞頻排序 hist_sorted = sorted(hist.items(), key=lambda d: d[1], reverse=True) # 取頻率最高10個詞繪製曲線圖 x = range(15) y = [hist_sorted[i][1] for i in range(15)] plt.bar(x, y, width = 0.35,align='center',color = 'c',alpha=0.8) plt.xticks(x, [hist_sorted[i][0] for i in range(15)],fontproperties=zhfont,size='small',rotation=30) for a,b in zip(x,y): plt.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=10) plt.title(u"《人民的名義》詞頻分析",fontproperties=zhfont) plt.ylim(0,70) plt.xlim(0.5,14.5) plt.grid() #網格線 plt.show()
得到圖形:
Paste_Image.png
從上圖來看,書記、達康這個最火的話題仍然是提問者比較關注的,但與前邊關注者統計不同的是,提問者對祁同偉的關注度較高,其次蔡成功(成功)、高育良、歐陽菁、丁義珍等人也有一定的關注度,大風集團也有一定的關注度。 另外,問題中提到“現實”這個詞語的有這樣一些: 現實中有像易學習這樣的領導幹部嗎? 現實裡有幾個人可以做到像李達康一樣不為自己人謀福利? 現實中有沒有像易學習一樣的基層幹部? 現實之中真的有像李達康這樣的書記嗎? 現實中李達康這樣的領導是否值得追隨? 如何看待最高檢拍攝<人民的正義>取得巨大得成功?現實情況如確實如此,是否應該怒其不爭? 侯亮平如果在現實官場中,際遇會如何? …… 基本上都是將劇中人物、事件與現實對照,探究該劇現實的可能性。 在過濾無關詞語的基礎上,
#過濾不相關詞,並繪製詞雲圖text = []for word in jieba.cut(titles1):
if word in blacklist: continue
text.append(word)
text1=''.join(text)
text1# 建立詞雲wordcloud = WordCloud(font_path="C:/Windows/Fonts/msyh.ttf",
background_color="black").generate(text1)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
繪製詞雲圖如下:
可以看到,侯亮平、李達康等關注度較高,其次對拍攝方面有一些關注,比如鏡頭、手法、拍攝、好看,對受賄、貪官、行賄、利益等腐敗問題關注度也比較高。另外,由於送審樣片的流出,對送審的關注度也較高。
(5)總結 綜合看來,從知乎問題關注者、瀏覽者的角度來看,所關注的問題基本上是目前網友也比較關心的問題,比如達康書記、陸毅的演技、討厭的角色(鄭氏父子、林華華)、趙東來撩妹、豆瓣刷一星等等。
從提問者關注的角度來看,對更多的角色有所關注,比如祁同偉、高育良、蔡成功等等,另外還關注拍攝技巧、腐敗問題、與現實的對照性等等。無論是關注者的角度還是提問者的角度,達康書記是最高的關注點。
同時,從上述文字分析來看,由於jieba分詞的精確性,在初步的文字挖掘中,還是存在著欠缺的地方,比如部分詞語不完整或遺漏,這需要更精確的文字挖掘方式,比如設定《人民的名義》詞庫,或者採用機器學習演算法來智慧地深入分析
。http://www.jianshu.com/p/817c4829fdc5