結構化數據
文章配圖數
import pandas as pd
df12 = pd.read_csv('JianShuJiaoYou-All-Data.csv', encoding='utf-8')
df12.head(2)複製代碼
Page Num Author Author_Url Title Time Read Comment Like Abstract Artical_Url Image_Url Artical_Content
0 1 0 劉秀玲 https://www.jianshu.com/u/470f33ea0c92 我要嫁這樣的你 2016-07-25T12:16:39+08:00 109763 4508 5333 你不用過高,比穿三五釐米跟鞋的我看起來不矮就行。我不是小鳥依人的型,累了或者想哭的時候,我願... https://www.jianshu.com/p/8de3d395734f ['//upload-images.jianshu.io/upload_images/125... 你不用過高,比穿三五釐米跟鞋的我看起來不矮就行。我不是小鳥依人的型,累了或者想哭的時候,我願... 1 1 1 道長是名思惟販子 https://www.jianshu.com/u/92eb338437ee 若是你喜歡一我的,說些什麼話讓對方也喜歡你呢 2017-10-29T11:42:34+08:00 69260 497 3693 NaN https://www.jianshu.com/p/373d67f7cbce ['//upload-images.jianshu.io/upload_images/299... 你如今有沒有喜歡一我的?複製代碼
新增Images_Num一列記錄每篇文章配圖數,但發現數字異常,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();複製代碼
eval()函數:能夠將 list, tuple, dict 與 string 相互轉化
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(a)
print(type(a))
b = eval(a)
print(b)
print(type(b))複製代碼
[[1,2], [3,4], [5,6], [7,8], [9,0]]
<class 'str'>
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
<class 'list'>複製代碼
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()複製代碼
直方圖 分佈狀況一目瞭然,文章配圖數最多的高達80+。
df12.Images_Num.hist();複製代碼
文章長度 / 字數
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();複製代碼
字數與配圖數
import seaborn as sns
sns.jointplot(x="Artical_Length" , y = "Images_Num" ,data = df12);複製代碼
sns.jointplot(x="Artical_Length" , y = "Images_Num" ,data = df12, kind="hex");複製代碼
評論數與點贊數
由皮爾遜相關係數爲0.58可知,評論數與點贊數有必定的線性相關性。
sns_joinplot = sns.jointplot(x="Like" , y = "Comment" ,data = df12);
sns_joinplot.savefig('seaborn_Like_Comment_joinplot.png')複製代碼
閱讀量、評論數與點贊數
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')
複製代碼
多變量
看看閱讀量、評論數、點贊數、文章篇幅與配圖數五個變量之間的相關關係。
Pairplot圖
import matplotlib.pyplot as plt
data = df12[["Read", "Comment", "Like", "Artical_Length","Images_Num"]]
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');複製代碼
文章發佈時間
從Time列分別提取年份、月份、天、小時等等數據。
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)
複製代碼
發文年份
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();複製代碼
發文月份
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();複製代碼
發文日期
df12.Day.hist();複製代碼
發文小時
df12.Hour.hist();複製代碼
ECharts美顏一下:發文小時
年度月份分佈狀況
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美顏一下:年度月份
文本挖掘
讀取數據
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
複製代碼
文章內容轉化成 list 格式
這段情話還不錯的樣子,必定是個可愛美的小姐姐寫的吧,逃...
content = df12.Artical_Content.values.tolist()
print(len(content), '\n', content[-1])
2718
我攢了一被子的情話,想要說給你聽最近有種很雜碎的感受,嗯...若是用比喻修辭來講的話,就是已經好久都沒有那種寫完滿滿一張紙的感受,沒有看完整整一本書的感受,沒有跑完操場一圈,沒有聽完一整首歌,也沒有睡滿整整一晚上。總感受仍是缺一點什麼。但我有很走心的去想了,多是由於缺了每個可愛的你。「若是是去見你,我會跑着去」剛看到這句話的時候,我也很贊同,由於畢竟去見一個想見了好久的人的時候,怎麼也按捺不住你你心裏的欣喜。到後來,當你真正去見ta的時候,你沒有跑,你依然故做鎮定的樣子,只是你會比平時都邁的步子大一點,你擔憂你跑起來的樣子不那麼美觀,你擔憂就算是夏天的微風也仍是會把你輕薄的劉海吹亂。你會在乎每一個細節,你每次都但願你在ta面前是最好的狀態。嗨,若是要去見你的話,我不跑着去了,我只想以我最好的狀態去見你你像是我被子裏的舒服你像是我右手背上的那顆痣你像是我眼角微微泛出來的光你像是我全身每一寸肌膚在呼吸你像是我枕頭裏的枕芯棉你像是我買過最好看書裏的一頁你像是我踩着雲就能夠飛上天你像是我走過的全部路途最想停留的瞬間你是我在夜晚閉上眼最後想到的人你是我在清晨睜開眼最早念起的人你是個人每日三餐你是個人一年四季來不及了不想再浪費時間昨天,今天,明天我仍是最喜歡你總有一我的的出現,讓我像流沙,像落雪。那些別人在上面劃了又劃的痕跡,你輕輕一抹,就平了。攢了一被子的情話,之後慢慢數給你聽。但願認識更多可愛的人,一塊兒作喜歡的事,寫最純真的字,講有趣的故事。我是禮雪晶,那麼你呢?做者:禮雪晶。「真羨慕大家這麼年輕就遇到了這麼才華橫溢的我。」一個成天與數字對抗卻藏了一被子情話的95後女生。願你的深情不被辜負,你喜歡的人也喜歡你。
複製代碼
jieba 分詞
segs = jieba.lcut(content[-1])
print(segs)
for seg in segs:
if len(seg) > 1:
print(seg)
['我', '攢', '了', '一', '被子', '的', '情話', ',', '想要', '說', '給', '你', '聽', '最近', '有種', '很', '雜碎', '的', '感受', ',', '嗯', '...', '若是', '用', '比喻', '修辭', '來講', '的話', ',', '就是', '已經', '好久', '都', '沒有', '那種', '寫', '完', '滿滿', '一張', '紙', '的', '感受', ',', '沒有', '看', '完', '整整', '一', '本書', '的', '感受', ',', '沒有', '跑', '完', '操場', '一圈', ',', '沒有', '聽', '完一', '整首歌', ',', '也', '沒有', '睡滿', '整整', '一晚上', '。', '總', '感受', '仍是', '缺', '一點', '什麼', '。', '但', '我', '有', '很', '走心', '的', '去', '想', '了', ',', '可能', '是由於', '缺', '了', '每', '一個', '可愛', '的', '你', '。', '「', '若是', '是', '去', '見', '你', ',', '我會', '跑', '着', '去', '」', '剛', '看到', '這句', '話', '的', '時候', ',', '我', '也', '很', '贊同', ',', '由於', '畢竟', '去', '見', '一個', '想見', '了', '很', '久', '的', '人', '的', '時候', ',', '怎麼', '也', '按捺不住', '你', '你', '心裏', '的', '欣喜', '。', '到', '後來', ',', '當', '你', '真正', '去', '見', 'ta', '的', '時候', ',', '你', '沒有', '跑', ',', '你', '依然', '故做', '鎮定', '的', '樣子', ',', '只是', '你', '會', '比', '平時', '都', '邁', '的', '步子', '大', '一點', ',', '你', '擔憂', '你', '跑', '起來', '的', '樣子', '不', '那麼', '美觀', ',', '你', '擔憂', '就算', '是', '夏天', '的', '微風', '也', '仍是', '會', '把', '你', '輕薄', '的', '劉海', '吹亂', '。', '你', '會', '在乎', '每一個', '細節', ',', '你', '每次', '都', '但願', '你', '在', 'ta', '面前', '是', '最好', '的', '狀態', '。', '嗨', ',', '若是', '要', '去', '見', '你', '的話', ',', '我', '不', '跑', '着', '去', '了', ',', '我', '只', '想', '以', '我', '最好', '的', '狀態', '去', '見', '你', '你', '像是', '我', '被子', '裏', '的', '舒服', '你', '像是', '我', '右手', '背上', '的', '那顆', '痣', '你', '像是', '我', '眼角', '微微', '泛出來', '的', '光', '你', '像是', '我', '全身', '每一寸', '肌膚', '在', '呼吸', '你', '像是', '我', '枕頭', '裏', '的', '枕芯', '棉', '你', '像是', '我', '買', '過', '最好', '看書', '裏', '的', '一頁', '你', '像是', '我', '踩', '着', '雲', '就', '能夠', '飛', '上天', '你', '像是', '我', '走過', '的', '全部', '路途', '最想', '停留', '的', '瞬間', '你', '是', '我', '在', '夜晚', '閉上眼', '最後', '想到', '的', '人', '你', '是', '我', '在', '清晨', '睜開眼', '最早', '念起', '的', '人', '你', '是', '我', '的', '每日三餐', '你', '是', '我', '的', '一年四季', '來不及', '了', '不想', '再', '浪費時間', '昨天', ',', '今天', ',', '明天', '我', '仍是', '最', '喜歡', '你', '總有', '一個', '人', '的', '出現', ',', '讓', '我', '像', '流沙', ',', '像', '落雪', '。', '那些', '別人', '在', '上面', '劃', '了', '又', '劃', '的', '痕跡', ',', '你', '輕輕', '一抹', ',', '就平', '了', '。', '攢', '了', '一', '被子', '的', '情話', ',', '之後', '慢慢', '數給', '你', '聽', '。', '但願', '認識', '更', '多', '可愛', '的', '人', ',', '一塊兒', '作', '喜歡', '的', '事', ',', '寫', '最', '純真', '的', '字', ',', '講', '有趣', '的', '故事', '。', '我', '是', '禮雪晶', ',', '那麼', '你', '呢', '?', '做者', ':', '禮雪晶', '。', '「', '真', '羨慕', '大家', '這麼', '年輕', '就', '遇到', '了', '這麼', '才華橫溢', '的', '我', '。', '」', '一個', '成天', '與', '數字', '對抗', '卻', '藏', '了', '一', '被子', '情話', '的', '95', '後', '女生', '。', '願', '你', '的', '深情', '不', '被', '辜負', ',', '你', '喜歡', '的', '人', '也', '喜歡', '你', '。']
被子
情話
想要
最近
有種
雜碎
感受
...
若是
比喻
修辭
來講
的話
就是
已經
好久
沒有
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')
stopwords_df.head()
複製代碼
去掉停用詞
words_df = words_df[~words_df.segment.isin(stopwords_df.stopwords)]
words_df.head()
複製代碼
統計詞頻
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"計數": np.size})
words_stat = words_stat.reset_index().sort_values(by=["計數"], ascending=False)
words_stat.head(30)
words_stat.to_csv("JianShuJiaoYou-Words_Segments.csv", encoding='utf-8')
複製代碼
文章內容詞雲
醜版
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);
複製代碼
自定義背景圖 1.0版
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版
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));
複製代碼
在線詞雲生成網站:HTML5 Word Cloud
標題詞頻、詞雲
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
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({"計數": np.size})
titles_stat = titles_stat.reset_index().sort_values(by=["計數"], 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));複製代碼
在線詞雲生成網站:HTML5 Word Cloud
簡書「今日看點」專題熱門文章標題詞雲