手把手教你完成一個資料科學小專案(8):Emoji提取與分佈圖譜

古柳_Deserts_X發表於2018-08-29

前言

請先閱讀“中國年輕人正帶領國家走向危機”,這鍋背是不背? 一文,以對“手把手教你完成一個資料科學小專案”系列有個全域性性的瞭解。

本系列程式碼統一開源在GitHub:DesertsX/gulius-projects ,感興趣的朋友可以先行 star 哈。

截至目前我們已經完成了資料爬取資料提取與IP查詢資料異常與清洗評論數變化情況分析省份提取與視覺化城市提取與視覺化經緯度獲取與BDP視覺化。本文將對評論裡的
emoji 進行提取,並繪製分佈圖譜。

讀取資料

本次主要關注評論content列,所以僅讀取下面幾列資料,忽略其他列。

import pandas as pd
df = pd.read_csv('Sina_Finance_Comments_All_20180811_Cleaned.csv',encoding='utf-8',usecols=['nick','time','content'])
df.head()
複製程式碼

提取 emoji

import re
def get_emoji(content):
    pattern =re.compile(u"\[[a-zA-Z\u4e00-\u9fa5]+\]")
    result=re.findall(pattern,content)
    return result
df['emojis_list'] = df['content'].apply(get_emoji)
df.head()
複製程式碼

將提取後的列的全部元素轉換成列表。

emojis = df['emojis_list'].values.tolist()
emojis
複製程式碼

文章所限,僅顯示部分輸出:

[['[費解]', '[費解]', '[費解]'],
 ['[允悲]', '[允悲]'],
 ['[嘿哈]'],
 ['[笑而不語]'],
 ['[doge]'],
 ['[doge]'],
 ['[淚]'],
 ['[doge]'],
 ['[吃瓜]'],
 ['[允悲]'],
 ['[二哈]'],
 ['[笑而不語]', '[笑而不語]'],
 ['[小黃人得意]'],
 ['[喵喵]', '[喵喵]'],
 ['[二哈]'],
 ['[doge]', '[doge]', '[doge]']]
複製程式碼

合併巢狀列表為單一列表,之前文章和程式碼裡已經用過很多次嘍。

emojis_list = sum(emojis, [])
emojis_set = list(set(emojis_list))
num = len(emojis_set)
print(num)
print(emojis_set)
複製程式碼

統計出emoji共76種:

76
['[打臉]', '[白眼]', '[太開心]', '[允悲]', '[愛你]', '[ok]', '[小黃人壞笑]', '[思考]', '[喵喵]', '[偷笑]', '[悲傷]', '[抱抱]', '[睡]', '[圍觀]', '[攤手]', '[怒]', '[衰]', '[中國贊]', '[汗]', '[鮮花]', '[小黃人得意]', '[閉嘴]', '[吃驚]', '[吐]', '[陰險]', '[暈]', '[骷髏]', '[憧憬]', '[呵呵]', '[米奇比心]', '[羞嗒嗒]', '[可憐]', '[可愛]', '[挖鼻]', '[哈哈]', '[微笑]', '[擠眼]', '[耶]', '[給力]', '[笑cry]', '[威武]', '[握手]', '[吃瓜]', '[鼓掌]', '[拜拜]', '[失望]', '[壞笑]', '[淚]', '[跪了]', '[嘿哈]', '[費解]', '[哆啦A夢汗]', '[嘻嘻]', '[親親]', '[皺眉]', '[哈欠]', '[怒罵]', '[攤手]', '[米奇大哭]', '[笑而不語]', '[黑線]', '[鄙視]', '[good]', '[doge]', '[作揖]', '[費解]', '[豬頭]', '[二哈]', '[贊]', '[哼]', '[噓]', '[生病]', '[哆啦A夢微笑]', '[疑問]', '[汙]', '[並不簡單]']
複製程式碼

emoji 分組統計

from collections import Counter
counter = Counter(emojis_list)
print(counter.most_common())
複製程式碼

統計結果,看看大家都喜歡發什麼表情:

[('[doge]', 198), ('[二哈]', 148), ('[允悲]', 131), ('[費解]', 100), ('[攤手]', 93), ('[微笑]', 83), ('[笑cry]', 70), ('[吃瓜]', 66), ('[嘻嘻]', 44), ('[吐]', 35), ('[笑而不語]', 34), ('[並不簡單]', 33), ('[跪了]', 32), ('[挖鼻]', 25), ('[拜拜]', 24), ('[喵喵]', 20), ('[太開心]', 20), ('[哈哈]', 16), ('[作揖]', 15), ('[淚]', 14), ('[good]', 13), ('[偷笑]', 10), ('[汗]', 10), ('[哆啦A夢汗]', 9), ('[失望]', 9), ('[疑問]', 9), ('[思考]', 8), ('[愛你]', 6), ('[贊]', 6), ('[憧憬]', 6), ('[汙]', 6), ('[陰險]', 6), ('[白眼]', 5), ('[黑線]', 5), ('[中國贊]', 5), ('[可愛]', 5), ('[威武]', 5), ('[怒]', 4), ('[鄙視]', 4), ('[米奇大哭]', 4), ('[ok]', 4), ('[皺眉]', 4), ('[費解]', 4), ('[吃驚]', 4), ('[怒罵]', 4), ('[哼]', 4), ('[鮮花]', 4), ('[壞笑]', 3), ('[悲傷]', 3), ('[鼓掌]', 3), ('[攤手]', 3), ('[噓]', 3), ('[暈]', 3), ('[衰]', 2), ('[呵呵]', 2), ('[抱抱]', 2), ('[小黃人壞笑]', 2), ('[可憐]', 2), ('[哈欠]', 2), ('[打臉]', 2), ('[嘿哈]', 1), ('[小黃人得意]', 1), ('[握手]', 1), ('[擠眼]', 1), ('[耶]', 1), ('[親親]', 1), ('[米奇比心]', 1), ('[羞嗒嗒]', 1), ('[圍觀]', 1), ('[豬頭]', 1), ('[閉嘴]', 1), ('[生病]', 1), ('[給力]', 1), ('[哆啦A夢微笑]', 1), ('[骷髏]', 1), ('[睡]', 1)]
複製程式碼

emoji 使用情況

y_emojis, x_counts = zip(*counter.most_common())
from pyecharts import Bar
bar = Bar("emoji 使用情況")
bar.add("emoji", y_emojis[:20], x_counts[:20], is_stack=True,is_label_show=True,xaxis_interval=0,xaxis_rotate=-45,xaxis_margin=8)
bar
複製程式碼

為方便展示,選出top20:


這回的 emoji 沒找到對應表情圖,所以無法像當你點開這首《八月》的歌:9400餘條評論的分析與挖掘裡顯示,不過從上一個專案瞭解如何實現也是一樣的:

評論資料

拿出評論資料,方便之後繪製emoji分佈圖譜。

cmnts_list = df['content'].values.tolist()
cmnts_list
複製程式碼

顯示部分資料:

['[費解][費解][費解]',
 '那你以為不單身就能避免?',
 '謝謝',
 '想去聲援你 結果發不出?',
 '鍋太大,接不住',
 '[允悲][允悲]…',
 '居然這麼說我們年輕人[嘿哈]',
 '老了',
 '我覺得這條博就是一個笑話……',
 '到底該不該透支消費?專家統一一下意見,線上等,急。',
 '拜託,我買再多手機穿再多名牌喝再多星巴克都沒一個房貸債務高吧。推責任推這麼心安理得惡不噁心啊。',
 '你們反省一下,不要做歷史的罪人[笑而不語]',
複製程式碼

將列表合併成一個字串

cmnts = ' '.join(cmnts_list)
print(len(cmnts))
print(cmnts)
複製程式碼

字串長度為83252。

jieba 分詞

GitHub/jieba分詞前,先把上面的emojis_set裡的去掉中括號後的emoji一個個都新增進自定義的詞典,以免分詞時被切分開。

此處需注意,如果不去掉中括號[ ],直接將整個emojis新增進詞典的話,後續分詞時,括號還是會被分開,可能相應的需要修改jieba原始碼才行(jieba分詞與詞性標註自定義詞典支援特殊字元),但嘗試後無果,於是還是採取現在的方案。

jieba/test/test_userdict.py
jieba.del_word('自定義詞')或者在txt的存好,然後讀入jieba.load_userdict("userdict.txt")

import jieba
emoji_drop = []
for emojis in y_emojis:
    emoji = emojis[1:-1] # 去掉括號
    jieba.add_word(emoji) # 讀者可將上一行註釋掉,看看分詞結果
    emoji_drop.append(emoji) # 將去掉括號後的emoji單獨儲存
words = list(jieba.cut(cmnts))
print(len(words))
print(words)
複製程式碼

展示部分分詞結果:

54431
['[', '費解', ']', '[', '費解', ']', '[', '費解', ']', ' ', '那', '你', '以為', '不', '單身', '就', '能', '避免', '?', ' ', '謝謝', ' ', '想', '去', '聲援', '你', ' ', '結果', '發不出', '?', ' ', '鍋太大', ',', '接', '不住', ' ', '[', '允悲', ']', '[', '允悲', ']', '…', ' ', '居然', '這麼', '說', '我們', '年輕人', '[', '嘿哈', ']', ' ', '老', '了',
複製程式碼

去掉括號後的emoji_drop

['doge', '二哈', '允悲', '費解', '攤手', '微笑', '笑cry', '吃瓜', '嘻嘻', '吐', '笑而不語', '並不簡單', '跪了', '挖鼻', '拜拜', '喵喵', '太開心', '哈哈', '作揖', '淚', 'good', '偷笑', '汗', '哆啦A夢汗', '失望', '疑問', '思考', '愛你', '贊', '憧憬', '汙', '陰險', '白眼', '黑線', '中國贊', '可愛', '威武', '怒', '鄙視', '米奇大哭', 'ok', '皺眉', '費解', '吃驚', '怒罵', '哼', '鮮花', '壞笑', '悲傷', '鼓掌', '攤手', '噓', '暈', '衰', '呵呵', '抱抱', '小黃人壞笑', '可憐', '哈欠', '打臉', '嘿哈', '小黃人得意', '握手', '擠眼', '耶', '親親', '米奇比心', '羞嗒嗒', '圍觀', '豬頭', '閉嘴', '生病', '給力', '哆啦A夢微笑', '骷髏', '睡']
複製程式碼

NLTK 分佈圖譜

分佈圖譜在《當你點開這首《八月》的歌:9400餘條評論的分析與挖掘》專案時,就想實現,可惜一直沒成功,notebook裡保留了嘗試的程式碼,且整個程式碼太雜亂,需如本系列一樣後續拆分開和潤色。

也是因緣際會,想本系列專案結束後,下一個系列就來玩玩熱門電視劇、熱門電影,也羅列了許多切入點,感覺要是能搞出來,還是不錯的。這回也先繪製了於正的熱門清宮劇《延禧攻略》裡的一些主要人物在小說文字中的分佈圖譜。

手把手教你完成一個資料科學小專案(8):Emoji提取與分佈圖譜

扯遠了,因為上述嘗試成功後,這回也用到emoji的分佈上來。雖然評論資料是拼接到一起,因而分佈圖譜的可解釋性一般,權當嚐個鮮、玩玩新花樣。

import matplotlib.pyplot as plt
%matplotlib inline
import nltk
from nltk.draw.dispersion import dispersion_plot

plt.rcParams['font.sans-serif'] = ['SimHei']
ntext = nltk.Text(words)
ntext.dispersion_plot(emoji_drop[:15])
複製程式碼

上面是top15的分佈圖譜,結合pyecharts的柱形圖一起看,風味尤佳:

而全部emoji的分佈圖譜,縱座標太密集,但整張圖有種說不出的美感,逃……

ntext.dispersion_plot(emoji_drop)
複製程式碼

你聽說過安利嗎?

本系列程式碼統一開源在GitHub:DesertsX/gulius-projects ,感興趣的朋友可以先行 star 哈。

本系列文章:
“中國年輕人正帶領國家走向危機”,這鍋背是不背?
手把手教你完成一個資料科學小專案(1):資料爬取
手把手教你完成一個資料科學小專案(2):資料提取、IP 查詢
手把手教你完成一個資料科學小專案(3):資料異常與清洗
手把手教你完成一個資料科學小專案(4):評論數變化情況
手把手教你完成一個資料科學小專案(5):省份提取與視覺化
手把手教你完成一個資料科學小專案(6):城市提取與視覺化
手把手教你完成一個資料科學小專案(7):經緯度獲取與BDP視覺化


相關文章