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

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

首先評論數據如何獲取?

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

本次文本分析中需要使用如下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]

Clipboard Image.png

從上圖的結果中發現,經分割後的詞中有許多無意義的停止詞,如“是”,“只”,“了”,“也”等,這些詞是需要剔除的。關於停止詞,可以到網上搜索獲取。

#讀取停止詞

mystopwords <- read.table(file = file.choose(), stringsAsFactors = FALSE)

head(mystopwords)

class(mystopwords)

Clipboard Image.png

由於讀入的數據爲數據框格式,需要將其轉換爲向量格式,即:

mystopwords <- as.vector(mystopwords[,1])

head(mystopwords)

Clipboard Image.png

現在有了停止詞詞庫,接下來需要將分割後的詞與停止詞詞庫進行比對,將含有停止詞的詞進行剔除。下面是自定義刪除停止詞的函數:

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]]

Clipboard Image.png

從上圖中顯示,一些無意義的停止詞已經被剔除,下面就使用比較乾淨的詞繪製文字雲,以大致查看分詞效果。

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)

Clipboard Image.png

發現“不錯”這個詞非常明顯,但到底是什麼不錯呢?下面來看一看都是哪些評論包含不錯這樣的字眼。

#根據頻繁出現詞彙,還原初始評價

index <- NULL

for(i in 1:length(segword)){

  if (any(segword[[i]] %in% '不錯') == TRUE)

  index = unique(c(index, i))

text[index]

Clipboard Image.png

含有“不錯”字眼的評論有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)

Clipboard Image.png

#新建停止詞

stopwords_v2 <- c('不錯','酒店','交通','前臺','出差','價','去','免費','入','入住','大道','吃','退','上海','說','牀','態度','升級','地理','很好','號','住','服務員','房間','服務','設施','環境','位置')

#創建新添加的停止詞

mystopwords <- c(mystopwords,stopwords_v2)

#排除停止詞

segword4 <- sapply(X = segword3, FUN = removewords, mystopwords)

#查看已刪除後的分詞結果

segword4[[1]]

Clipboard Image.png

根據上面的分詞結果,再一次繪製文字雲,具體如下:

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)

Clipboard Image.png

發現還是有一些詞影響了其真實情況,如“早餐”,"房"等,需要進一步將其納入停止詞,因爲這些詞之前已經被組合成其他詞彙。

#再一次清除停止詞

stopwords_v3 <- c('早餐','嘴','電話','訂','樓','人員','鍾','修','辦理','客人','品種','朋友','帶','出門','房','影響','硬件','感覺','想','驗','潔','希望','送') 

segword5 <- sapply(X = segword4, FUN = removewords, stopwords_v3)

#查看已刪除後的分詞結果

segword5[[1]]

Clipboard Image.png

根據這次剔除的停止詞,我們再繪製一次文字雲:

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)

Clipboard Image.png

發現文字雲中含有相同意思的詞彙,如“推薦”和“值得推薦”,這就要將這樣的詞彙合併爲一個詞彙,具體如下

#將推薦和值得推薦合併

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)

Clipboard Image.png

上面使用R的wordcloud包繪製文字雲,也可以使用工具tagxedo繪製,繪製之前需要將txt文件輸入該工具中,該工具的使用可至網站:

http://www.tagxedo.com

#將前50的詞頻寫出到txt文件

write.table(head(word_freq4,50),'word_freq.txt', row.names = FALSE, sep = ' ', quote = FALSE)

在同事的熱心幫助下,使用工具tagxedo繪製的個性化文字雲,文字雲以房子的形狀爲背景:

Clipboard Image.png

結論:

從文字雲的返回結果可知:

1)  總體評價是比較滿意的,如:服務不錯、環境不錯、酒店不錯、滿意等

2)  酒店附近有地鐵,說明交通便利

3)  “攜程”,說明房客中的一部分來源於攜程

4)  當然也有一些負面評價,如“不便”,“施工”,“修路”等

5)  最後,房客覺得這家酒店非常值得推薦,間接將給酒店帶來額外客戶


文章中涉及到的數據和腳本鏈接:

https://yunpan.cn/cr9mInZKLeHaQ  訪問密碼 ab9d

發佈了48 篇原創文章 · 獲贊 59 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章