《我不是葯神》影評文本分析
對於某一話題的評論進行文本分析,主要為文本數據,進行中文分詞、關鍵詞提取、詞性句法分析等簡單數據分析處理。
1.1 問題確定
對豆瓣電影Top250中由中國大陸制片排名最前(第40名)的電影——《我不是葯神》,如圖1.1所示,進行電影評論文本綜合性分析,包含對評論中關鍵詞詞頻統計、詞性分析並可視化展示等,通過分析能夠得到該電影躋身豆瓣Top250、成為中國大陸制片排名最高影片的原因,綜合得出大眾化總評。
圖1.1 選取數據
1.2 數據准備
1.2.1 數據爬取
爬取豆瓣網《我不是葯神》中的短評前15頁評論,如圖1.2.1(1)所示,共300條數據,如圖1.2.1(2)所示,並寫入txt文件,如圖1.2.1(3)所示。
圖1.2.1(1) 《我不是葯神》部分短評
圖1.2.1(2) 爬取數據
圖1.2.1(3) 數據txt文件展示
1.2.2 問題處理
在爬取的過程中,遇到了如圖1.2.1(4)報錯問題,通過查找資料得知雖然我在爬蟲代碼中設置了UserAgent池來防止反爬蟲,但由於我多次訪問登錄或者這次爬取時沒有登錄用戶,可能IP被封鎖,獲取的cookie不是實時的,理清解決思路得以成功處理。
圖1.2.2 報錯問題
1.3 數據探索
1.3.1 數據清洗
使用jieba庫,將評論文本數據進行中文分詞處理,並使用通用停用詞表,去除評論中關聯詞等非關鍵詞以及標點符號、空格、回車等標符,寫入txt文件,結果如圖1.3.1所示。
圖1.3.1 分詞處理結果
1.3.2 數據分析
1. 評論詞頻統計
對評論數據分詞后提取的關鍵詞進行詞頻統計,運用詞語前10個結果如圖2.3.2(1)所示,並生成詞雲可視化,如圖1.3.2(2)所示,可以看出人們多從電影的題材、意義、演員等方面來評價《我不是葯神》這部電影,根據詞頻說明該電影選擇的題材改編自真實故事,非常現實,很貼近人們的社會生活,具有真實性,徐崢、王傳君等演員的演技及導演獲得人們更多的評價,所表現的社會現實意義得到觀眾的認可與接受,值得讓更多的人看到。
圖1.3.2(1) 前10個高頻詞結果展示
圖1.3.2(2) 詞頻統計詞雲結果展示
2. 評論詞性標注
使用jieba.posseg庫做帶有詞性標注的分詞,並通過循環得到每個分詞的詞語和類別結果,部分結果及詞性大致分布如圖1.3.2(3)所示,可參照圖1.3.2(4)進行理解。從圖中可以看出人們的評論關鍵詞多出現在名詞、動詞、人名中,更能體現人們評論的中心思想。
圖1.3.2(3) 詞性標注部分展示
圖1.3.2(4) 詞性標注部分分類
1.4 評論文本分析結論
綜上所述,《我不是葯神》這部電影於2018年7月上映,電影在大眾心中的地位、在豆瓣排名第40位絕非偶然,畢竟電影是對於社會事件的回應,真正的現實主義,並非僅僅只是一個社會事件。該影片中在情與理之間講述生死,將中國人普遍的道德焦慮置於影片之中,情理間體現了道德的無助,生死間使情感借以表達與依托,更易引起人們的共鳴,也更值得讓更多人看到。
這次的數據只有300條,可能缺乏結論得出的可靠性,但都是豆瓣最新評論數據,具有時效性、真實性。實驗對評論文本分析時可以考慮建立LDA等情感分析模型對評論數據進行情感性分析,考慮的因素會更多,但此次實驗的結論也可以作為大眾電影總評為更多的觀影者和電影制片方參考。
1.5 附部分代碼
1. 中文分詞
import jieba # 創建停用詞list def stop_wordslist(filepath): stop_words = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] return stop_words # 對評論數據進行分詞 def seg_sentence(sentence): # 使用jieba庫進行分詞 sentence_seged = jieba.cut(sentence.strip()) # 加載停用詞 stopwords = stop_wordslist('stop_words.txt') outstr = '' # 去除停用詞 for word in sentence_seged: if word not in stopwords: if word != '\t': outstr += word outstr += " " return outstr m = open('我不是葯神.txt', 'r', encoding='utf-8') n = open('我不是葯神(關鍵詞).txt', 'w', encoding='utf-8') for line in inputs: line_seg = seg_sentence(line) # 這里的返回值是字符串 n.write(line_seg + '\n') m.close() n.close() # 顯示處理后的文本數據 fname = '我不是葯神(關鍵詞).txt' file = open(fname,'r', encoding='utf-8') for eachLine in file: print(eachLine) file.close()
2. 評論詞頻統計
import pandas as pd # 對分詞后提取的關鍵詞進行詞頻統計 # 讀取處理后的文件 file = open(fname, "r", encoding='utf-8').read() # 進行分詞 words =jieba.lcut(file) counts ={} for word in words: # 去掉空格等其他單字符 if len(word) == 1: continue else: # 計數 counts[word] = counts.get(word,0) + 1 # 把對象對象轉化為列表形式,利於下面操作 items =list(counts.items()) # sort() 函數用於對原列表進行排序,如果指定參數,則使用比較函數指定的比較函數 # reverse 排序規則,reverse = True 降序, reverse = False 升序(默認) # key 是用來比較的參數 items.sort(key=lambda x:x[1], reverse=True) df=pd.DataFrame(columns=['word', 'times']) x=[] y=[] # 顯示前20個高頻詞與其頻數 for i in range(40): word, count =items[i] x.append(word) y.append(count) df['word'] = x df['times'] = y print(df)
3. 評論詞性分析
# 使用jieba.posseg做帶有詞性標注的分詞 import jieba.posseg as pseg # 進行詞性標注 # 使用jieba.posseg做帶有詞性標注的分詞,並通過循環得到每個分詞的詞語和類別結果 df1=pd.DataFrame(columns=['word', 'type']) a=[] b=[] for i in range(len(df)): words = pseg.cut(df.ix[i][0]) ##我這里對第一列即A列進行分詞 for word,flag in words: a.append(word) b.append(flag) df1['word']=a df1['type']=b print(df1)