手把手:R语言文本挖掘和词云可视化实践
互聯(lián)網(wǎng)時代,大量的新聞信息、網(wǎng)絡(luò)交互、輿情信息以文本形式存儲在數(shù)據(jù)庫中,如何利用數(shù)據(jù)分析和文本挖掘的算法,將海量文本的價值挖掘出來,成為我們團隊近期的一個研究方向,本案例就是我們的一個初步嘗試。飛信群是我們在工作、生活中交流的重要平臺,在將近一年的時間里共產(chǎn)生了幾萬條的聊天記錄,展現(xiàn)了我們這個團隊的方方面面。
本文將通過KNIME、R語言和tagxedo三個工具來實現(xiàn)文本挖掘和詞云可視化技術(shù),體驗一下輿情分析的魅力。
一、數(shù)據(jù)導(dǎo)入
數(shù)據(jù)源:2014年10月—2015年7月的飛信群全部聊天記錄:
圖一 原數(shù)據(jù)示例
通過KNIME進行原始聊天記錄文件的結(jié)構(gòu)化轉(zhuǎn)換,提取文件中發(fā)言人、發(fā)言時間和發(fā)言內(nèi)容三個字段,并保存為csv文件。
圖二 KNIME的流程
R語言的語句:
log <- read.csv('feixin.csv', sep=",", essay-header=FALSE) #數(shù)據(jù)導(dǎo)入并保存為log對象
二、發(fā)言熱度分布
通過熱力圖,我們可以看到大家聊天的熱情在2014年12月最為高漲,而2015年的2月由于春節(jié)原因,群里冷冷清清了好久。周末2天的空檔期也展現(xiàn)的很清晰哦。
R語言的語句:
require(plyr)
time <- as.POSIXlt(log$V3,origin = '1970-1-1 00:00:00' ,format="%Y-%m-%d %H:%M:%S") #設(shè)置日期格式
cbind(format(time,"%Y-%m"),format(time,"%d"))->day_table #生成發(fā)言時間分布表
as.data.frame(day_table)->day_table #轉(zhuǎn)換數(shù)據(jù)框格式
table(day_table)->day_m #生成日期列聯(lián)表
heatmap(day_m,Rowv=NA,Colv=NA,scale = "column",col=brewer.pal(4,"Blues"),revC = TRUE)
#繪制按日發(fā)言量的熱力圖,藍(lán)色越深代表發(fā)言熱度越高。
圖三 熱度分析
三、個人發(fā)言習(xí)慣分析
誰最能說?通過條形圖可以清晰的看到大家發(fā)言的頻率對比,一目了然。
R語言的語句:
require(plyr)
require(ggplot2)
name=log$V2 #獲取發(fā)言人姓名字段
table(name)->t_name #生成按姓名出現(xiàn)頻率的列聯(lián)表
as.data.frame(t_name)->t_name #轉(zhuǎn)換為數(shù)據(jù)框格式
gg = ggplot(t_name)
gg+geom_bar(aes(x=reorder(name,Freq),y=Freq,fill=name),stat="identity",position="dodge")+coord_flip()+theme(axis.title=element_text(size=18,color="blue"),axis.text=element_text(family='A',size=22,color="black")) 用ggplot擴展包繪制條形圖
圖四 發(fā)言量分析
注:因為涉及個人隱私所以把圖上10個人的名字都隱去了
有趣的來了,看看我們每個人喜歡在什么時間說話吧。大家都是有兩個發(fā)言高峰,一個是上午10點,一個是下午4點左右,而中午12點是一個明顯的午休靜默期。另外可以看到,有些童鞋在上午說話的頻率高于下午,有些則正相反。
R語言的語句:
require(plyr)
time <- as.POSIXlt(log$V3,origin = '1970-1-1 00:00:00' ,format="%Y-%m-%d %H:%M:%S")
#設(shè)置日期格式
hour <- format(time,'%H') #提取日期值中的“小時”數(shù)
hour_name <- as.data.frame(cbind(log$V2,hour))
count(hour_name,V1,hour)->hour_table #計算每人按小時發(fā)言的頻次
as.character(hour_name$hour)->hour_name$hour
as.numeric(hour_name$hour)->hour_name$hour #將“小時”字段轉(zhuǎn)換為數(shù)字格式
gg=ggplot(hour_name)
gg+ geom_density(aes(x=hour,fill=V1))+facet_wrap(~V1) +theme( strip.text=element_text(family='A',size=18,color="black"),axis.text=element_text(family='A',size=16,color="black")) #通過ggplot擴展包繪制基于發(fā)言時間段分布的面積圖
圖五 發(fā)言時間分布
注:因為涉及個人隱私所以把圖上10個人的名字都隱去了
四、詞云可視化
震撼的來了,看看這一年大家最關(guān)心什么?討論最多的是什么?有什么有趣的話題呢?為了和團隊的LOGO呼應(yīng),選用大象輪廓的詞云圖,效果棒棒噠。
R語言的語句:
require(tm)
require(Rwordseg)
gsub("[0-9,a-z,A-Z]", "", log$V1)->t #去除英文和數(shù)字
segmentCN(t)->t_seg #中文分詞
removeWords(unlist(t_seg),mystopword)->word #去除停用詞
word = lapply(X = word, FUN = strsplit, " ") #將分詞結(jié)果按空格分隔整理
v = table(unlist(word)) #計算每個單詞的詞頻
v = sort(v, decreasing = T) #按降序排列
d = data.frame(word = names(v), freq = v) #將詞頻矩陣轉(zhuǎn)換為數(shù)據(jù)框格式
d$word=as.character(d$word) #將單詞字段規(guī)整為字符串格式
rbind(d[nchar(d$word)==1,][1:10,],d[nchar(d$word)==2,][1:20,],d[nchar(d$word)>3,][1:20,])->result_r #提取不同字?jǐn)?shù)的單詞中詞頻最高的TOP50單詞,作為詞云繪制的素材
write.table(result_r,"result.csv",sep=",",row.names = FALSE) #保存結(jié)果為csv文件
通過一款開源的詞云可視化工具tagxedo,將導(dǎo)出的詞頻矩陣?yán)L制為各種形狀的詞云圖。
圖六 團隊詞云
看看,除了對“數(shù)據(jù)”、“互聯(lián)網(wǎng)”的關(guān)心是天經(jīng)地義的,我們說的最多的竟然是“吃”,名副其實的“吃貨”團隊,民以食為天嘛。“周報”赫然醒目也是醉了,其它的高頻詞都和工作息息相關(guān),“實驗室”、“工程師”,還有“平臺”、“服務(wù)器”、“數(shù)據(jù)庫”,真心是學(xué)習(xí)型聊天群啊。最開心的要數(shù)“哈哈哈”,證明我們的工作也是歡笑多多,其樂無窮的。
想看到每位童鞋的詞云有什么不同么?
圖七 個體詞云一
爽朗的“哈哈哈”,憤怒的“啊啊啊”,最擅用“[圖片]”在群里展現(xiàn)心情。致我們的美女?dāng)?shù)據(jù)分析師,也是團隊大象logo的設(shè)計者。
下面重磅推出我們的首席數(shù)據(jù)科學(xué)家,瞧瞧科學(xué)家的世界與我們是多么的不同。竟然……基本都是英文術(shù)語。
圖八個體詞云二
五、建模流程
下面用一張圖簡單回顧一下本文實現(xiàn)的建模過程:
圖九 整體分析思路
希望上面的案例分析能幫助大家更好的理解文本挖掘和輿情分析可視化的一些分析思路和呈現(xiàn)方式,我們也會盡力挖掘更多的創(chuàng)意,制作更好的產(chǎn)品呈現(xiàn)給大家,謝謝!。
原文發(fā)布時間為:2015-09-18
本文來自云棲社區(qū)合作伙伴“大數(shù)據(jù)文摘”,了解相關(guān)信息可以關(guān)注“BigDataDigest”微信公眾號
總結(jié)
以上是生活随笔為你收集整理的手把手:R语言文本挖掘和词云可视化实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Python核心编程(第二版)》——1
- 下一篇: 掘金专访 - 收藏集 - 掘金