我和女朋友天天都在聊啥???

我和女朋友天天都在聊啥???

本文狗粮较多,慎入。

在过去两年里,我平均每天有两个小时是在和女朋友聊天,那我们天天都是聊啥呢???

为了分析这个话题,首先我们需要把手机里的聊天记录导出来,对于iPhone来说,可以使用itools导出微信聊天记录:

整理数据

接下来就可以开始整理数据了,不过导出来的数据不是UTF-8编码的,我是先用Stata进行转码的,xiaoxiao.txt是我导出来的聊天记录文件的名称。

Stata
1
2
3
unicode translate xiaoxiao.txt
unicode translate xiaoxiao.txt, invalid
unicode erasebackups, badidea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
library(tidyverse)
library(lubridate)
library(stringfix)
df <- read_delim("xiaoxiao.txt", delim = " ", skip = 2,
col_names = F, ) %>%
transmute(
time = as.character(X1) %+% " " %+% as.character(X2) %>%
ymd_hms(),
from = X3 %>% str_replace_all(" ", ""),
from = from %>% gsub(., pattern = "刘含", replacement = ""),
from = from %>% gsub(., pattern = "\\?\\?", replacement = ""),
type = X5 %>% str_replace_all(" ", ""),
message = X6 %>% str_replace_all(" ", "")
) %>%
dplyr::filter(from %in% c("笑笑", "我"))

# 这个数据是这样的:
df

# # A tibble: 62,710 x 4
# time from type message
# <dttm> <chr> <chr> <chr>
# 1 2019-02-04 07:20:00 我 文字 这是小程鸭
# 2 2019-02-04 07:20:00 我 表情 表情
# 3 2019-02-04 07:19:00 笑笑 表情 表情
# 4 2019-02-04 07:19:00 我 表情 表情
# 5 2019-02-04 07:19:00 笑笑 文字 来早了
# 6 2019-02-04 07:19:00 笑笑 文字 到了
# 7 2019-02-04 07:19:00 笑笑 表情 表情
# 8 2019-02-04 06:53:00 我 表情 表情
# 9 2019-02-04 06:53:00 我 文字 自己动手丰衣足食
# 10 2019-02-04 06:53:00 笑笑 表情 表情
  • time:消息发出的时刻;
  • from:我或者笑笑;
  • type:消息的类型;
  • message:消息内容。

消息量

消息数量对比

1
2
3
df %>% 
count(from) %>%
knitr::kable(align = "c")
来源 数量
35141
笑笑 27569

文字消息量

1
2
3
4
5
6
7
df %>% 
count(type, from) %>%
spread(key = "from", value = "n") %>%
mutate(
`我` = ifelse(is.na(`我`), 0, `我`)
) %>%
knitr::kable(align = "c")
类型 笑笑
表情 8256 8808
名片 0 2
实时视频 3 9
视频 56 27
图片 1207 679
网页消息 136 80
未知类型 1 42
位置 16 23
文字 25465 17527
系统通知 0 119
语音 1 253

再用图展示出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
df %>% 
count(type, from) %>%
spread(key = "from", value = "n") %>%
mutate(ratio = 我/笑笑) %>%
gather(`我`, `笑笑`, key = "from", value = n) %>%
mutate(type = fct_reorder(type, ratio)) %>%
ggplot(aes(x = type, y = n, fill = from %>%
factor(levels = c("笑笑", "我")))) +
geom_col(position = "fill") +
theme(axis.title.x = element_blank()) +
theme(axis.title.y = element_blank()) +
coord_flip() +
scale_fill_brewer("来源", palette = "Pastel1") +
scale_y_continuous(labels = scales::percent) +
labs(x = "比例", y = "消息类型",
title = "我和笑笑的聊天内容类型对比",
subtitle = "时间范围:2018年6月16日——2019年2月4日")

聊天时间段

1
2
3
4
5
6
7
8
9
10
11
12
df %>% 
mutate(hour = hour(time)) %>%
count(hour) %>%
add_row(hour = 24, n = 593) %>%
ggplot(aes(x = hour, y = n)) +
geom_line(color = "#fc8d62", size = 0.8) +
labs(x = "时刻",
y = "消息量",
title = "我和笑笑的聊天内容的时刻分布",
subtitle = "时间范围:2018年6月16日——2019年2月4日") +
scale_x_continuous(breaks = seq(0, 24, 2),
labels = seq(0, 24, 2))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
colors = c('#a6cee3','#1f78b4','#b2df8a','#33a02c',
'#fb9a99','#e31a1c','#fdbf6f','#ff7f00',
'#cab2d6','#6a3d9a','#b15928')
df %>%
mutate(hour = hour(time)) %>%
count(hour, type) %>%
ggplot(aes(x = hour, y = n, group = type, color = type)) +
geom_line() +
scale_color_manual(values = colors, name = "类型") +
labs(x = "时刻",
y = "消息量",
title = "我和笑笑的聊天内容的时刻分布",
subtitle = "时间范围:2018年6月16日——2019年2月4日") +
scale_x_continuous(breaks = seq(0, 24, 2),
labels = seq(0, 24, 2))

消息量的月份分布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
df %>% 
mutate(
month = as.character(time) %>%
substr(1, 8) %+% "01" %>%
ymd()
) %>%
count(month, from) %>%
ggplot(aes(x = month, y = n,
group = from, color = from)) +
geom_line(size = 0.8) +
scale_x_date(breaks = c("2018-06-01", "2018-08-01",
"2018-10-01", "2018-12-01",
"2019-02-01") %>% ymd(),
labels = c("2018年6月", "2018年8月",
"2018年10月", "2018年12月",
"2019年2月")) +
labs(y = "消息量",
title = "我和笑笑聊天内容的月份分布",
subtitle = "时间范围:2018年6月16日——2019年2月4日") +
guides(color = guide_legend(title = "来源")) +
theme(axis.title.x = element_blank())

消息长度对比

我是个比较啰嗦的人:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
df %>% 
mutate(
month = as.character(time) %>%
substr(1, 8) %+% "01" %>%
ymd(),
length = str_length(message)
) %>%
dplyr::filter(type == "文字") %>%
dplyr::filter(!is.na(length)) %>%
group_by(from, month) %>%
summarise(n = mean(length)) %>%
ggplot(aes(x = month, y = n,
group = from, color = from)) +
geom_line(size = 0.8) +
scale_x_date(breaks = c("2018-06-01", "2018-08-01",
"2018-10-01", "2018-12-01",
"2019-02-01") %>% ymd(),
labels = c("2018年6月", "2018年8月",
"2018年10月", "2018年12月",
"2019年2月")) +
labs(y = "平均每条消息的字数",
title = "我和笑笑聊天平均每条消息字数的月份变化",
subtitle = "时间范围:2018年6月16日——2019年2月4日") +
guides(color = guide_legend(title = "来源")) +
theme(axis.title.x = element_blank())

总的来说,女朋友平均每句话5.36个字,而我平均每句话7.52个字。

聊天消息分词

聊天用语很口语化,所以分词不是很准,需要自己认真制作用户词典和停用词词典。

共同的词云

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
library(jiebaR)
engine_s <- worker(stop_word = "stopwords.txt",
user = "dictionary.txt")
segment <-segment(df$message, engine_s) %>%
as.data.frame() %>%
as_tibble() %>%
dplyr::rename(word = ".") %>%
count(word) %>%
arrange(desc(n)) %>%
dplyr::filter(str_length(word) > 1) %>%
dplyr::filter(!str_detect(word, "[0-9]")) %>%
slice(1:1000)

library(rWordCloud)
d3Cloud(text = segment$word, size = segment$n)

我们俩各自的词云

1
2
3
4
5
6
7
8
9
10
segment1 <- segment(df$message[which(df$from == "我")], engine_s) %>% 
as.data.frame() %>%
as_tibble() %>%
dplyr::rename(word = ".") %>%
count(word) %>%
arrange(desc(n)) %>%
dplyr::filter(str_length(word) > 1) %>%
dplyr::filter(!str_detect(word, "[0-9]")) %>%
slice(1:1000)
d3Cloud(text = segment1$word, size = segment1$n)

1
2
3
4
5
6
7
8
9
10
segment2 <- segment(df$message[which(df$from == "笑笑")], engine_s) %>% 
as.data.frame() %>%
as_tibble() %>%
dplyr::rename(word = ".") %>%
count(word) %>%
arrange(desc(n)) %>%
dplyr::filter(str_length(word) > 1) %>%
dplyr::filter(!str_detect(word, "[0-9]")) %>%
slice(1:1000)
d3Cloud(text = segment2$word, size = segment2$n)

反正就是天天吃饭、睡觉、上班,以及哈哈哈哈啦!

2019年2月1号 · 阜阳

# R

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了607.9k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×