用R語言分析我和男友的聊天記錄
這篇文章大概在好幾個月前就存在在腦海中。最開始是看了《遲到的情人節禮物:做一個與她微信聊天的詞雲吧》,覺得作者寫的很好玩,那個時候因為工作的原因剛開始學習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個高頻詞的詞雲。
在過程中也發現了一些別樣的東西:
“馬老師”的字眼反覆出現,這絕不是補習班的老師,更不是制服誘惑,馬老師,一起加油
另外,在我們的聊天內容中,最常用的十大emoji竟是它們:
點贊最多,看來我們互相很認可對方,但是生氣為啥也那麼多?
此外,我還挑出過去N次吵架的聊天記錄,做了下面的圖。情人之間的吵架大概都大同小異吧,沒有安全感,互相拒絕著對方,說著傷人的話。
後話
這個一次次丟掉又撿起來的小學習作業終於劃上了一個句號。分析的過程的確痛苦,一方面要學習各種語法,另一方面,翻開聊天記錄就像扒開自己的肉一樣疼,回憶一幕幕,開心難過百感交集。這之間有自己的迷茫,有學術的無知,也有愛情的摸索,幸好,我們依舊,攜手走在一起。
這個小分析同時也是一個起點,這幾個月在R語言上收穫頗多。沒想到開始的機緣巧合燃起了對R的熱情。學習過程,不像學校裡的課程授課,幾乎都是想實現一個功能,於是去查詢,找到一個語法,聯絡到更多的知識,聯絡,聯絡,最後再串起來。
記得從最一開始rJava包在我的電腦上沒法安裝,在Google上翻過所有的問答,StackOverflow成了我泡得最多的網站,遠在英國的同學也幫忙解答。。。每一次反覆調程式碼的時候,都是深夜凌晨,可當調好的瞬間又那麼欣喜如狂。
再回頭看,這個小作業很簡單,但是從中已經學到了R語言裡幾乎所有的基礎語法,雖然中間部分的演算法還很凌亂,至少為自己感到驕傲。現在可以任意用ggplot畫一個漂亮的統計圖,而不是千篇一律的Excel。當然,如果有大神能拯救我以上雜亂的演算法,歡迎指導學習,也希望下一個學習專案能分享和發現更多有趣的東西。
分享朋友圈 也是另一種讚賞
The more we share, The more we have
歡迎加入資料君高效資料分析社群
加我私人微信進入大資料乾貨群:tongyuannow
目前100000+人已關注加入我們