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]
–> 輸出的結果爲:(比如這裏查看中間的數據)