文本挖掘:手把手教你分析攜程網評論數據
文本分析的應用越來越廣泛,這不,我的工作也開始涉及了文本分析,今天就講講關於評論數據的那點事。
首先評論數據如何獲取?
一般通過網路爬蟲的方式抓取各大網站的評論數據,本次分析數據就來源於攜程網某酒店的評論,在同事的協助下,成功爬取該酒店的評論數據,於是我開始使用這些數據做相關的分析。
本次文本分析中需要使用如下3個包:
1)Rwordseg包用於分詞
2)tmcn用於詞頻統計
3)wordcloud用於繪製文字雲
library(Rwordseg)
library(tmcn)
library(wordcloud)
#讀取數據
Evaluation <- read.csv(file = file.choose(), encoding = "UFT-8")
#剔除評論數據中含有的英文和數字
text <- gsub("[a-zA-Z0-9]","",Evaluation$Evaluation)
#分詞
segword <- segmentCN(strwords = text)
#查看第一條評論的分詞效果
segword[1]
從上圖的結果中發現,經分割後的詞中有許多無意義的停止詞,如「是」,「只」,「了」,「也」等,這些詞是需要剔除的。關於停止詞,可以到網上搜索獲取。
#讀取停止詞
mystopwords <- read.table(file = file.choose(), stringsAsFactors = FALSE)
head(mystopwords)
class(mystopwords)
由於讀入的數據為數據框格式,需要將其轉換為向量格式,即:
mystopwords <- as.vector(mystopwords[,1])
head(mystopwords)
現在有了停止詞詞庫,接下來需要將分割後的詞與停止詞詞庫進行比對,將含有停止詞的詞進行剔除。下面是自定義刪除停止詞的函數:
removewords <- function(target_words,stop_words){
target_words = target_words[target_words%in%stop_words==FALSE]
return(target_words)
}
#將該函數應用到已分割的詞中
segword2 <- sapply(X = segword, FUN = removewords, mystopwords)
#查看已刪除後的分詞結果
segword2[[1]]
從上圖中顯示,一些無意義的停止詞已經被剔除,下面就使用比較乾淨的詞繪製文字雲,以大致查看分詞效果。
word_freq <- getWordFreq(string = unlist(segword2))
opar <- par(no.readonly = TRUE)
par(bg = "black")
#繪製出現頻率最高的前50個詞
wordcloud(words = word_freq$Word, freq = word_freq$Freq, max.words = 50,
random.color = TRUE, colors = rainbow(n = 7))
par(opar)
發現「不錯」這個詞非常明顯,但到底是什麼不錯呢?下面來看一看都是哪些評論包含不錯這樣的字眼。
#根據頻繁出現辭彙,還原初始評價
index <- NULL
for(i in 1:length(segword)){
if (any(segword[[i]] %in% "不錯") == TRUE)
index = unique(c(index, i))
}
text[index]
含有「不錯」字眼的評論有658條,這就需要人為干涉,將這些「不錯」進行簡化並組成詞典。
這是一個非常繁工的過程,需要耐心的查看這些評論中都是怎麼表達的情感的。經過約3個小時的人為選詞(不斷反覆查看),將這些片語成詞典,並導入為自定義辭彙。(可能該方法比較笨拙,如有更好的方法,還請看官指導)。
#自定義辭彙
words <- c("房間乾淨","服務不錯","酒店不錯","不錯的酒店","不錯的地方","衛生不錯","設施不錯","設備不錯","硬體不錯","位置不錯","地段不錯","景色不錯","景觀不錯","環境不錯","風景不錯","視野不錯","夜景不錯","口味不錯","味道不錯","感覺不錯","態度不錯","態度冷漠","態度冷淡","服務差勁","熱情","熱心","不熱情","態度好","態度差","態度不好","素質差","質量不錯","房間不錯","浴缸不錯","早餐不錯","早餐質量差","自助餐不錯","下午茶不錯","強烈推薦","推薦入住","值得推薦","性價比不錯","隔音不錯","體驗不錯","不錯的體驗","設施陳舊","五星級酒店","性價比不錯","交通便利","交通方便","出行方便","房間小","價格不錯","前台效率太低","攜程","地理位置","陸家嘴")
#插入自定義辭彙
insertWords(strwords = words)
由於上面的辭彙都是經過簡化而成的,而原始評論可能是:「房間很乾凈」,「服務還是蠻不錯的」,「酒店真心不錯」等,所以就需要剔除這些干擾分詞的詞(「還是」,「蠻」,「真心」,「的」等)。
#根據業務情況、需要在原始評論中刪除的字和詞
pattern <- c("還是","很也","了","點","可以","還","是","真心","都","相當","大家","確實","挺","非常","應該","蠻","整體","裡面","就","實在","總體","聽說","有點","比較","質量","都是","夠","十分","還算","極其","也算","方面","太","算是")
#將這些片語成「正則表達式」
pattern2 <- paste("[",paste(pattern,collapse = ","),"]", sep = "")
#剔除原始評論中含有的這些干擾辭彙
text2 <- gsub(pattern = pattern2, replacement = "", x = text)
好,經過清洗後,原始的評論相對簡介而乾淨,下面對其進一步分詞,記住,之前已經構建了自定義辭彙,他會產生指定組合的詞,如「酒店」,「不錯」兩個片語合為「酒店不錯」。
#分詞
segword3 <- segmentCN(strwords = text2)
head(segword3)
#新建停止詞
stopwords_v2 <- c("不錯","酒店","交通","前台","出差","價","去","免費","入","入住","大道","吃","退","上海","說","床","態度","升級","地理","很好","號","住","服務員","房間","服務","設施","環境","位置")
#創建新添加的停止詞
mystopwords <- c(mystopwords,stopwords_v2)
#排除停止詞
segword4 <- sapply(X = segword3, FUN = removewords, mystopwords)
#查看已刪除後的分詞結果
segword4[[1]]
根據上面的分詞結果,再一次繪製文字雲,具體如下:
word_freq2 <- getWordFreq(string = unlist(segword4))
opar <- par(no.readonly = TRUE)
par(bg = "black")
#繪製出現頻率最高的前50個詞
wordcloud(words = word_freq2$Word, freq = word_freq2$Freq, scale = c(4,0.1), max.words = 50, random.color = TRUE, colors = rainbow(n = 7))
par(opar)
發現還是有一些詞影響了其真實情況,如「早餐」,"房"等,需要進一步將其納入停止詞,因為這些詞之前已經被組合成其他辭彙。
#再一次清除停止詞
stopwords_v3 <- c("早餐","嘴","電話","訂","樓","人員","鍾","修","辦理","客人","品種","朋友","帶","出門","房","影響","硬體","感覺","想","驗","潔","希望","送")
segword5 <- sapply(X = segword4, FUN = removewords, stopwords_v3)
#查看已刪除後的分詞結果
segword5[[1]]
根據這次剔除的停止詞,我們再繪製一次文字云:
word_freq3 <- getWordFreq(string = unlist(segword5))
opar <- par(no.readonly = TRUE)
par(bg = "black")
#繪製出現頻率最高的前50個詞
wordcloud(words = word_freq3$Word, freq = word_freq3$Freq, scale = c(4,0.1), max.words = 50,random.color = TRUE, colors = rainbow(n = 7))
par(opar)
發現文字雲中含有相同意思的辭彙,如「推薦」和「值得推薦」,這就要將這樣的辭彙合併為一個辭彙,具體如下:
#將推薦和值得推薦合併
segword6 <- unlist(segword5)
segword6[segword6 == "推薦"] <- "值得推薦"
#重新繪製文字雲
word_freq4 <- getWordFreq(string = unlist(segword6))
opar <- par(no.readonly = TRUE)
par(bg = "black")
#繪製出現頻率最高的前50個詞
wordcloud(words = word_freq4$Word, freq = word_freq4$Freq, scale = c(4,0.1), max.words = 50, random.order = F, random.color = T, colors = rainbow(n = 7))
par(opar)
上面使用R的wordcloud包繪製文字雲,也可以使用工具tagxedo繪製,繪製之前需要將txt文件輸入該工具中,該工具的使用可至網站:
Tagxedo - Word Cloud with Styles
#將前50的詞頻寫出到txt文件
write.table(head(word_freq4,50),"word_freq.txt", row.names = FALSE, sep = " ", quote = FALSE)
在同事的熱心幫助下,使用工具tagxedo繪製的個性化文字雲,文字雲以房子的形狀為背景:
結論:
從文字雲的返回結果可知:
1) 總體評價是比較滿意的,如:服務不錯、環境不錯、酒店不錯、滿意等
2) 酒店附近有地鐵,說明交通便利
3) 「攜程」,說明房客中的一部分來源於攜程
4) 當然也有一些負面評價,如「不便」,「施工」,「修路」等
5) 最後,房客覺得這家酒店非常值得推薦,間接將給酒店帶來額外客戶
文章中涉及到的數據和腳本鏈接:360雲盤 - 雲盤分享 訪問密碼 ab9d
學習與分享,取長補短
歡迎關注博客:每天進步一點點2015
公眾號:每天進步一點點2015
大家也可以加小編微信:tswenqu,進R語言中文社區 交流群,可以跟各位老師互相交流。
推薦閱讀:
※數據分析探索之旅(一):學習數據分析的初衷與規劃
※24頁PPT詳解數據分析師成長之路 ---來自 陳丹奕 11月24 微課分享課件
※大數據分析2017學習計劃
※多維放射狀流向圖的最佳布局方案