【python輿情分析(5)】 情感傾向分析之魯迅《祝福》裏對祥林嫂(特定人物)的情感傾向

1. 獲取百度AI接口許可及生成情感傾向分析的url鏈接

注意要用自己的密匙獲取access_token,注意要用自己的密匙獲取access_token,注意要用自己的密匙獲取access_token!!!

import requests 
import json
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
 
#client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官網獲取的AK】&client_secret=【官網獲取的SK】'
response = requests.get(host)
if response:
    access_token = response.json()['access_token']

# 按要求寫入header參數
headers = {'content-type': 'application/json'}

#生成情感分析的鏈接
url_sentiment_classify = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=' +  access_token

2. 分析文本選擇

文章選自魯迅的短片小說《祝福》

#加載要分析的文本
news = '''參考上面的鏈接的文章,將原文複製到這裏即可'''

#去掉換行符
news = news.replace('\n','')

#統計特定人物的句子數量
xls_sentences = []
for i in news.split('。'):
    if '祥林嫂' in i or  '她' in  i:
    #魯迅在文章中的‘她’指代的也是祥林嫂
        xls_sentences.append(i)
print('包含祥林嫂的句子數量:',len(xls_sentences))
xls_sentences[:5]

–> 輸出的結果爲:

包含祥林嫂的句子數量: 132

['況且,一直到昨天遇見祥林嫂的事,也就使我不能安住',
 '那是下午,我到鎮的東頭訪過一個朋友,走出來,就在河邊遇見她;而且見她瞪着的眼睛的視線,就知道明明是向我走來的',
 '我這回在魯鎮所見的人們中,改變之大,可以說無過於她的了:五年前的花白的頭髮,即今已經全白,全不像四十上下的人;臉上瘦削不堪,黃中帶黑,而且消盡了先前悲哀的神色,彷彿是木刻似的;只有那眼珠間或一輪,還可以表示她是一個活物',
 '她一手提着竹籃',
 '內中一個破碗,空的;一手拄着一支比她更長的竹竿,下端開了裂:她分明已經純乎是一個乞丐了']
3. 情感傾向指標計算

1) 少量句子進行試錯

① 這裏選擇第五個句子進行試錯分析

xls_sentences[4]

–> 輸出的結果爲:

'內中一個破碗,空的;一手拄着一支比她更長的竹竿,下端開了裂:她分明已經純乎是一個乞丐了'

② 測試代碼如下:

responsei = requests.post(url_sentiment_classify, 
                         data = json.dumps({'text': xls_sentences[4]}),    
                         headers = headers)
if response:
    print(responsei.json()['items'][0])

–> 輸出的結果爲:(以第五個句子進行舉例,發現可以正常輸出,而且句子的情感負向指數達到了99.9%,可以說是非常負面的評價了)

{'positive_prob': 0.000266106, 'confidence': 0.999409, 'negative_prob': 0.999734, 'sentiment': 0}

2) 對全部的句子遍歷循環

爲了保證服務器的正常反饋回來數據,這裏建議加上請求暫停時間,如果不加等待時間請求服務器過快,會導致返回數據錯誤,無法獲取其中的內容,這裏隨機設定爲0.5秒

import time
start_time = time.time()

#保存數據,爲了數據可視化
xls_data = []
for i in xls_sentences:
    try:
    	# 請求網址然後返回數據
        responsei = requests.post(url_sentiment_classify,
                                 data = json.dumps({'text':i}),
                                 headers =headers)
        if responsei:
        # 如果返回數據了,然後提取相應的字段信息
            dic = {'sentence':i,
                  'positive_prob':responsei.json()['items'][0]['positive_prob'],
                  'sentiment':responsei.json()['items'][0]['sentiment']}
            #print(dic) 數據覈實
        
            xls_data.append(dic)
       
        #添加請求暫停時間
        time.sleep(0.5)
        
    except:
        continue
        
# 數據轉爲DataFrame
df_xls = pd.DataFrame(xls_data)

# 計算代碼執行時間 
end_time = time.time()
print('代碼運行時間(s):', end_time - start_time)
print(len(df_xls))
df_xls.head()

–> 輸出的結果爲:(可以發現當句子的數量較大時候,程序運行的時間也是計較大的)

代碼運行時間(s)125.8831992149353
132

3)前五條數據如下
在這裏插入圖片描述

4. 繪製圖表查看關鍵人的情感傾向指數

1) pyecharts版本使用

這裏使用的pyecharts 0.5.11版本進行繪製

import pyecharts as pe
print(pe.__version__)

–> 輸出的結果爲:

0.5.11

2) 選定繪圖數據

由於要繪製雙軸圖,所以是要有一個x值兩個y值

x = df_xls['sentence']
y1 = df_xls['positive_prob']
y2 = df_xls['sentiment']

3) 繪製柱狀圖和折線圖

bar = pe.Bar('祥林嫂 情感傾向')
bar.add('情感傾向指數', x, y1,
         is_datazoom_show = True, datazoom_range = [0,100], 
         mark_line=[ "average"],
         tooltip_axispointer_type = 'cross')

# 繪製折線圖
line = pe.Line('祥林嫂 情感傾向')
line.add('情感傾向分類', x, y2, is_step=True, area_opacity = 0.2)

4) 兩圖合併

# 合併圖表
overlap = pe.Overlap()
overlap.add(bar)
overlap.add(line, 
            yaxis_index=1, is_add_yaxis=True)  # 新增y軸
overlap #jupyter notebook支持直接出圖

–> 輸出的結果爲:(可以點擊右側的保存按鈕將某一刻的圖形進行保存)
在這裏插入圖片描述
基於關鍵人物的句子篩選,繪圖分析後,可以更直觀看到對於祥林嫂的情感傾向指數,其平均值爲0.32,偏負向!

5. 構建函數,提取任意關鍵詞做情感指數分析

爲了方便日後的工作調用採用的是函數封裝,這裏的封裝就直接粗暴,保證函數直接調用就可以出圖,並輸出包含關鍵詞的個數和成功提取關鍵詞的個數,以及運行的時間(測試發現0.3秒系統提取的成功率已經很高了,如果追求完美的話這個請求等待時間可以繼續上調,但是會影響程序的運行時間)函數步驟拆解如下:

1) 導入相關的庫

import requests,json,time
import pandas as pd
import pyecharts as pe

2)文章的劃分

這裏考慮文章種是否有同義詞,如果有的話可以使用字符串的replace方法,比如剛剛使用了or的邏輯判斷,其實可以直接將這兩個數據合併,如下

news = news.replace('她','祥林嫂')

下面代碼完成的是對輸入文章內容中的句子進行劃分。注意是已經處理完畢後的數據,可以直接拿過來用的,代碼執行後會打印輸出包含關鍵詞句子的數量。

slst = []
for i in news.split('。'):
    if words in i:
        slst.append(i)
print('關鍵詞句子數量:',len(slst))

3) 獲取許可的access_token

注意是要輸入自己創建應用後的祕鑰並獲得許可的access_token

 host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=PRlycW9Fkfgm7moLA6uLeW&client_secret=GGF88lVjTnLHbIYjPzfla1bhtTy3kE'
 response = requests.get(host)
 if response:
     access_token = response.json()['access_token']

4) 進行數據請求並返回結果

這一部分就是項目核心:獲取情感傾向指標數據,請求等待時間可以根據自己的需求進行設置

# 按要求寫入header參數
headers = {'content-type': 'application/json'}
url_sentiment_classify = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=' +  access_token

# 計算情感傾向指標
datai = []
# for循環遍歷
for i in slst:
    try:
        responsei = requests.post(url_sentiment_classify, 
                         data = json.dumps({'text': i}),    
                         headers = headers)
        if response:
            # 創建字典存儲情感傾向分析結果
            sen_dici = {'sentence':i, 
                        'positive_prob':responsei.json()['items'][0]['positive_prob'],
                        'sentiment':responsei.json()['items'][0]['sentiment']}   
        datai.append(sen_dici)   # 將結果存入列表
        time.sleep(0.3)
    except:
        continue

5) 可視化輸出數據

這裏可以生成一個可視化數據的接口,最後函數的返回值中,第一個是繪製的圖形的對象,第二個就是成功提取情感傾向指標數據的對象

dfi = pd.DataFrame(datai)
print('成功提取包含{}的句子數量:{}'.format(words,len(dfi)))

6) 出圖

# 繪製交互圖表做可視化表達
# 設置x、y軸
x = dfi['sentence']
y1 = dfi['positive_prob']
y2 = dfi['sentiment']
# 繪製柱狀圖
bar = pe.Bar(words + '情感傾向')
bar.add('情感傾向指數', x, y1,
         is_datazoom_show = True, datazoom_range = [0,100], 
         mark_line=[ "average"],
         tooltip_axispointer_type = 'cross')
# 繪製折線圖
line = pe.Line(words + '情感傾向')
line.add('情感傾向分類', x, y2, is_step=True, area_opacity = 0.2)
# 合併圖表
overlap = pe.Overlap()
overlap.add(bar)
overlap.add(line, 
            yaxis_index=1, is_add_yaxis=True)  # 新增y軸
# 計算代碼執行時間 
end_time = time.time()
print('代碼運行時間(s):', end_time - start_time)
6. 全部代碼
def keywords_sentiment_analysis(news,words):
	#第一部分:導入相關的庫
    import requests 
	import json
	import time
	import pyecharts as pe
	import pandas as pd
	import warnings
	warnings.filterwarnings('ignore')
	
	#開始計時
    start_time = time.time()
    # 提取關鍵詞所有句子
    slst = []
    for i in news.split('。'):
        if words in i:
            slst.append(i)
    print('關鍵詞句子數量:',len(slst))
    
    #client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官網獲取的AK】&client_secret=【官網獲取的SK】'
    response = requests.get(host)
    if response:
        access_token = response.json()['access_token']

    # 按要求寫入header參數
    headers = {'content-type': 'application/json'}
    url_sentiment_classify = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=' +  access_token

    # 計算情感傾向指標
    datai = []
    # for循環遍歷
    for i in slst:
        try:
            responsei = requests.post(url_sentiment_classify, 
                             data = json.dumps({'text': i}),    
                             headers = headers)
            if response:
                # 創建字典存儲情感傾向分析結果
                sen_dici = {'sentence':i, 
                            'positive_prob':responsei.json()['items'][0]['positive_prob'],
                            'sentiment':responsei.json()['items'][0]['sentiment']}   
            datai.append(sen_dici)   # 將結果存入列表
            time.sleep(0.3)
        except:
            continue
    # 數據轉爲DataFrame
    dfi = pd.DataFrame(datai)
    print('成功提取包含{}的句子數量:{}'.format(words,len(dfi)))
    
    # 繪製交互圖表做可視化表達
    # 設置x、y軸
    x = dfi['sentence']
    y1 = dfi['positive_prob']
    y2 = dfi['sentiment']
    # 繪製柱狀圖
    bar = pe.Bar(words + '情感傾向')
    bar.add('情感傾向指數', x, y1,
             is_datazoom_show = True, datazoom_range = [0,100], 
             mark_line=[ "average"],
             tooltip_axispointer_type = 'cross')
    # 繪製折線圖
    line = pe.Line(words + '情感傾向')
    line.add('情感傾向分類', x, y2, is_step=True, area_opacity = 0.2)
    # 合併圖表
    overlap = pe.Overlap()
    overlap.add(bar)
    overlap.add(line, 
                yaxis_index=1, is_add_yaxis=True)  # 新增y軸
    # 計算代碼執行時間 
    end_time = time.time()
    print('代碼運行時間(s):', end_time - start_time)
    
    # 返回繪圖對象和可視化數據對象
    return overlap,dfi
7. 演示示例

直接調用函數,返回一個繪圖的對象和一個是可視化數據的對象

fig,df = keywords_sentiment_analysis(news,'祥林嫂')

–> 輸出的結果爲:(news輸入前,已經將’她’合併到’祥林嫂’裏面了,可以看出請求時間暫停爲0.3秒時候滿足精度的要求)

關鍵詞句子數量: 132
成功提取包含祥林嫂的句子數量:132
代碼運行時間(s)114.1103241443634

1) 繪製圖形

fig #在jupyter notebook上面直接輸入這個對象參數,運行就會輸出結果

–> 輸出的結果爲:
在這裏插入圖片描述

2) 可視化數據

df.iloc[20:30]

–> 輸出的結果爲:(比如這裏查看中間的數據)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章