乾貨:QQ聊天記錄數據分析

如果您對某個QQ聊天群感興趣,並想了解某段時間內大家都聊了什麼話題?或者是群里哪些人最活躍?或者這些群員都在哪些時間段比較活躍?本文將教你用R實現這些問題的回答。

一、下載QQ群聊天記錄

如果您還不知道如何下載某個QQ群的聊天記錄,您可以參考下文鏈接:

jingyan.baidu.com/artic

二、聊天記錄格式化

您下載下來的聊天記錄是這樣的格式:

如何將這樣的文本記錄轉換為二維表格式呢?即一張表中包含用戶名、說話時間和說話內容三列。

如下是我的R腳本實現聊天記錄的格式化:

#定義數據框和變數

data <- data.frame(user_name = c(), datetime = c(), text = c())

user_name <- character()

datetime <- character()

text <- character()

#開始遍歷整個文本,取出三列數據

for(i in 5:length(file_data)){

dt_pattern <- regexpr("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]+:[0-9]+:[0-9]+",file_data[i])

if(dt_pattern == 1) {

user_begin <- dt_pattern+attr(dt_pattern,"match.length") + 1

user_end <- nchar(file_data[i])

user_name <- substring(file_data[i],user_begin,user_end)

dt_begin <- dt_pattern

dt_end <- dt_pattern+attr(dt_pattern,"match.length")-1

datetime <- substring(file_data[i],dt_begin,dt_end)

text <- file_data[i+1]

data <- rbind(data, data.frame(Name = user_name,datetime = datetime,text = text))

}

}

#欄位類型轉換

data$user_name <- as.character(data$Name)

data$text <- as.character(data$text)

data$datetime <- as.POSIXlt(data$datetime)

#取出時間戳(datetime)的年、月、日、時、分、秒部分

data <- transform(data,

year = datetime$year+1900,

month = datetime$mon+1,

day = datetime$mday,

hour = datetime$hour,

min = datetime$min,

sec = datetime$sec)

data$datetime <- as.character(data$datetime)

結構化的數據格式如下:

三、繪圖

繪圖主題一:群中哪些天最熱鬧

統計每月每天總的聊天次數

library(sqldf)

my.data1 <- sqldf("select month,day,count(*) Freq from data

group by month,day")

首先來一張熱圖,圖中反映了哪月哪些天群里最熱鬧

library(ggplot2)

p1 <- ggplot(data = my.data1, mapping = aes(x = factor(day), y = factor(month), fill = Freq))

p1 <- p1 + geom_tile() + scale_fill_gradient(low = "steelblue", high = "darkred")

p1

繪圖主題二:群中哪些人最活躍

#每個用戶的說話頻次

df <- as.data.frame(table(data$Name)

#這裡挑出發言量前10的群員

top10 <- df[order(df$Freq, decreasing = TRUE),][1:10,]

))

#繪製沒有排序的條形圖

p2 <- ggplot(data = top10, mapping = aes(x = Name, weight = Freq, fill = Name)) + xlab(NULL) + ylab(NULL)

p2 <- p2 + geom_bar() + coord_flip() #+ scale_fill_manual(values = rainbow(10), guide = FALSE)

p2

#繪製排序的條形圖

p3 <- ggplot(data = top10)+ xlab(NULL) + ylab(NULL)

p3 <- p3 + geom_bar(aes(x = reorder(Name, Freq), y = Freq, fill = Name), stat="identity") + coord_flip()

p3

繪圖主題三:這群活躍的人都喜歡什麼時候發言

#讀取10人的發言匯總信息

my.data3 <- sqldf("select Name,hour,count(*) Freq from data where Name in (select Name from top10) group by Name,hour")

Encoding(my.data3$Name) <- "UTF-8"

#繪製面積圖

p4 <- ggplot(data = my.data3, mapping = aes(x = hour, y = Freq, fill = Name))

p4 <- p4 + geom_area() + facet_wrap(~Name) + scale_fill_manual(values = rainbow(10), guide = FALSE)

p4

繪圖主題四:這段時間內,大家都聊了什麼?

#分詞

library(Rwordseg)

library(tmcn)

library(tm)

#讀入自定義的停止詞

my.stopwords <- readLines("stopwords.txt", encoding = "UTF-8")

#添加自定義辭彙

insertWords(c("順豐","外賣","快遞","娜娜","麗娜","9樓","10樓","小李","帳號","it","IT","客服","樓下","門禁"))

#根據分詞結果再一次添加自定義停止詞

my.stopwords <- c(my.stopwords, "下","人","圖片","表情","號","好","請","錄","機","群")

segwd1 <- unlist(segmentCN(strwords = data$text))

Encoding(segwd1) <- "UTF-8"

#剔除停止詞

segwd2 <- segwd1[which((segwd1 %in% my.stopwords) == FALSE)]

#分詞後的詞語頻率匯總

wdfreq <- as.data.frame(table(segwd2))

#排列語頻順序

wdfreq <- arrange(df = wdfreq, Freq, decreasing = TRUE)

#取出前50的詞頻

wdfreq <- wdfreq[1:50,]

前50的詞頻格式如下圖所示(圖中記錄了每個詞語的出現頻次):

#繪製文字雲

library(wordcloud)

par(bg = "black")

wordcloud(words = wdfreq$segwd2, freq = wdfreq$Freq, random.color=TRUE, colors=rainbow(10))

參考資料

手把手:R語言文本挖掘和詞雲可視化實踐 - 今日頭條(www.toutiao.com)

R語言與網站分析

總結:文中涉及到的R包和函數

stats包

regexpr()

substring()

rbind()

transform()

table()

%in%

sqldf包

sqldf()

plyr包

arrange()

ggplot2包

ggplot()

geom_tile()

scale_fill_gradient()

geom_bar()

geom_area()

facet_wrap()

scale_fill_manual()

Rwordseg包

tm包

insertWords()

segmentCN()

wordcloud包

wordcloud()

----------------------------------------------------

作者:劉順祥

博客專欄:每天進步一點點2015

公眾號:每天進步一點點2015

最近很多人私信問我問題,平常知乎評論看到不多,如果沒有及時回復,大家也可以加小編微信:tszhihu,進知乎大數據分析挖掘交流群,可以跟各位老師互相交流。謝謝。


推薦閱讀:

亂分析LOL數據集-->R
數據分析師,數據挖掘師,大數據工程師,三者的工作有何區別?
做卧底,如何不動聲色的毀掉對手的產品

TAG:R编程语言 | 数据分析 | 数据挖掘 |