基於簡單統計的b站彈幕情感分析

第一步,先把彈幕下載下來

def danmu(urls):
    global wordlist
    global av
    for i in urls:
        url2='http://comment.bilibili.com/'
        html=requests.get(i,headers=head)
        html.encoding='utf-8'

        m=re.findall('"cid":([0-9]+),"dimension":',html.text)

        if len(m)>0:
            av.append(i)
            html1=requests.get(url2+m[0]+'.xml')
            html1.encoding='utf-8'
            return html1.text

返回的數據是xml格式的,用ET.fromstring(xml) 解析

root = ET.fromstring(xml)

根據預先定義好的情緒對照表構建詞典

xls= xlrd.open_workbook('彈幕多維情感詞典.xlsx')
table = xls.sheets()[0]
nrows = table.nrows  #獲取該sheet中的有效行數
table.cell(1,0)
m={}
for i in range(nrows):
    if i==0:
        continue
    else:
       
        m[ str(table.cell(i,1)).replace('text:','').replace('\'','')]= str(table.cell(i,0)).replace('text:','').replace('\'','')

識別每一條彈幕的情緒分類

def d(s):
    global m
    p=[]
    for i in m.keys():
        if i in s:
            p.append(m[i])
        else:
            p.append('無')#無態度
    return p

提取數據到data,以字典的形式存儲

for i in root.findall('d'):
    if i.attrib['p'].split(',')[0] in data:
        data[float(i.attrib['p'].split(',')[0])]+=d(i.text)
    else:
        data[float(i.attrib['p'].split(',')[0])]=d(i.text)

統計各個情緒的數量

for i in range(0,round((max(data.keys()))),30):
    x_.append(i/30)
    y1,y2,y3,y4,y5,y6,y7,y8=0,0,0,0,0,0,0,0#樂好怒哀懼惡驚 無
    for j in data.keys():
        if float(i)<float(j) and float(j)<float(i+30):
            for k in data[j]:
                y1+=k.count('樂')
                y2+=k.count('好')
                y3+=k.count('怒')
                y4+=k.count('哀')
                y5+=k.count('懼')
                y6+=k.count('惡')
                y7+=k.count('驚')
                y8+=k.count('無')
    
    y_1.append(y1)
    y_2.append(y2)
    y_3.append(y3)
    y_4.append(y4)
    y_5.append(y5)
    y_6.append(y6)
    y_7.append(y7)
    y_8.append(y8)

既然已經分析好了,開始畫圖:

a-七種情感維度的頻數分佈圖

#a-七種情感維度的頻數分佈圖
plt.ylabel("", fontproperties="SimSun") # 步驟一  (宋體)
plt.title("七種情感維度的頻數分佈圖", fontproperties="SimHei") #     (黑體)
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
#樂好怒哀懼惡驚
y_l=['樂','好','怒','哀','懼','惡','驚']
yu=[sum(y_1),sum(y_2),sum(y_3),sum(y_4),sum(y_5),sum(y_6),sum(y_7)]
plt.bar(y_l,yu, facecolor = 'blue', edgecolor = 'white')
for a, b in zip(y_l, yu):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=11)
plt.savefig('a-七種情感維度的頻數分佈圖.png')

七種情感維度的頻數分佈圖
b-七種情感的時間變化圖

#b-七種情感的時間變化圖
#y_l=['樂','好','怒','哀','懼','惡','驚']
fig = plt.figure(figsize=(10,6), facecolor = 'gray')
plt.figure(figsize=(12,12))
plt.subplot(331)
plt.plot(x_,y_1)
plt.title('樂')
plt.subplot(332)
plt.plot(x_,y_2)
plt.title('好')
plt.subplot(333)
plt.plot(x_,y_3)
plt.title('怒')
plt.subplot(334)
plt.plot(x_,y_4)
plt.title('哀')
plt.subplot(335)
plt.plot(x_,y_5)
plt.title('懼')
plt.subplot(336)
plt.plot(x_,y_6)
plt.title('惡')
plt.subplot(337)
plt.plot(x_,y_7)
plt.title('驚')
plt.savefig('b-七種情感的時間變化圖.png')

七種情感的時間變化圖.
c-二元情感趨勢圖

#c-二元情感趨勢圖
yy_1=[]
for i in range(len(x_)):
    #y_l=['樂','好','怒','哀','懼','惡','驚']
    yy_1.append(y_1[i]+y_2[i]-y_3[i]-y_4[i]-y_5[i]-y_6[i]-y_7[i])
plt.plot(x_,yy_1)
plt.title('二元情感趨勢圖')
plt.savefig('c-二元情感趨勢圖.png')

二元情感趨勢圖

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