自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用文本挖掘技術(shù)分析Twitter用戶對(duì)電影的評(píng)價(jià)

大數(shù)據(jù)
本文將以2017年的寶萊塢電影“Rangoon”為例子,用R語言來分析Twitter用戶對(duì)他的情感評(píng)價(jià)。

[[192175]]

引言

使用一些建模分析手段來評(píng)價(jià)電影的成功已經(jīng)屢見不鮮,這類預(yù)測模型常常使用注入電影制作成本,類型,主演,出品方等結(jié)構(gòu)化數(shù)據(jù)作為輸入。然而,在社交媒體日益發(fā)達(dá)的現(xiàn)在,人們時(shí)常會(huì)在Twitter,F(xiàn)acebook等網(wǎng)站上發(fā)表自己的意見和建議。社交媒體已然是衡量電影觀眾情緒的潛在工具了。

本文將以2017年的寶萊塢電影“Rangoon”為例子,用R語言來分析Twitter用戶對(duì)他的情感評(píng)價(jià)。

目錄

  1. 文本挖掘?qū)д?/li>
  2. 分析目標(biāo)
  3. 數(shù)據(jù)
  4. 分析過程1 ­ 使用“tm”包
  5. 分析過程2 ­ 使用“suazyhet”包
  6. 結(jié)論
  7. 為電影預(yù)測構(gòu)建一個(gè)算法

1. 文本挖掘?qū)д?/strong>

在進(jìn)入正題之前,我們不妨問這樣一個(gè)問題:什么是文本挖掘?

簡而言之,文本挖掘就是把非結(jié)構(gòu)化的文本數(shù)據(jù)轉(zhuǎn)化為有意義的觀點(diǎn)的過程。轉(zhuǎn)化后的觀點(diǎn)可以針對(duì)用戶建議,產(chǎn)品評(píng)價(jià),情感分析和消費(fèi)者反饋等

與傳統(tǒng)方法依靠的結(jié)構(gòu)化數(shù)據(jù)不同,文本挖掘的對(duì)象是結(jié)構(gòu)松散有諸多語法和拼寫錯(cuò)誤的文本,而且還時(shí)常包含多種語言。這使得整個(gè)挖掘過程變得更有趣且富有挑戰(zhàn)性。

在文本挖掘領(lǐng)域有兩大常用方法:情感分析和詞包挖掘(Bag of Words,a.k.a bow model)。

情感分析關(guān)心單詞的結(jié)構(gòu)和語法,詞包挖掘則是把文本(句子,微博,文檔)視作單詞的集合(包)。

2. 分析目標(biāo)

每個(gè)分析項(xiàng)目都應(yīng)該有個(gè)明確的目標(biāo),本文的目標(biāo)就是對(duì)Twitter數(shù)據(jù)使用文本挖掘技術(shù)來獲取用戶對(duì)電影“Rangoon”的情感評(píng)價(jià)。

3. 數(shù)據(jù)

分析的第一步就是要獲取數(shù)據(jù),如今獲取Twitter數(shù)據(jù)只需要通過網(wǎng)頁爬蟲或者API就可以實(shí)現(xiàn)。本文則使用R語言中的“twitterR”包收集了10000條關(guān)于“Rangoon”的推文

我使用了“twitterR”采集了10000條關(guān)于“Rangoon”的推特和回復(fù),這部電影與2017年2月24日上映,我采集了2月25日的推特并把它們存在csv文件里,再用“readr”包讀入R里。從推特采集數(shù)據(jù)的過程超出了本文的范疇,暫且不表。

  1. # 加載數(shù)據(jù) 
  2. library(readr) 
  3. rangoon = read_csv("rangoontweets.csv"

4. 用“tm”包進(jìn)行分析

“tm”包是在R內(nèi)進(jìn)行文本挖掘的框架,它會(huì)基于廣泛使用的“Bag of Words”原則進(jìn)行分析。這一方法非常簡單易用,它會(huì)統(tǒng)計(jì)文本中每個(gè)詞的頻率,然后把詞頻作為變量。這一看似簡單的方法其實(shí)非常有效,并且現(xiàn)在已經(jīng)成了自然語言處理領(lǐng)域的基準(zhǔn)。

主要步驟如下:

Step 1: 加載相應(yīng)的包并且提出數(shù)據(jù)

  1. # 加載包 
  2. library('stringr'
  3. library('readr'
  4. library('wordcloud'
  5. library('tm'
  6. library('SnowballC'
  7. library('RWeka'
  8. library('RSentiment'
  9. library(DT) 
  10.  
  11. # 提出相關(guān)數(shù)據(jù) 
  12. r1 = as.character(rangoon$text) 

Step 2: 數(shù)據(jù)預(yù)處理

對(duì)文本進(jìn)行預(yù)處理可以顯著提升Bag of Words方法(其他方法也是)的效果。

預(yù)處理的第一步是構(gòu)建語料庫,簡單地說就是一本詞典。語料庫一旦建立好了,預(yù)處理也就完成了大半。

首先,讓我們移除標(biāo)點(diǎn),基礎(chǔ)方法就是把不是數(shù)字和字母的對(duì)象移除。當(dāng)然,有時(shí)標(biāo)點(diǎn)符號(hào)也很有用,像web地址中標(biāo)點(diǎn)就有提示符的作用。所以,移除標(biāo)點(diǎn)要具體問題具體分析,本文中則不需要它們。

之后,我們把單詞都變成小寫防止統(tǒng)計(jì)錯(cuò)誤。

預(yù)處理的另一個(gè)任務(wù)是把沒有用的詞組去掉,很多詞被頻繁使用但只在句子里才有意義。這些詞被稱為“stop words”(停詞)。舉個(gè)例子,像the,is這些詞就是停詞,它們對(duì)之后的情感分析無甚作用,所以就把它們?nèi)サ魜斫o數(shù)據(jù)瘦身。

另一個(gè)重要環(huán)節(jié)是stemming(詞干提取),他能把不同結(jié)尾的詞轉(zhuǎn)換成原始形式。比如,love,loved,loving這些詞之間的差異很小,可以用一個(gè)詞干也就是lov來代表它們,這個(gè)降維過程就叫詞干提取。

一旦我們把數(shù)據(jù)預(yù)處理好了,我們就可以開始統(tǒng)計(jì)詞頻來為未來建模做準(zhǔn)備了。tm包提供了一個(gè)叫“DocumentTermMatrix”的來完成相應(yīng)功能,它會(huì)返回一個(gè)矩陣,矩陣的每一行代表文檔(本例中是一條推特),列就代表了推特中的單詞。具體的數(shù)據(jù)就代表了每條對(duì)特相應(yīng)單詞的出現(xiàn)頻率。

我們生成這個(gè)舉證并把它命名為“dtm_up”。

  1. # 數(shù)據(jù)預(yù)處理 
  2. set.seed(100) 
  3. sample = sample(r1, (length(r1))) 
  4. corpus = Corpus(VectorSource(list(sample))) 
  5. corpus = tm_map(corpus, removePunctuation) 
  6. corpus = tm_map(corpus, content_transformer(tolower)) 
  7. corpus = tm_map(corpus, removeNumbers) 
  8. corpus = tm_map(corpus, stripWhitespace) 
  9. corpus = tm_map(corpus, removeWords, stopwords('english')) 
  10. corpus = tm_map(corpus, stemDocument) 
  11. dtm_up = DocumentTermMatrix(VCorpus(VectorSource(corpus[[1]]$content))) 
  12. freq_up <- colSums(as.matrix(dtm_up)) 

Step 3: 計(jì)量情感

現(xiàn)在是時(shí)候來進(jìn)行情感打分了。R中的“calculate_sentiment”函數(shù)可以完成這一工作,它會(huì)讀入文本并計(jì)量每個(gè)句子的情感得分。這一函數(shù)會(huì)把文本作為輸入,輸出一個(gè)包含每個(gè)句子情感得分的向量。

讓我們來實(shí)現(xiàn)這一功能。

  1. # 計(jì)量情感 
  2. sentiments_up = calculate_sentiment(names(freq_up)) 
  3. sentiments_up = cbind(sentiments_up, as.data.frame(freq_up)) 
  4. sent_pos_up = sentiments_up[sentiments_up$sentiment == 'Positive',] 
  5. sent_neg_up = sentiments_up[sentiments_up$sentiment == 'Negative',] 
  6.  
  7. cat("We have far lower negative Sentiments: ",sum(sent_neg_up$freq_up)," than positive: ",sum(sent_pos_up$freq_up)) 

我們發(fā)現(xiàn)褒義詞和貶義詞的比例是5780/3238 = 1.8,乍一看電影還是受到觀眾的好評(píng)的

讓我們分別深入挖掘好拼和差評(píng)來獲取更深的理解。

– 褒義詞

下方的表格展示了被分類為好拼的文本的詞頻,我們通過datatable函數(shù)實(shí)現(xiàn)這個(gè)功能。

“love”,“best”和“brilliant”是好評(píng)中的三大高頻詞。

  1. DT::datatable(sent_pos_up) 
  • textsentimentfreq_upaccomplishaccomplishPositive1adaptadaptPositive2appealappealPositive4astonishastonishPositive3awardawardPositive85aweawePositive11awestruckawestruckPositive5benefitbenefitPositive1bestbestPositive580betterbetterPositive186

我們可以把這個(gè)結(jié)果用詞云進(jìn)行可視化,詞云中單詞個(gè)頭越大代表它出現(xiàn)頻率越高。

– 褒義詞詞云

  1. layout(matrix(c(1, 2), nrow=2), heights=c(1, 4)) 
  2. par(mar=rep(0, 4)) 
  3. plot.new() 
  4. set.seed(100) 
  5. wordcloud(sent_pos_up$text,sent_pos_up$freq,min.freq=10,colors=brewer.pal(6,"Dark2")) 

詞云也顯示了love是好評(píng)中頻率最高的單詞。

– 貶義詞

重復(fù)之前的步驟,貶義詞中“miss”,“dismal”和“hell”是top3,讓我們也用詞云來可視化。

  1. DT::datatable(sent_neg_up) 
  • textsentimentfreq_upabruptabruptNegative3addictaddictNegative1annoyannoyNegative3arduousarduousNegative1attackattackNegative2awkwardawkwardNegative2badbadNegative64badbadNegative64baselessbaselessNegative1bashbashNegative5beatbeatNegative22

貶義詞詞云

  1. plot.new() 
  2. set.seed(100) 
  3. wordcloud(sent_neg_up$text,sent_neg_up$freq, min.freq=10,colors=brewer.pal(6, "Dark2"

注意:在文本分析時(shí),最好對(duì)分析的對(duì)象有一定了解。比如“bloody”或者“hell”這樣的貶義詞可能是從電影的插曲“bloody hell”中被統(tǒng)計(jì)出來的。相似的,“miss”也可能來自于Ragoon中的女性人物“Miss Julia”,這樣把它作為貶義詞處理可能就不合適了。

考慮到這些異象,我們要對(duì)分析結(jié)果做進(jìn)一步處理。之前統(tǒng)計(jì)的褒貶詞的比例是1.8,現(xiàn)在3238個(gè)貶義詞中的144個(gè)“hell”先不考慮,這樣這個(gè)比例會(huì)上升到1.87。

這是得到觀眾對(duì)Rangoon平價(jià)的第一步,看起來好評(píng)居多,我們需要用更細(xì)致的方法省查這一結(jié)論。

5. 用 “syuzhet” 包進(jìn)行分析

“syuzhet”包會(huì)使用3個(gè)情感詞典來進(jìn)行情感分析。與上述方法不同,它能分析更廣范圍的情感。當(dāng)然,第一步還是要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,包括對(duì)html鏈接進(jìn)行清洗。

  1. # 方法2 - 使用syuzhet包 
  2. text = as.character(rangoon$text)  
  3. ## 去掉回復(fù) 
  4. some_txt<-gsub("(RT|via)((?:\\b\\w*@\\w+)+)","",text) 
  5. ## 清洗html鏈接 
  6. some_txt<-gsub("http[^[:blank:]]+","",some_txt) 
  7. ## 去掉人名 
  8. some_txt<-gsub("@\\w+","",some_txt) 
  9. ## 去掉標(biāo)點(diǎn) 
  10. some_txt<-gsub("[[:punct:]]"," ",some_txt) 
  11. ## 去掉數(shù)字 
  12. some_txt<-gsub("[^[:alnum:]]"," ",some_txt) 

這個(gè)函數(shù)會(huì)輸出一個(gè)數(shù)據(jù)框,每一行代表原始文件的一個(gè)句子,每一列代表一種情感類型和正負(fù)情感配比。一共有十列,代表“anger”, “anticipation”, “disgust”, “fear”, “joy”, “sadness”, “surprise”, “trust”, “negative”, “positive”。

讓我們把這個(gè)結(jié)果也可視化

  1. # 可視化 
  2. library(ggplot2) 
  3. library(syuzhet) 
  4. mysentiment<-get_nrc_sentiment((some_txt)) 
  1. # 得到每種情感的得分 
  2. mysentiment.positive =sum(mysentiment$positive) 
  3. mysentiment.anger =sum(mysentiment$anger) 
  4. mysentiment.anticipation =sum(mysentiment$anticipation) 
  5. mysentiment.disgust =sum(mysentiment$disgust) 
  6. mysentiment.fear =sum(mysentiment$fear) 
  7. mysentiment.joy =sum(mysentiment$joy) 
  8. mysentiment.sadness =sum(mysentiment$sadness) 
  9. mysentiment.surprise =sum(mysentiment$surprise) 
  10. mysentiment.trust =sum(mysentiment$trust) 
  11. mysentiment.negative =sum(mysentiment$negative) 
  1. # 繪制柱狀圖 
  2. yAxis <- c(mysentiment.positive, 
  3. + mysentiment.anger, 
  4. + mysentiment.anticipation, 
  5. + mysentiment.disgust, 
  6. + mysentiment.fear, 
  7. + mysentiment.joy, 
  8. + mysentiment.sadness, 
  9. + mysentiment.surprise, 
  10. + mysentiment.trust, 
  11. + mysentiment.negative) 
  1. xAxis <- c("Positive","Anger","Anticipation","Disgust","Fear","Joy","Sadness","Surprise","Trust","Negative"
  2. colors <- c("green","red","blue","orange","red","green","orange","blue","green","red"
  3. yRange <- range(0,yAxis) + 1000 
  4. barplot(yAxis, names.arg = xAxis,  
  5. xlab = "Emotional valence", ylab = "Score", main = "Twitter sentiment for Movie Rangoon 2017", sub = "Feb 2017", col = colors, border = "black", ylim = yRange,  
  6. xpd = F, axisnames = T, cex.axis = 0.8, cex.sub = 0.8, col.sub = "blue"
  7. colSums(mysentiment) 

看看這個(gè)柱狀圖和每種情感的總和,積極情感(“positive”,“joy”,“trust”)比消極情感(“negative”,“disgust”,“anger”)得分高很多。這或許暗示了觀眾對(duì)電影評(píng)價(jià)比較正面。

6. 結(jié)論

兩個(gè)方法都表名電影“Rangoon”得到了觀眾的肯定。

7. 對(duì)電影表現(xiàn)構(gòu)建一個(gè)預(yù)測模型

本文專注于對(duì)電影“Rangoon”相關(guān)推特進(jìn)行情感分析,然而對(duì)于預(yù)測票房而言這可能不是很有作用。眾所周知,很多電影叫好不叫座,一些腦殘片卻能賺得盆滿缽滿。

這可咋整?

解決方案就是分析同類型電影的PT/NT比(好評(píng)差評(píng)比例)轉(zhuǎn)換為票房的歷史數(shù)據(jù),并構(gòu)建一個(gè)擬合與預(yù)測兼優(yōu)的模型。這個(gè)模型可以用來預(yù)測電影是否會(huì)獲得商業(yè)上的成功,在Rangoon這個(gè)例子里,1.87會(huì)被作為輸入的值。

由于這個(gè)問題超過了本文的范疇,我們不會(huì)展開討論。但需要注意的是文本分析也能用來預(yù)測電影票房。

結(jié)語

本文使用電影相關(guān)推特來進(jìn)行情感分析,需要注意的是采集的推特的發(fā)表時(shí)間可能很重要。在電影上映前后的推特可能在情感上有很大分歧,不同的預(yù)處理方式也會(huì)影響到結(jié)果。

本文的目的不在分析電影Rangoon的好壞,而是提出了情感分析的具體步驟。在這一領(lǐng)域還有很多先進(jìn)的方法,本文介紹的兩個(gè)方法是最簡單直觀的。

責(zé)任編輯:武曉燕 來源: 36大數(shù)據(jù)
相關(guān)推薦

2012-06-13 10:15:26

2011-10-14 14:24:26

Ruby

2023-07-28 08:11:28

數(shù)據(jù)分析開源框架

2016-08-18 00:35:39

Pythonwitte數(shù)據(jù)采集

2014-07-18 09:51:05

挖掘數(shù)據(jù)分析

2013-11-01 09:27:48

Twitter技術(shù)面試

2013-01-06 14:41:46

Ubuntu手機(jī)系統(tǒng)

2010-11-12 09:04:03

TwitterAPI

2017-05-15 14:00:28

大數(shù)據(jù)Python情感極性分析

2009-07-17 11:28:07

TwitterGoogle

2011-09-28 13:52:20

Windows 8評(píng)論

2010-01-05 14:05:05

2009-06-18 10:11:59

指紋Web安全

2017-04-19 12:05:59

2009-07-10 10:19:16

微軟TwitterCRM

2018-12-07 14:59:37

2013-01-14 11:35:59

IBMdW

2012-07-10 09:51:49

2018-09-04 11:45:31

前端JavaScriptNodeJS

2019-04-09 20:55:30

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)