用R語言分析我和男友的聊天記錄
作者:伊蓮小小小小仙女,R語言中文社區專欄作者。個人公眾號:MeMyselfandYou
這篇文章大概在好幾個月前就存在在腦海中。最開始是看了《遲到的情人節禮物:做一個與她微信聊天的詞雲吧》,覺得作者寫的很好玩,那個時候因為工作的原因剛開始學習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 =messagewechat_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。當然,如果有大神能拯救我以上雜亂的演算法,歡迎指導學習,也希望下一個學習項目能分享和發現更多有趣的東西。
推薦閱讀: