【python輿情分析(4)】情感傾向分析之如何查看文章情感傾向變化趨勢?

1. 基本概念

情感傾向分析接口(通用版):對只包含單一主體主觀信息的文本,進行自動情感傾向性判斷(積極、消極、中性),並給出相應的置信度。爲口碑分析、話題監控、輿情分析等應用提供基礎技術支持,同時支持用戶自行定製模型效果調優

還是直接調用百度AI開放平臺的接口,需要三個步驟:

     ① 創建應用(已完成!)
     ② 獲取AccessToken(已完成!)
     ③ 調用接口做情感傾向分析(未完成!)

2. 情感傾向分析

1) 生成情感傾向分析接口的url

url_sentiment_classify = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=' +  access_token
print(url_sentiment_classify)

–> 輸出的結果爲:(還是之前的access_token

https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-857407

2) 進行情感傾向分析

步驟爲:按照要求設置請求頭 –> 創建變量,寫入需要分詞的文本 –> 用requests工具包發送請求 –> 返回處理結果

#按照要求設置請求頭
headers = {'content-type': 'application/json'}

# 創建變量,寫入需要分詞的文本
st = '百度是一家高科技公司'

# 用requests工具包發送請求
response = requests.post(url_sentiment_classify, 
                         data = json.dumps({'text': st}),    # st變量寫在這裏
                         headers = headers)
if response:
    result = response.json()
print(result)

–> 輸出的結果爲:(將所有的信息都返回在一個字典裏面)

{'log_id': 244924604822151288,
 'text': '百度是一家高科技公司',
 'items': [{'positive_prob': 0.994472,
   'confidence': 0.987716,
   'negative_prob': 0.00552789,
   'sentiment': 2}]}

3) 提取情感傾向分析結果

print(result['items'],'\n-------')    # 提取items
print(result['items'][0],'\n-------')     # 提取items中列表的第1個元素
print(result['items'][0]['negative_prob'],'\n-------')     # 提取'negative_prob'信息

–> 輸出的結果爲:

[{'positive_prob': 0.994472, 'confidence': 0.987716, 'negative_prob': 0.00552789, 'sentiment': 2}] 
-------
{'positive_prob': 0.994472, 'confidence': 0.987716, 'negative_prob': 0.00552789, 'sentiment': 2} 
-------
0.00552789 
-------

返回的參數官方的解析:(sentiment → 感情極性分類
positive_prob or negative_prob → 對於積極類別概率和消極類別概率,我們選擇1個作爲分析參數即可,可以看到之前的分析結果中{‘positive_prob’: 0.994472, ‘negative_prob’: 0.00552789},兩者之和爲1,所以如果選擇negative_prob作爲情感的量化指標,該指標>0.5代表本句話是負向,反之爲正向)
在這裏插入圖片描述

3. 分析邏輯梳理及數據準備

對於實際新聞的文本內容,如果要查看其情感傾向變化分析,核心是如何做文字拆分。舉個例子:如果我們可以把文章做斷句,並對每句話都做情感傾向分析,就可以找到該文章的情感傾向變化趨勢了。

這個過程中我們從positive_prob / negative_prob兩者中選取一個量化指標即可,比如選擇negative_prob,分析邏輯如下:

     ① 對文章進行斷句處理,做好數據準備
     ② 針對每句話做情感傾向分析,並記錄好negative_prob值
     ③ 結果整理,處理成表格型數據pandas.DataFrame
     ④ 繪製圖表查看情感傾向變化趨勢

4. 實戰操作

1)首先是要進行文章斷句處理

news = '''
孫楊的事情,還沒有結束。最近,他的媽媽楊明,也被捲進了輿論風波中。在國際體育仲裁法庭宣佈孫楊禁賽八年後,愛子心切的孫媽媽,在朋友圈發了一條長文。文章開頭,就在哭訴兒子的不容易。之後,她就開始指責領導的不負責,指派律師的不專業。首先,她表明孫楊在08年因爲身體不適服用了含有鹽酸曲美他嗪的“萬爽力。”當時,這藥物還未變成“賽內禁用,賽外可用”的違禁藥。直到過了6年,中國反興奮劑網站才下發通知,表明“萬爽力”是違禁藥,強調運動員對此是毫不知情。當年不知情的孫楊,還是正常使用了“萬爽力”,沒想到體檢是陽性,爲此還被口頭警告,要求罰款5000元。對於自己被“冤枉”,孫楊當然是不樂意的。但是在領導說出“不會影響成績”後,孫楊媽媽選擇先把這件事情放下,讓兒子繼續比賽。孫楊,也這麼做了。聽話的後果,就讓這件事成爲了“孫楊職業生涯最大的恥辱柱。”再之後參加國際聽證會和仲裁會,孫楊媽媽也認爲領導指派的律師專業性十分不強,影響了最終結果的判斷,導致了自己兒子被禁賽8年的事情發生。整篇文章看下來,可以看出孫楊媽媽的不甘和怒氣。也能看出,她意在把事情的全部責任,都推卸到別人身上。但是,真相似乎並不像孫楊媽媽所指的一樣,孫楊被禁賽長達8年,只有別人的責任,自己毫無問題。前不久,有人在網上放出了孫楊媽媽在聽證會的一段視頻曝光。在聽證會上,孫楊媽媽一直不願正面回答對方提出的問題。並且不顧規則,總是中途打斷對方,浪費了許多時間。法官問了三遍“孫楊是否撕毀了他之前簽字的檢驗單?”孫楊媽媽是承認了,但卻一直解釋,自己兒子的暴力抗檢,是“有理有據。”明明是回答是或者不是的問題,孫楊媽媽卻一直自說自話,胡亂辯解。直到她的證詞時間已經結束了,她還要強調“我還沒說完。”不聽安排,無視規則。而且據爆料,孫楊媽媽在去年6月,還曾私下聯繫過血檢官和尿檢官。這些,都是WADA明令禁止的。這一系列操作看下來,孫楊媽媽對於整件事而言,沒有任何正面幫助,還幫了倒忙。在孫楊的成長道路,運動員生涯中,最離不開和最常見到的身影,就是他的媽媽楊明。作爲曾經的浙江女排主力,專業的運動員,楊明深知運動員鍛鍊時間的重要性。在孫楊小時候,楊明是風雨無阻開車送兒子去訓練,完全沒有自我時間。爲了讓孩子把一切時間運用在游泳上,楊明更是把孫楊當成了“巨嬰”去養。小學六年級,孫楊還不會繫鞋帶,上學訓練也是從不背書包。在楊明的眼裏,這些都是小事,什麼事情,都沒有游泳訓練重要。對於自己無私奉獻,楊明也是十分的驕傲。她認爲是自己的犧牲成全,纔有了現今的孫楊。不能否認,孫楊是一個游泳健將,他在國際賽事上的成績,就是最好的證明。但私下裏的孫楊,遠沒有他在國際體壇上表現的那麼完美。生活中孫楊的不完美,也同樣離不開母親楊明的“幫助”。2010年,孫楊跟隨朱志根前往澳大利亞訓練。在公開訓練場,19歲的孫楊沒有圍浴巾換泳褲,正好被外國女選手撞見。女選手走後找到了教練朱志根,希望他能能提醒孫楊不要再做這種不雅的事情。孫楊對於自己做過的事情是矢口否認,連着被問兩次,他也強硬表示“決無此事。”明明在撒謊卻如此有底氣,氣不過的朱志根直接給了孫楊一巴掌。這件事被楊明知道後,她並沒有平息雙方怒火,反而火上澆油向學院領導打了電話,痛斥教練不尊重孫楊,傷害了孩子的自尊心。之後,楊明爲了孫楊的運動生涯,更是多次與人起過沖突,絲毫不在意他人的看法。爲照顧孫楊,楊明要求住進運動員酒店與兒子同住。爲孫楊的游泳訓練,楊明在現場記錄對手的訓練記錄,還會對着旁人埋怨:“這要換成朱志根,他能做到這些?”對於集體安排的活動,楊明有異議就直接向國家體育總局開炮。孫楊成績不如意,楊明不去想兒子的問題,而是去指責教練教導的有問題。有媒體不遠萬里從巴西過來想要採訪孫楊,楊明直接問了一句:你們電視節目在巴西放,對我們有什麼好處?對國外的記者不客氣,楊明對國內的記者媒體,也十分的不禮貌。有一次孫楊進行完體能訓練走出場館後,記者和粉絲拿着鏡頭對孫楊拍照。身爲領隊和母親的楊明,看到現場狀況後瘋狂發飆,大喊:“別拍了!煩死了!討厭死了!”更有傳言稱,楊明還用水瓶砸了一個記者的相機。據知情者爆料,孫楊在天津訓練時不僅要求卡宴,奧迪接送,下水前還要母親和保鏢陪着。楊明更是大牌到只接受央視記者的採訪,其餘的記者,通通不見。事情被報道後,楊明着重強調是“無中生有。”孫楊更是爲媽媽開了個發佈會,“希望大家能夠理解媽媽。”接受其他採訪,楊明更是對主持人有很大的意見,在現場就直接黑臉。楊明仗着孫楊的名氣耍大牌,對兒子一次次的縱容和任性,終於惹怒了訓練隊。12年倫敦奧運結束才半年,孫楊就開始不聽組織安排不服從紀律。在運動員最需要集中系統訓練的時候,孫楊不僅私自談戀愛,還頻繁出席商業活動。面對教練的批評,孫楊根本不聽,還對着朱志根說“你的訓練太落後,我不跟你練了。”一次次的頂撞衝突,浙江體育職業技術學院對孫楊做出了嚴厲處罰。院長接受採訪時,也明確表明“在浙江只有優秀運動員,沒有特殊運動員。”經歷耍大牌,不聽要求,被訓練隊懲罰後,孫楊的名氣一落千丈,個人形象頃刻坍塌。這時的孫楊,仍沒有吸收教訓,觸犯了法律,因爲無證駕駛被行政拘留了7天。而且在交涉過程中,孫楊再一次撒了慌,對外說自己有駕駛證。同時還被曝出早前就曾多次在沒有駕照的情況下獨自駕車外出。個人形象再次受損。也因爲這次無證駕駛,孫楊的空姐女友浮出了水面。孫楊對於這個女友也是十分寶貝,曾對着母親楊明說要把她娶進門。但楊明並不滿意這個比孫楊大6歲的女朋友,並未同意。後有媒體拍到該空姐曾帶着一個孩子外出,有不少人懷疑這個孩子是孫楊的私生子。只不過孫楊對外,從未正面迴應過。對外風評不佳,在隊裏,孫楊也不受隊友的待見。有隊友爆料,孫楊成績提高後十分傲慢目中無人。孫楊也因爲傲慢性格被孤立後,就開始和圈外的狐朋狗友交朋友,逛夜店,泡歌廳。這些事情,放在任何一個公衆人物身上,都能讓他一蹶不振很難東山再起。但對於有着超強業務能力的孫楊來說,這些都不是問題。即使有負面新聞纏身,在他再次取得取得傲人成績後,人們就逐漸忘記了他之前的任性耍大牌。搖身一變,孫楊又成爲了大家眼中可愛的大白楊。即使後面他因穿個人簽約品牌違反規定遭爭議,孫楊也並未迴應。而這些也都未擊垮他的職業生涯,觀衆們也沒做太多關心。直到14年,孫楊因爲服用違禁藥品問題,完美的職業生涯出現了一個缺口。這一次的抗檢事件,更成爲壓死駱駝的最後一根稻草。孫楊也爲他的不配合,蠻橫囂張的態度付出了太過於沉重的代價。而這背後,離不開他母親楊明在後面的無限縱容,推波助瀾。從此次她在聽證會的表現可看出,這麼多年,她的脾氣仍沒有改變,面對官方和媒體,她依舊按着自己的那一套處理事情。她以爲靠着自己的七寸不爛之舌可以爲兒子洗清冤屈,殊不知她的一番話,把孫楊推向了摸不見底的深潭。這次孫楊能被禁賽長達8年,更是離不開她的“親力親爲。”事情再次發酵後,楊明刪除了朋友圈的控訴,孫楊的微博裏,也沒有他當晚發的幾條證據。好在孫楊這次還有上訴的機會,如若成功,他的職業生涯還能延長几年。希望這次慘痛教訓能讓孫楊媽媽知道,孫楊,早就不是象牙塔裏的孩子。你的親切關懷不是蜜糖,是砒霜。29歲的孫楊,也應該明白,人生除了比賽,還有做人。奧運冠軍的光環,不可能罩着你一輩子。
'''
news_r = news.replace('孫楊媽媽', '孫母')
news_r = news_r.replace('孫媽媽', '孫母')
news_r = news_r.replace('母親', '孫母')
news_r = news_r.replace('楊明', '孫母')
news_r = news_r.replace('媽媽', '孫母')
news_r = news_r.replace('兒子', '孫楊')
#還可以加更多的替換

sentenceslst = news_r.split('。')
print(type(sentenceslst))
print(len(sentenceslst))
sentenceslst[:5]

–> 輸出的結果爲:(這裏還是針對孫楊的那篇文章)

<class 'list'>
95
['\n孫楊的事情,還沒有結束',
 '最近,他的媽媽楊明,也被捲進了輿論風波中',
 '在國際體育仲裁法庭宣佈孫楊禁賽八年後,愛子心切的孫媽媽,在朋友圈發了一條長文',
 '文章開頭,就在哭訴兒子的不容易',
 '之後,她就開始指責領導的不負責,指派律師的不專業']

2) 逐句做情感傾向分析

① 這裏構建函數做情感傾向分析,以negative_prob爲情感傾向量化指標

def sentiment_ana(text):
    # 寫入參數text
    responsei = requests.post(url_sentiment_classify, 
                         data = json.dumps({'text': text}),    
                         headers = headers)
    if response:
        return responsei.json()['items'][0]['negative_prob']

# 情感傾向分析測試
print(sentenceslst[0])
print(sentiment_ana(sentenceslst[0]))

–> 輸出的結果爲:

孫楊的事情,還沒有結束
0.952837

② 遍歷循環,實現逐句做情感傾向分析

sc_data = []

# 導入time模塊,用於查看代碼執行時間
import time
start_time = time.time()

# for循環遍歷
for i in sentenceslst:
    try:
        sen_dic = {'sentence':i, 'negative_prob':sentiment_ana(i)}   # 創建字典存儲情感傾向分析結果
        sc_data.append(sen_dic)   # 將結果存入列表
    except:
        continue
        
# 計算代碼執行時間 
end_time = time.time()
print('代碼運行時間(s):', end_time - start_time)
sc_data[:5]

–> 輸出的結果爲:

代碼運行時間(s)17.278812885284424
[{'sentence': '\n孫楊的事情,還沒有結束', 'negative_prob': 0.952837},
 {'sentence': '最近,他的媽媽楊明,也被捲進了輿論風波中', 'negative_prob': 0.162765},
 {'sentence': '在國際體育仲裁法庭宣佈孫楊禁賽八年後,愛子心切的孫媽媽,在朋友圈發了一條長文',
  'negative_prob': 0.248906},
 {'sentence': '文章開頭,就在哭訴兒子的不容易', 'negative_prob': 0.395767},
 {'sentence': '之後,她就開始指責領導的不負責,指派律師的不專業', 'negative_prob': 0.99982}]

3) 分析結果數據整理

對於已經處理好的sc_data,由於字典列表格式並不是很方便做數據分析,這裏我們需要把它整理成表格型數據,也就是轉化爲DataFrame數據

df_sen = pd.DataFrame(sc_data)
print(df_sen.head())

–> 輸出的結果爲:(【0-1】之間,偏向1說明情感偏向負向)
在這裏插入圖片描述
4) 繪製圖表查看情感傾向變化趨勢

df_sen['negative_prob'].plot(title = '文章情感傾向變化趨勢密度圖', 
                             figsize = (15,5), 
                             kind = 'kde', 
                             grid = True)

–> 輸出的結果爲:(橫座標代表negative_prob字段的值區間,準確來說其值區間應該是[0:1],但由於密度圖是平滑曲線所以<0以及>1的值也顯示在圖表上了,但這裏無具體意義可以忽略;縱座標代表密度,可以理解爲negative_prob字段對應值的出現頻率比較,由於negative_prob在[0:0.5]區間代表正向情緒,[0.5:1]代表負向情緒,所以從圖中可以看出文章整體情感傾向是負向,峯值在[0.75:1]之間)
在這裏插入圖片描述

5. 繪製情感傾向指標趨勢曲線折線圖
from pyecharts.charts import Line
from pyecharts import options as opts

c = (
    Line()
    .add_xaxis(x)
    .add_yaxis("情感傾向指標", y, is_smooth=True,)
    .set_series_opts(
        areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="情感傾向指標趨勢曲線 折線圖"),
        datazoom_opts=[opts.DataZoomOpts()],
        xaxis_opts=opts.AxisOpts(
            axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
            is_scale=False,
            boundary_gap=False,
        ),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        )
    )
    .render("C:\\Users\\86177\\Desktop\\line.html")
)

–> 輸出的結果爲:(有不理解的可以直接參考官方文檔進行繪製圖形和添加參數)
在這裏插入圖片描述
成功繪製情感傾向指標趨勢曲線折線圖,可以更直觀的看到整篇文章按句順序的情感傾向指標及趨勢:整理呈現負向,且在前小段及後大半部分負向情緒較爲明顯。

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