# 结构化数据

## 文章配图数

```import pandas as pd

```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...   你现在有没有喜欢一个人？```

```def images_num(imageslist):
return len(imageslist)
df12['Images_Num'] = df12.Image_Url.apply(images_num)
`df12.Images_Num.hist();`

output_4_0.png

### 将字符串转化成 list 格式

`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.Images_Num.value_counts()`

`df12.Images_Num.hist();`

output_12_0.png

## 文章长度 / 字数

```def artical_length(artical_content):
return len(artical_content)
df12['Artical_Length'] = df12.Artical_Content.apply(artical_length)
`df12.Artical_Length.hist();`

output_15_0.png

## 字数与配图数

```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");`

## 评论数与点赞数

```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')
ax1.scatter(x, y, z, s=15)
ax1.set_zlabel('Like')
ax1.set_ylabel('Comment')
#plt.show()```

output_25_1.png

## 多变量

### Pairplot图

seaborn.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图

seaborn-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.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();`

### 年度月份分布情况

`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_bar_year_month.js`里代码复制到该链接后刷新即可：“简书交友”专题文章之年度月份分布情况

# 文本挖掘

## 读取数据

```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```

## 文章内容转化成 list 格式

```content = df12.Artical_Content.values.tolist()
print(len(content), '\n', content[-1])```
```2718

## 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') #quoting=3全不引用

### 去掉停用词

```words_df = words_df[~words_df.segment.isin(stopwords_df.stopwords)]

## 统计词频

```words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数": np.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"], ascending=False)
`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);
# plt.imsave(path)```

### 自定义背景图 1.0版

```from scipy.misc import imread
matplotlib.rcParams['figure.figsize'] = (8.0, 8.0)
from wordcloud import WordCloud,ImageColorGenerator
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
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));```

## 标题词频、词云

```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_stat = titles_df.groupby(by=['segment'])['segment'].agg({"计数": np.size})
titles_stat = titles_stat.reset_index().sort_values(by=["计数"], ascending=False)
```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
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));```

### 简书“今日看点”专题热门文章标题词云

PS：预告下，即将开启“Kaggle Kernel 学习系列”，GitHub - DesertsX / Kaggle-Kernel-Learning，欢迎star。

0 条评论

• ### 资源《机器学习：回归》by 华盛顿大学

今天，公众号后台来了位新朋友，大家没事可以去聊聊天、扯扯淡、谈谈诗和远方。刚开始用，还不知道有无智能回复的条数限制。

• ### 全球音乐地图：Musical Map of the World

最近在整理一些可视化作品：《你不曾见过的酷炫地图可视化作品（一）》，搜索资料时偶然看到一个名为Musical Map of the World的作品，觉得还不错...

• ### 我的简书一月记：数据可视化

截止前天，来简书正好一个月。20170730 注册了账号，当晚发布处女作《爬取张佳玮138w+知乎关注者：数据可视化》，从而开启了《python爬虫和数据可视化...

• ### 为mongos构建一个异步网络层

许多人以分片集群的方式运行MongoDB服务器。 在这种配置下， mongos位于用户程序和分片数据之间， 用户连接mongos并给它发送查询， mongos将...

• ### Element el-tree树形控件的数据处理方法

假如需求，左边是树形菜单，右边是点击树形菜单显示的所以按钮以及选中的按钮，每一个子节点对应的按钮可能不一样，如何实现选择的按钮更新到数据对象中

• ### 软件分享 | ZoomIt 4.5 演示辅助工具使用教程

ZoomIt是一款非常实用的投影演示辅助软件。它源自Sysinternals公司，后来此公司被微软收购，因此，有些网友也称ZoomIt为微软放大镜。ZoomIt...

• ### 基于RS的植被覆盖度评价 ——以北京市为例

本研究以2景覆盖北京市的Landsat 5 TM影像为数据源，成像时间为2009年9月份，采用改进的像元二分模型详细介绍植被覆盖度遥感估算过程。涉及TM影像校正...

• ### 三招教你提升SEO效果

SEO又叫搜索引擎优化，是一种提高网页在搜索引擎排名的技术，在搜索结果里，第一页往往会占据至少50%的流量，而排名前三几乎可以占据90%的流量。SEO技术通过网...

• ### 彻底解决WordPress 中 半角全角字符转义 的问题

WordPress中会默认会自动转义一些字符，如将‘--’转义为‘－’破折号，网络上也称“转换全半角标点符号”或者“代码转义”。因为Wordpress 会智能地...

• ### android自定义view实现progressbar的效果

一键清理是很多Launcher都会带有的功能，其效果也比较美观。实现方式也许有很多中，其中常见的是使用图片drawable来完成的，具体可以参考这篇文章：模仿实...