上一篇文章亂燉數(shù)據(jù)之2700余篇“簡書交友”專題文章數(shù)據(jù)的花式玩法發(fā)布后,不少人想學(xué)習(xí)下代碼寄雀,由于此前不曾在GitHub上開源過巷燥,流程還不熟悉,再者本項目中很多嘗試性的代碼,異常雜亂权悟,因而沒有立馬公開砸王。在經(jīng)過刪減和整理后,將繼續(xù)更新出來峦阁。
本文主要涉及一些結(jié)構(gòu)化數(shù)據(jù)的分析谦铃,文本數(shù)據(jù)如詞頻統(tǒng)計、詞云圖等等榔昔。暫且跳過爬蟲部分驹闰。 代碼見于 GitHub - DesertsX / JianShuJiaoYou,后續(xù)LDA主題模型撒会、word2vec詞向量嘹朗、文章照片爬取、人臉識別及顏值打分和照片墻等等更新后也會開源在此項目诵肛,歡迎star與指正屹培。
另外先預(yù)告下,之后打算開個“Kaggle Kernel 學(xué)習(xí)系列”怔檩,GitHub - DesertsX / Kaggle-Kernel-Learning褪秀,主要是翻譯和學(xué)習(xí)下kaggle上優(yōu)秀的kernels。其中第一篇非常粗糙薛训,還沒潤色媒吗、修改排版布局的notebook可供瀏覽下,也歡迎關(guān)注乙埃、star和提供寶貴建議:
https://desertsx.github.io/2018/06/09/1_1_Start_Here-A_Gentle_Introduction/
https://desertsx.github.io/2018/06/09/kaggle-Kernel-01/
結(jié)構(gòu)化數(shù)據(jù)
文章配圖數(shù)
讀取數(shù)據(jù)
import pandas as pd
df12 = pd.read_csv('JianShuJiaoYou-All-Data.csv', encoding='utf-8')
df12.head(2)
結(jié)果如下:
Page Num Author Author_Url Title Time Read Comment Like Abstract Artical_Url Image_Url Artical_Content
0 1 0 劉秀玲 http://www.reibang.com/u/470f33ea0c92 我要嫁這樣的你 2016-07-25T12:16:39+08:00 109763 4508 5333 你不用太高蝴猪,比穿三五厘米跟鞋的我看起來不矮就行。我不是小鳥依人的型膊爪,累了或者想哭的時候自阱,我愿... http://www.reibang.com/p/8de3d395734f ['//upload-images.jianshu.io/upload_images/125... 你不用太高,比穿三五厘米跟鞋的我看起來不矮就行米酬。我不是小鳥依人的型沛豌,累了或者想哭的時候,我愿...
1 1 1 道長是名思維販子 http://www.reibang.com/u/92eb338437ee 如果你喜歡一個人赃额,說些什么話讓對方也喜歡你呢 2017-10-29T11:42:34+08:00 69260 497 3693 NaN http://www.reibang.com/p/373d67f7cbce ['//upload-images.jianshu.io/upload_images/299... 你現(xiàn)在有沒有喜歡一個人加派?
新增Images_Num
一列記錄每篇文章配圖數(shù),但發(fā)現(xiàn)數(shù)字異常跳芳,Image_Url
中的每一元素是字符串而非列表芍锦。
def images_num(imageslist):
return len(imageslist)
df12['Images_Num'] = df12.Image_Url.apply(images_num)
df12.head(1)
df12.Images_Num.hist();
將字符串轉(zhuǎn)化成 list 格式
eval()函數(shù)
:可以將 list, tuple, dict 與 string 相互轉(zhuǎn)化
實例:
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(a)
print(type(a))
b = eval(a)
print(b)
print(type(b))
輸出結(jié)果:
[[1,2], [3,4], [5,6], [7,8], [9,0]]
<class 'str'>
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
<class 'list'>
統(tǒng)計每篇文章配圖數(shù)的正確方式
def images_num(imageslist):
return len(eval(imageslist))
df12['Images_Num'] = df12.Image_Url.apply(images_num)
df12.head(1)
分布情況
df12.Images_Num.value_counts()
直方圖
分布情況一目了然,文章配圖數(shù)最多的高達(dá)80+飞盆。
df12.Images_Num.hist();
文章長度 / 字?jǐn)?shù)
粗略統(tǒng)計下每篇文章的長度
def artical_length(artical_content):
return len(artical_content)
df12['Artical_Length'] = df12.Artical_Content.apply(artical_length)
df12.head(1)
df12.Artical_Length.hist();
字?jǐn)?shù)與配圖數(shù)
看看文章篇幅和配圖數(shù)之間是否存在某種關(guān)系娄琉。
seaborn.jointplot
import seaborn as sns
sns.jointplot(x="Artical_Length" , y = "Images_Num" ,data = df12);
改個參數(shù)看看
sns.jointplot(x="Artical_Length" , y = "Images_Num" ,data = df12, kind="hex");
評論數(shù)與點贊數(shù)
由皮爾遜相關(guān)系數(shù)為0.58可知次乓,評論數(shù)與點贊數(shù)有一定的線性相關(guān)性。
sns_joinplot = sns.jointplot(x="Like" , y = "Comment" ,data = df12);
sns_joinplot.savefig('seaborn_Like_Comment_joinplot.png')
閱讀量孽水、評論數(shù)與點贊數(shù)
python3d畫圖mpl_toolkits.mplot3d
Matplotlib 繪圖教程(3D)
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(12, 7))
ax1 = plt.subplot(111,projection='3d')
x,y,z = df12['Read'],df12['Comment'],df12['Like']
ax1.scatter(x, y, z, s=15)
ax1.set_title('Read-Commnet-Like')
ax1.set_zlabel('Like')
ax1.set_ylabel('Comment')
ax1.set_xlabel('Read')
#plt.show()
多變量
看看閱讀量票腰、評論數(shù)、點贊數(shù)女气、文章篇幅與配圖數(shù)五個變量之間的相關(guān)關(guān)系杏慰。
Pairplot圖
import matplotlib.pyplot as plt
data = df12[["Read", "Comment", "Like", "Artical_Length","Images_Num"]]
#plt.figure(figsize=(6,4))
g = sns.pairplot(data, palette="husl");
g.savefig('seaborn_pairplot.png')
Heatmap圖
sns.heatmap(data=data.corr(), annot=True, linewidths=0, vmin=-0.2, cmap='RdBu_r');
sns.heatmap( data=data.corr(), annot=True, linewidths=0, vmin=-0.2, cmap='YlGnBu');
文章發(fā)布時間
從Time
列分別提取年份、月份炼鞠、天缘滥、小時等等數(shù)據(jù)。
def split_time_ymd(timestamp):
ymd = timestamp.split('T')[0]
return ymd
def split_time_year(timestamp):
ymd = timestamp.split('T')[0]
year = ymd.split('-')[0]
return year
def split_time_month(timestamp):
ymd = timestamp.split('T')[0]
month = ymd.split('-')[1]
return month
def split_time_day(timestamp):
ymd = timestamp.split('T')[0]
day = ymd.split('-')[-1]
return day
def split_time_hour(timestamp):
timestamp = timestamp.split('T')[1]
hour = timestamp[:2]
return hour
df12['YMD'] = df12.Time.apply(split_time_ymd)
df12['Year'] = df12.Time.apply(split_time_year)
df12['Month'] = df12.Time.apply(split_time_month)
df12['Day'] = df12.Time.apply(split_time_day)
df12['Hour'] = df12.Time.apply(split_time_hour)
df12.head(2)
發(fā)文年份
可以和另一專題“今日看點”及一篇舊文里的數(shù)據(jù)比較:簡書=雞湯谒主?爬取簡書今日看點:1916篇熱門文章可視化
df12.Year.value_counts()
2018 1992
2017 718
2016 6
2015 2
Name: Year, dtype: int64
import matplotlib.pyplot as plt
%matplotlib inline
df12.Year.hist();
發(fā)文月份
df12.Month.value_counts()
04 644
03 471
05 444
02 251
11 237
08 205
01 188
12 93
10 93
09 82
07 8
06 2
Name: Month, dtype: int64
df12.Month.hist();
發(fā)文日期
df12.Day.hist();
發(fā)文小時
df12.Hour.hist();
ECharts美顏一下:發(fā)文小時
上述繪制的發(fā)布時間的相關(guān)圖表都不夠美觀朝扼,于是翻出壓箱底的又一篇舊文:圖表太丑怎么破,ECharts神器帶你飛瘩将!
直接套用ECharts
圖表模板吟税,改下數(shù)據(jù)和標(biāo)題等參數(shù)就行了,代碼參見:簡書交友”專題文章之24小時分布情姿现。
更多圖表見于:ECharts3官網(wǎng)的個人主頁
年度月份分布情況
df12.groupby(['Year','Month']).Month.count()
Year Month
2015 04 1
09 1
2016 07 2
08 1
10 1
12 2
2017 01 1
02 3
04 1
06 2
07 6
08 204
09 81
10 92
11 237
12 91
2018 01 187
02 248
03 471
04 642
05 444
Name: Month, dtype: int64
ECharts美顏一下:年度月份
圖表太丑怎么破肠仪,ECharts神器帶你飛!
ECharts3官網(wǎng)的個人主頁
將echarts_bar_year_month.js
里代碼復(fù)制到該鏈接后刷新即可:“簡書交友”專題文章之年度月份分布情況
文本挖掘
相關(guān)舊文一篇:2017备典,那些出現(xiàn)在日記中的人:簡單的文本挖掘
讀取數(shù)據(jù)
import warnings
warnings.filterwarnings("ignore")
import jieba
import numpy as np
import codecs
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (10.0, 5.0)
from wordcloud import WordCloud
# https://github.com/amueller/word_cloud/
# conda install -c conda-forge wordcloud
文章內(nèi)容轉(zhuǎn)化成 list 格式
這段情話還不錯的樣子异旧,一定是個可愛漂亮的小姐姐寫的吧,逃...
content = df12.Artical_Content.values.tolist()
print(len(content), '\n', content[-1])
2718
我攢了一被子的情話提佣,想要說給你聽最近有種很雜碎的感覺吮蛹,嗯...如果用比喻修辭來說的話,就是已經(jīng)很久都沒有那種寫完滿滿一張紙的感覺拌屏,沒有看完整整一本書的感覺潮针,沒有跑完操場一圈,沒有聽完一整首歌倚喂,也沒有睡滿整整一夜每篷。總感覺還是缺一點什么端圈。但我有很走心的去想了焦读,可能是因為缺了每一個可愛的你〔杖ǎ“如果是去見你矗晃,我會跑著去”剛看到這句話的時候,我也很贊同宴倍,因為畢竟去見一個想見了很久的人的時候张症,怎么也按捺不住你你內(nèi)心的欣喜仓技。到后來,當(dāng)你真正去見ta的時候吠冤,你沒有跑浑彰,你依然故作鎮(zhèn)定的樣子恭理,只是你會比平時都邁的步子大一點拯辙,你擔(dān)心你跑起來的樣子不那么美觀,你擔(dān)心就算是夏天的微風(fēng)也還是會把你輕薄的劉海吹亂颜价。你會在意每個細(xì)節(jié)涯保,你每次都希望你在ta面前是最好的狀態(tài)。嗨周伦,如果要去見你的話夕春,我不跑著去了,我只想以我最好的狀態(tài)去見你你像是我被子里的舒服你像是我右手背上的那顆痣你像是我眼角微微泛出來的光你像是我全身每一寸肌膚在呼吸你像是我枕頭里的枕芯棉你像是我買過最好看書里的一頁你像是我踩著云就可以飛上天你像是我走過的所有路途最想停留的瞬間你是我在夜晚閉上眼最后想到的人你是我在清晨睜開眼最先念起的人你是我的一日三餐你是我的一年四季來不及了不想再浪費時間昨天专挪,今天及志,明天我還是最喜歡你總有一個人的出現(xiàn),讓我像流沙寨腔,像落雪速侈。那些別人在上面劃了又劃的痕跡,你輕輕一抹迫卢,就平了倚搬。攢了一被子的情話,以后慢慢數(shù)給你聽乾蛤。希望認(rèn)識更多可愛的人每界,一起做喜歡的事,寫最純真的字家卖,講有趣的故事眨层。我是禮雪晶,那么你呢上荡?作者:禮雪晶趴樱。“真羨慕你們這么年輕就遇到了這么才華橫溢的我榛臼∫恋瑁”一個整天與數(shù)字對抗卻藏了一被子情話的95后女生。愿你的深情不被辜負(fù)沛善,你喜歡的人也喜歡你航揉。
jieba 分詞
segs = jieba.lcut(content[-1])
print(segs)
for seg in segs:
if len(seg) > 1:
print(seg)
['我', '攢', '了', '一', '被子', '的', '情話', ',', '想要', '說', '給', '你', '聽', '最近', '有種', '很', '雜碎', '的', '感覺', '金刁,', '嗯', '...', '如果', '用', '比喻', '修辭', '來說', '的話', '帅涂,', '就是', '已經(jīng)', '很久', '都', '沒有', '那種', '寫', '完', '滿滿', '一張', '紙', '的', '感覺', '议薪,', '沒有', '看', '完', '整整', '一', '本書', '的', '感覺', ',', '沒有', '跑', '完', '操場', '一圈', '媳友,', '沒有', '聽', '完一', '整首歌', '斯议,', '也', '沒有', '睡滿', '整整', '一夜', '。', '總', '感覺', '還是', '缺', '一點', '什么', '醇锚。', '但', '我', '有', '很', '走心', '的', '去', '想', '了', '哼御,', '可能', '是因為', '缺', '了', '每', '一個', '可愛', '的', '你', '。', '“', '如果', '是', '去', '見', '你', '焊唬,', '我會', '跑', '著', '去', '”', '剛', '看到', '這句', '話', '的', '時候', '恋昼,', '我', '也', '很', '贊同', ',', '因為', '畢竟', '去', '見', '一個', '想見', '了', '很', '久', '的', '人', '的', '時候', '赶促,', '怎么', '也', '按捺不住', '你', '你', '內(nèi)心', '的', '欣喜', '液肌。', '到', '后來', ',', '當(dāng)', '你', '真正', '去', '見', 'ta', '的', '時候', '鸥滨,', '你', '沒有', '跑', '嗦哆,', '你', '依然', '故作', '鎮(zhèn)定', '的', '樣子', ',', '只是', '你', '會', '比', '平時', '都', '邁', '的', '步子', '大', '一點', '婿滓,', '你', '擔(dān)心', '你', '跑', '起來', '的', '樣子', '不', '那么', '美觀', '老速,', '你', '擔(dān)心', '就算', '是', '夏天', '的', '微風(fēng)', '也', '還是', '會', '把', '你', '輕薄', '的', '劉海', '吹亂', '。', '你', '會', '在意', '每個', '細(xì)節(jié)', '空幻,', '你', '每次', '都', '希望', '你', '在', 'ta', '面前', '是', '最好', '的', '狀態(tài)', '烁峭。', '嗨', ',', '如果', '要', '去', '見', '你', '的話', '秕铛,', '我', '不', '跑', '著', '去', '了', '约郁,', '我', '只', '想', '以', '我', '最好', '的', '狀態(tài)', '去', '見', '你', '你', '像是', '我', '被子', '里', '的', '舒服', '你', '像是', '我', '右手', '背上', '的', '那顆', '痣', '你', '像是', '我', '眼角', '微微', '泛出來', '的', '光', '你', '像是', '我', '全身', '每一寸', '肌膚', '在', '呼吸', '你', '像是', '我', '枕頭', '里', '的', '枕芯', '棉', '你', '像是', '我', '買', '過', '最好', '看書', '里', '的', '一頁', '你', '像是', '我', '踩', '著', '云', '就', '可以', '飛', '上天', '你', '像是', '我', '走過', '的', '所有', '路途', '最想', '停留', '的', '瞬間', '你', '是', '我', '在', '夜晚', '閉上眼', '最后', '想到', '的', '人', '你', '是', '我', '在', '清晨', '睜開眼', '最先', '念起', '的', '人', '你', '是', '我', '的', '一日三餐', '你', '是', '我', '的', '一年四季', '來不及', '了', '不想', '再', '浪費時間', '昨天', ',', '今天', '但两,', '明天', '我', '還是', '最', '喜歡', '你', '總有', '一個', '人', '的', '出現(xiàn)', '鬓梅,', '讓', '我', '像', '流沙', ',', '像', '落雪', '谨湘。', '那些', '別人', '在', '上面', '劃', '了', '又', '劃', '的', '痕跡', '绽快,', '你', '輕輕', '一抹', ',', '就平', '了', '紧阔。', '攢', '了', '一', '被子', '的', '情話', '坊罢,', '以后', '慢慢', '數(shù)給', '你', '聽', '。', '希望', '認(rèn)識', '更', '多', '可愛', '的', '人', '擅耽,', '一起', '做', '喜歡', '的', '事', '活孩,', '寫', '最', '純真', '的', '字', ',', '講', '有趣', '的', '故事', '乖仇。', '我', '是', '禮雪晶', '憾儒,', '那么', '你', '呢', '询兴?', '作者', ':', '禮雪晶', '。', '“', '真', '羨慕', '你們', '這么', '年輕', '就', '遇到', '了', '這么', '才華橫溢', '的', '我', '起趾。', '”', '一個', '整天', '與', '數(shù)字', '對抗', '卻', '藏', '了', '一', '被子', '情話', '的', '95', '后', '女生', '诗舰。', '愿', '你', '的', '深情', '不', '被', '辜負(fù)', ',', '你', '喜歡', '的', '人', '也', '喜歡', '你', '训裆。']
被子
情話
想要
最近
有種
雜碎
感覺
...
如果
比喻
修辭
來說
的話
就是
已經(jīng)
很久
沒有
segment = []
for line in content:
try:
segs = jieba.lcut(line)
for seg in segs:
if len(seg)>1 and seg != '\r\n':
segment.append(seg)
except:
print(line)
continue
載入停用詞
words_df = pd.DataFrame({"segment": segment})
stopwords_df = pd.read_csv('Stopwords/Chinese_Stopwords.txt',index_col=False, quoting=3,sep="\t",names=['stopwords'], encoding='utf-8') #quoting=3全不引用
stopwords_df.head()
去掉停用詞
words_df = words_df[~words_df.segment.isin(stopwords_df.stopwords)]
words_df.head()
統(tǒng)計詞頻
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"計數(shù)": np.size})
words_stat = words_stat.reset_index().sort_values(by=["計數(shù)"], ascending=False)
words_stat.head(30)
words_stat.to_csv("JianShuJiaoYou-Words_Segments.csv", encoding='utf-8')
文章內(nèi)容詞云
丑版
wordcloud = WordCloud(font_path='simhei.ttf', background_color='white',max_font_size=80)
word_frequence = {x[0]:x[1] for x in words_stat.head(1000).values}
wordcloud = wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud);
# plt.imsave(path)
自定義背景圖 1.0版
簡書交友專題 Logo
from scipy.misc import imread
matplotlib.rcParams['figure.figsize'] = (8.0, 8.0)
from wordcloud import WordCloud,ImageColorGenerator
bimg=imread('Logo-1.jpg')
wordcloud=WordCloud(background_color="white",mask=bimg,font_path='simhei.ttf',max_font_size=200)
word_frequence = {x[0]:x[1] for x in words_stat.head(1000).values}
wordcloud=wordcloud.fit_words(word_frequence)
bimgColors=ImageColorGenerator(bimg)
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=bimgColors));
自定義背景圖 2.0版
中古民謠樂團Bloody Woods
from scipy.misc import imread
matplotlib.rcParams['figure.figsize'] = (8.0, 8.0)
from wordcloud import WordCloud,ImageColorGenerator
bimg=imread('中古民謠樂團Bloody Woods.jpg')
wordcloud=WordCloud(background_color="white",mask=bimg,font_path='simhei.ttf',max_font_size=200)
word_frequence = {x[0]:x[1] for x in words_stat.head(1000).values}
wordcloud=wordcloud.fit_words(word_frequence)
bimgColors=ImageColorGenerator(bimg)
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=bimgColors));
還是太丑
在線詞云生成網(wǎng)站:HTML5 Word Cloud
標(biāo)題詞頻、詞云
title = df12.Title.values.tolist()
print(len(title), '\n', title[-1])
segment = []
for line in title:
try:
segs = jieba.lcut(line)
for seg in segs:
if len(seg)>1 and seg != '\r\n':
segment.append(seg)
except:
print(line)
continue
2718
攢了一被子的情話缭保,想說給你聽
titles_df = pd.DataFrame({"segment": segment})
titles_df = titles_df[~titles_df.segment.isin(stopwords_df.stopwords)]
titles_df.head()
titles_stat = titles_df.groupby(by=['segment'])['segment'].agg({"計數(shù)": np.size})
titles_stat = titles_stat.reset_index().sort_values(by=["計數(shù)"], ascending=False)
titles_stat.head(30)
wordcloud = WordCloud(font_path='simhei.ttf', background_color='white',max_font_size=80)
word_frequence = {x[0]:x[1] for x in titles_stat.head(1000).values}
wordcloud = wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud);
自定義背景圖:Bloody Woods
from scipy.misc import imread
matplotlib.rcParams['figure.figsize'] = (8.0, 8.0)
from wordcloud import WordCloud,ImageColorGenerator
bimg=imread('中古民謠樂團Bloody Woods.jpg')
wordcloud=WordCloud(background_color="white",mask=bimg,font_path='simhei.ttf',max_font_size=200)
word_frequence = {x[0]:x[1] for x in titles_stat.head(1000).values}
wordcloud=wordcloud.fit_words(word_frequence)
bimgColors=ImageColorGenerator(bimg)
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=bimgColors));
在線詞云生成網(wǎng)站:HTML5 Word Cloud
簡書“今日看點”專題熱門文章標(biāo)題詞云
另一專題“今日看點”:簡書=雞湯汛闸?爬取簡書今日看點:1916篇熱門文章可視化
代碼:GitHub - DesertsX / JianShuJiaoYou蝙茶,后續(xù)更新LDA主題模型艺骂、word2vec詞向量、文章照片爬取隆夯、人臉識別及顏值打分和照片墻等钳恕,敬請期待,歡迎star與指正蹄衷。
PS:預(yù)告下忧额,即將開啟“Kaggle Kernel 學(xué)習(xí)系列”,GitHub - DesertsX / Kaggle-Kernel-Learning愧口,歡迎star睦番。