文本挖掘:手把手教你分析攜程網評論數據

文本分析的應用越來越廣泛,這不,我的工作也開始涉及了文本分析,今天就講講關於評論數據的那點事。

首先評論數據如何獲取?

一般通過網路爬蟲的方式抓取各大網站的評論數據,本次分析數據就來源於攜程網某酒店的評論,在同事的協助下,成功爬取該酒店的評論數據,於是我開始使用這些數據做相關的分析。

本次文本分析中需要使用如下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學習計劃
多維放射狀流向圖的最佳布局方案

TAG:文本数据挖掘 | 文本数据分析 | 大数据分析 |