1. 程式人生 > >用R語言分析我和男友的聊天記錄

用R語言分析我和男友的聊天記錄

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

這篇文章大概在好幾個月前就存在在腦海中。最開始是看了《遲到的情人節禮物:做一個與她微信聊天的詞雲吧》,覺得作者寫的很好玩,那個時候因為工作的原因剛開始學習R語言,一竅不通,我就想著那就用R學著同樣分析一遍好了,應該能收穫不少。於是,我開始分析和男友的微信聊天記錄,只不過正如原文作者所說,分析著,情人節變情人劫怎麼辦?Anyway, 今天是來交作業的。

獲取資料來源

首先《遲到的情人節禮物:做一個與她微信聊天的詞雲吧》一文中的作者已經寫的非常詳細了,我也完全按照原文章中的步驟操作。不過在這裡給大家兩小提示:

1)網上有各類提取微信聊天記錄的軟體或攻略,每個mac版都試過,都不可行,最後只有iMazing可以成功提取。
2)iMazing, 一定要下載正版,我就是因為誤下盜版,差點把手機毀掉,到現在手機感覺還是有點壞壞的(後遺症)。這個軟體功能強大,用不好的話IPhone變板磚。


原文是用Python寫,下面是我的R程式碼,略有不同。本人程式碼能力為0,太複雜迴圈演算法都寫不了,只能按照自己的思路一點點拼出來。

library(RSQLite)
library(plyr)
//連線SQLitle資料庫

conn <- dbConnect(dbDriver("SQLite"), dbname="MM.sqlite")
//設定連線函式

doCountQuery <- function(conn,table){    query <- paste("SELECT COUNT(name) FROM ",table,sep ="")    t <- dbGetQuery(conn,query)    return
(t) } table_name <- dbGetQuery(conn, "SELECT name FROM sqlite_master where type='table' and name like 'Chat_%' order by name")//取出所有表名,由於不會遍歷,只能按照最笨的辦法,計算哪個表的資料量最多,即是和男盆友的聊天記錄表,如果不是和男盆友的聊天表,此方法是找不出來

counts <- numeric(0)for (i in 1:length(table_name) ){    count <- doCountQuery(conn,table_name[i])    counts[i] <-count[[1
]]     }
//計算表長
table_count <- data.frame(counts)

//排序,表長最大的表,即是和男朋友的聊天記錄表
table_count1 <- table_count[order(table_count$counts,decreasing=TRUE),]

//提取到聊天內容
message <- dbGetQuery(conn, "SELECT * FROM Chat_XXXXXXXXXX ")

文字分析

拿到資料後就是進行文字分割,由於資料量實在龐大,我的電腦已經跑死好幾次。後來,在完全不懂,也不知如何求解的情況下,靠部分程式碼和部分Excel互相切換,得到了想要的結果。

library(jiebaRD)
library(jiebaR)

library(data.table)
library(stringr)

cutter=worker()
wechat_content =message
wechat_content <- as.character(wechat_word$V1)
///由於資料量過大,不知道為什麼只用cuter無法把所有資料都遍歷到,無奈只能寫簡單的函式每一條遍歷切割

cut_y <- function (y){    y=gsub("\\.","",y)    cutter[as.character(y)] }
//遍歷切割每一條聊天內容
y.out <- sapply(wechat_content,cut_y,USE.NAMES = F)

//去除數字
y.out<-gsub("[0-9]+?","",y.out)

// 去除停止詞
s <- read.csv(‘stopwords.csv’) stopwords <- c(NULL)for (i in 1:length(s)) {    stopwords[i] <- s[i] } y.out <- filter_segment(y.out,stopwords)

//遍歷計數後再組合到一起
wechat_content_whole <- as.array(0)
for (i in 1:length(y.out)){    table_content <- count(y.out[[i]])    wechat_content_whole <- rbind(wechat_content_whole,table_content) }

//最後計數
wechat_content_whole <- count(wechat_content_whole,"x")

//從大到小排列
wechat_content_whole<- wechat_content_whole[order(wechat_content_whole$freq,decreasing=TRUE),]

//提取前1000條做詞雲
wechat_words_final <- table_content_whole_final[1:1000,]

//顏色從粉到白函式
clufunc <- colorRampPalette(c("pink","white"))

//形成詞雲
wordcloud2(wechat_words_final, fontFamily = "HYTangTangCuTiJ", figPath = "love.jpg", size=1, color=clufunc(1000))

結果

一年零三個月

344442行

17萬+

這次的分析一共收集了一年零三個月的聊天記錄,總提取34442行資料,17萬+個分詞,下面的圖就是最後提取的前1000個高頻詞的詞雲。

640?wx_fmt=jpeg

在過程中也發現了一些別樣的東西:

640?wx_fmt=png

“馬老師”的字眼反覆出現,這絕不是補習班的老師,更不是制服誘惑,馬老師,一起加油smiley_82.png

另外,在我們的聊天內容中,最常用的十大emoji竟是它們:

640?wx_fmt=png

點贊最多,看來我們互相很認可對方,但是生氣為啥也那麼多?2_12.png

此外,我還挑出過去N次吵架的聊天記錄,做了下面的圖。情人之間的吵架大概都大同小異吧,沒有安全感,互相拒絕著對方,說著傷人的話。

640?wx_fmt=jpeg

後話

這個一次次丟掉又撿起來的小學習作業終於劃上了一個句號。分析的過程的確痛苦,一方面要學習各種語法,另一方面,翻開聊天記錄就像扒開自己的肉一樣疼,回憶一幕幕,開心難過百感交集。這之間有自己的迷茫,有學術的無知,也有愛情的摸索,幸好,我們依舊,攜手走在一起。

這個小分析同時也是一個起點,這幾個月在R語言上收穫頗多。沒想到開始的機緣巧合燃起了對R的熱情。學習過程,不像學校裡的課程授課,幾乎都是想實現一個功能,於是去查詢,找到一個語法,聯絡到更多的知識,聯絡,聯絡,最後再串起來。

記得從最一開始rJava包在我的電腦上沒法安裝,在Google上翻過所有的問答,StackOverflow成了我泡得最多的網站,遠在英國的同學也幫忙解答。。。每一次反覆調程式碼的時候,都是深夜凌晨,可當調好的瞬間又那麼欣喜如狂。

再回頭看,這個小作業很簡單,但是從中已經學到了R語言裡幾乎所有的基礎語法,雖然中間部分的演算法還很凌亂,至少為自己感到驕傲。現在可以任意用ggplot畫一個漂亮的統計圖,而不是千篇一律的Excel。當然,如果有大神能拯救我以上雜亂的演算法,歡迎指導學習,也希望下一個學習專案能分享和發現更多有趣的東西。

分享朋友圈 也是另一種讚賞

The more we share, The more we have

歡迎加入資料君高效資料分析社群

加我私人微信進入大資料乾貨群:tongyuannow 

640?wx_fmt=jpeg

目前100000+人已關注加入我們

640.jpeg? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif?

0.gif? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif? 0.gif?

640?wx_fmt=jpeg