如何用Python和R對故事情節(jié)做情緒分析敢伸?

想知道一部沒看過的影視劇能否符合自己口味犬缨,卻又怕被劇透喳魏?沒關(guān)系,我們可以用情緒分析來了解故事情節(jié)是否足夠跌宕起伏怀薛。本文一步步教你如何用Python和R輕松愉快完成文本情緒分析刺彩。一起來試試吧。

煩惱

追劇是個令人苦惱的事情枝恋。

就拿剛剛播完第7季的《權(quán)力的游戲》來說创倔,每周等的時(shí)候那叫一個煎熬,就盼著周一能提早到來焚碌。

可是最后一集播完畦攘,你緊張、興奮呐能、激動和過癮之后呢念搬?是不是又覺得很失落?

因?yàn)椤旅嫖以摽词裁磩“摆出。?/p>

現(xiàn)在的影視作品朗徊,不是太少,而是太多偎漫。如果你有選擇困難癥爷恳,更會有生不逢時(shí)的感覺。

Netflix, Amazon和豆瓣等推薦引擎可以給你推薦影視作品象踊。但是它們的推薦温亲,只是把觀眾劃分成了許多個圈子。你的數(shù)據(jù)杯矩,如果足夠真實(shí)準(zhǔn)確的話栈虚,可能剛好和某一個圈子的特性比較接近,于是就給你推薦這個圈子更喜歡的作品史隆。

但是這不一定靠譜魂务。有可能你的觀影和評價(jià)信息分散在不同的平臺上。不完整泌射、不準(zhǔn)確的觀影數(shù)據(jù)粘姜,會導(dǎo)致推薦的效果大打折扣。

即便有了推薦的影視劇熔酷,它是否符合你的口味呢孤紧?畢竟看劇也是有機(jī)會成本的。放著《絕命毒師》不看拒秘,去看了一部爛劇号显,你的生命中的數(shù)十小時(shí)就這樣被浪費(fèi)了臭猜。

可除了從頭到尾看一遍,又如何能驗(yàn)證一部劇是否是自己喜歡的呢押蚤?

你可能想到去評論區(qū)看劇評获讳。那可是個危險(xiǎn)區(qū)域,因?yàn)殡S時(shí)都有被劇透的風(fēng)險(xiǎn)活喊。

你覺得還是利用社交媒體吧,在萬能的朋友圈問問好友量愧。有的好友確實(shí)很熱心钾菊,但有的時(shí)候,也許會過于熱心偎肃。

例如下面這位(圖片來自于網(wǎng)絡(luò)):

你可能抓狂了煞烫,覺得這是個不可能完成的任務(wù),就如同英諺所云:

You can't have your cake and eat it too.

真的是這樣嗎累颂?不一定滞详。在這個大數(shù)據(jù)泛濫,數(shù)據(jù)分析工具并不稀缺的時(shí)代紊馏,你完全可以利用技術(shù)幫自己選擇優(yōu)秀的影視作品料饥。

故事情節(jié)的文本,你可以到互聯(lián)網(wǎng)上找劇本朱监,或者是字幕岸啡。當(dāng)然,不是讓你把劇本從頭讀到尾赫编,那樣還不如直接看劇呢巡蘸。你需要用技術(shù)來對文本進(jìn)行分析。

情緒

我們提到的這個技術(shù)擂送,叫做情緒分析(emotional analysis)悦荒。它和情感分析(sentiment analysis)有相似之處。都是通過對內(nèi)容的自動化分析嘹吨,來獲得結(jié)果搬味。

情感分析的結(jié)果一般分為正向(positive)和負(fù)向(negative),而情緒分析包含的種類就比較多了躺苦。

加拿大國家研究委員會(National Research Council of Canada)官方發(fā)布的情緒詞典包含了8種情緒身腻,分別為:

  1. 憤怒(anger)
  2. 期待(anticipation)
  3. 厭惡(disgust)
  4. 恐懼(fear)
  5. 喜悅(joy)
  6. 悲傷(sadness)
  7. 驚訝(surprise)
  8. 信任(trust)

有了這些情緒的標(biāo)記,你可以輕松地對一段文本的情緒變化進(jìn)行分析匹厘。

這時(shí)候嘀趟,你可以回憶起中學(xué)語文老師講作文時(shí)說過的那句話:

文如看山不喜平。

故事情節(jié)會伴隨著各種情緒的波動愈诚。通過分析這些情緒的起伏她按,我們可以看出故事的基調(diào)是否符合自己的口味牛隅,情節(jié)是否緊湊等。這樣酌泰,你可以根據(jù)自己的偏好媒佣,甚至是當(dāng)前的心境,來選擇合適的作品觀看了陵刹。

我們需要用到Python和R默伍。這兩種語言在目前數(shù)據(jù)科學(xué)領(lǐng)域里最受歡迎。Python的優(yōu)勢在于通用衰琐,而R的優(yōu)勢在于統(tǒng)計(jì)學(xué)家組成的社區(qū)也糊。這些統(tǒng)計(jì)學(xué)家真是高產(chǎn),也很酷羡宙,經(jīng)常制造出令人驚艷的分析包狸剃。

咱們這里就用Python來做數(shù)據(jù)清理,然后用R做情緒分析狗热,并且把結(jié)果可視化輸出钞馁。

準(zhǔn)備

數(shù)據(jù)

我們首先需要找到的是來源數(shù)據(jù)。作為例子匿刮,我們選擇了《權(quán)利的游戲》第三季的第9集僧凰,名字叫做"The Rains of Castamere"。

你可以到這個網(wǎng)址下載這一集的劇本熟丸。

你只需要全選頁面拷貝允悦,然后打開一個文本編輯器,把內(nèi)容粘貼進(jìn)去虑啤。好了隙弛,現(xiàn)在你就有可供分析的文本了。

請建立一個工作目錄狞山。后面的操作都在這個目錄里進(jìn)行全闷。例如我的工作目錄是~/Downloads/python-r-emotion

把剛剛獲得的文本文件放到這個目錄中萍启。

Python

我們需要用到Jupyter Notebook总珠,請安裝Anaconda套裝。具體的安裝方法請參考《 如何用Python做詞云 》一文勘纯。

R

這個網(wǎng)址下載R基礎(chǔ)安裝包局服。你會看到R的下載位置有很多。

我建議你選擇中國的鏡像驳遵,這樣連接速度更快淫奔。清華大學(xué)的鏡像就不錯。

請根據(jù)你的操作系統(tǒng)平臺選擇其中對應(yīng)的版本下載堤结。我選擇的是macOS版本唆迁,下載得到pkg文件鸭丛。雙擊就可以安裝。

安裝了基礎(chǔ)包之后唐责,我們繼續(xù)安裝集成開發(fā)環(huán)境RStudio鳞溉。下載地址為這里

還是依據(jù)你的操作系統(tǒng)情況鼠哥,選擇對應(yīng)的安裝包熟菲。macOS安裝包為dmg文件。雙擊打開后朴恳,把其中的RStudio.app圖標(biāo)拖動到Applications文件夾中科盛,安裝就完成了。

好了,現(xiàn)在你就有了R的運(yùn)行環(huán)境了。

清理

我們首先需要清理文本數(shù)據(jù)孵构,完成以下這兩個任務(wù):

  1. 把與劇情正文無關(guān)的內(nèi)容去除瘤旨;
  2. 將數(shù)據(jù)轉(zhuǎn)換成R可以直接做情緒分析的結(jié)構(gòu)化數(shù)據(jù)格式。

到你的系統(tǒng)“終端”(macOS, Linux)或者“命令提示符”(Windows)下谴垫,進(jìn)入我們的工作目錄章母,執(zhí)行以下命令。

jupyter notebook

這時(shí)候工作目錄下還只有那個文本文件翩剪。

我們打開看看內(nèi)容乳怎。

往下翻頁,我們找到了劇本正文正式開始的標(biāo)記Opening Credits前弯。

翻到文本的結(jié)尾蚪缀,我們可以看到劇本結(jié)束的標(biāo)記End Credits

我們回到主頁面下恕出,新建一個Python的Notebook询枚。點(diǎn)擊右方的New按鈕,選擇Python 2浙巫。

有了全新的Notebook后金蜀,我們首先引入需要用到的包。

import pandas as pd
import re

然后讀取當(dāng)前目錄下的文本文件的畴。

with open("s03e09.txt") as f:
    data = f.read()

看看內(nèi)容:

print(data)

結(jié)果如下:

數(shù)據(jù)正確讀入渊抄。下面我們依照剛才瀏覽中發(fā)現(xiàn)的標(biāo)記把正文以外的文本內(nèi)容去掉。

先去掉開頭的非劇本正文內(nèi)容丧裁。

data = data.split('Opening Credits]')[1]

再次打印护桦,可以看見現(xiàn)在從正文開頭了。

print(data)

下面我們同樣處理結(jié)尾部分煎娇。

data = data.split('[End Credits')[0]

打印出來試試看嘶炭。

print(data)

拖動到尾部抱慌。

移除了開頭和結(jié)尾的多余內(nèi)容后,我們來移除空行眨猎。這里我們需要用到正則表達(dá)式抑进。

regex = r"^$\n"
subst = ""
data = re.sub(regex, subst, data, 0, re.MULTILINE)

然后我們再次打印。

print(data)

空行都已經(jīng)成功挪走了睡陪∷律可是我們注意到還有一些分割線組成的行,也需要去除掉兰迫。

regex = r"^-+$\n"
subst = ""
data = re.sub(regex, subst, data, 0, re.MULTILINE)

至此信殊,清理工作已經(jīng)完成了。下面我們把文本整理成數(shù)據(jù)框汁果,每一行分別加上行號涡拘。

利用換行符把原本完整的文本分割成行。

lines = data.split('\n')

然后給每一行加上行號据德。

myrows = []
num = 1
for line in lines:
    myrows.append([num, line])
    num = num + 1

我們看看前三行的行號是否已經(jīng)正常添加鳄乏。

myrows[:3]

一切正常,下面我們把目前的數(shù)組轉(zhuǎn)換成數(shù)據(jù)框棘利。如果你對數(shù)據(jù)框的概念不太熟悉橱野,請參考《貸還是不貸:如何用Python和機(jī)器學(xué)習(xí)幫你決策?》一文善玫。

df = pd.DataFrame(myrows)

我們來看看執(zhí)行結(jié)果:

df.head()

數(shù)據(jù)是正確的水援,不過表頭不對。我們給表頭重新命名茅郎。

df.columns = ['line', 'text']

再來看看:

df.head()

好了蜗元,既然數(shù)據(jù)框已經(jīng)做好了。下面我們把它轉(zhuǎn)換成為csv格式系冗,以便于R來讀取和處理许帐。

df.to_csv('data.csv', index=False)

我們打開data.csv文件,可以看到數(shù)據(jù)如下:

數(shù)據(jù)清理和準(zhǔn)備工作結(jié)束毕谴,下面我們用R進(jìn)行分析成畦。

分析

RStudio可以提供一個交互環(huán)境,幫我們執(zhí)行R命令并即時(shí)反饋結(jié)果涝开。

打開RStudio之后循帐,選擇File->New,然后從以下界面中選擇 R Notebook舀武。

然后拄养,我們就有了一個R Notebook的模板。模板附帶一些基礎(chǔ)使用說明。

我們嘗試點(diǎn)擊編輯區(qū)域(左側(cè))代碼部分(灰色)的運(yùn)行按鈕瘪匿。

立即就可以看到繪圖的結(jié)果了跛梗。

另外我們還可以點(diǎn)擊菜單欄上的Preview按鈕,來看整個兒代碼的運(yùn)行結(jié)果棋弥。

RStudio為我們生成了HTML文件核偿,我們的文字說明、代碼和運(yùn)行結(jié)果圖文并茂呈現(xiàn)出來顽染。

好了漾岳,熟悉了環(huán)境后,我們該實(shí)際操作運(yùn)行自己的代碼了粉寞。咱們把左側(cè)編輯區(qū)的開頭說明區(qū)保留尼荆,把全部正文刪除,并且把文件名改成有意義的名字唧垦,例如emotional-analysis捅儒。

這樣就清爽多了。

下面我們讀入數(shù)據(jù)振亮。

setwd("~/Downloads/python-r-emotion/")
script <- read.csv("data.csv", stringsAsFactors=FALSE)

讀入的時(shí)候一定要注意設(shè)置stringsAsFactors=FALSE巧还,不然R在讀取字符串?dāng)?shù)據(jù)的時(shí)候,會默認(rèn)轉(zhuǎn)換為level双炕,后面的分析就做不成了。讀取之后撮抓,在右側(cè)的數(shù)據(jù)區(qū)域你可以看到script這個變量妇斤,雙擊它,可以看到內(nèi)容丹拯。

數(shù)據(jù)有了站超,下面我們需要準(zhǔn)備分析用的包。這里我們需要用到4個包乖酬,請執(zhí)行以下語句安裝死相。

install.packages("dplyr")
install.packages("tidytext")
install.packages("tidyr")
install.packages("ggplot2")

注意安裝新軟件包這種操作只需要執(zhí)行一次∫瘢可是我們每次預(yù)覽結(jié)果的時(shí)候算撮,文件里所有語句都會被執(zhí)行一遍。為了避免安裝命令被反復(fù)執(zhí)行县昂。當(dāng)安裝結(jié)束后肮柜,請你刪除或者注釋掉上面幾條語句。

安裝了包倒彰,并不意味著就可以直接用其中的函數(shù)了审洞。使用之前,你需要執(zhí)行l(wèi)ibrary語句調(diào)用這些包待讳。

library(dplyr)
library(tidytext)
library(tidyr)
library(ggplot2)

好了芒澜,萬事俱備仰剿。我們需要把一句句的文本拆成單詞,這樣才能和情緒詞典里的單詞做匹配痴晦,從而分析單詞的情緒屬性南吮。

在R里面,可以采用Tidy Text方式來做阅酪。執(zhí)行的語句是unnest_token旨袒,我們把原先的句子拆分成為單詞。

tidy_script <- script %>%
  unnest_tokens(word, text)
head(tidy_script)
##     line     word
## 1      1    first
## 1.1    1    scene
## 1.2    1    shows
## 1.3    1      the
## 1.4    1 location
## 1.5    1       of

這里原先的行號依然被保留术辐。我們可以看到每一個詞來自于哪一行砚尽,這有利于下面我們對行甚至段落單位進(jìn)行分析。

我們調(diào)用加拿大國家研究委員會發(fā)布的情緒詞典辉词。這個詞典在tidytext包里面內(nèi)置了必孤,就叫做nrc

tidy_script %>%
  inner_join(get_sentiments("nrc")) %>%
  arrange(line) %>%
  head(10)

我們只顯示前10行的內(nèi)容:

## Joining, by = "word"

##    line         word    sentiment
## 1     1         rock     positive
## 2     1    ancestral        trust
## 3     1        giant         fear
## 4     1 representing anticipation
## 5     1        stark     negative
## 6     1        stark        trust
## 7     1        stark     negative
## 8     1        stark        trust
## 9     4    dangerous         fear
## 10    4    dangerous     negative

可以看到瑞躺,有的詞對應(yīng)某一種情緒屬性敷搪,有的詞同時(shí)對應(yīng)多種情緒屬性。注意nrc包里面不僅有情緒幢哨,而且還有情感(正向和負(fù)向)赡勘。

我們對單詞的情緒已經(jīng)清楚了。下面我們來綜合判斷每一行的不同情感分別含有幾個詞捞镰。

tidy_script %>%
  inner_join(get_sentiments("nrc")) %>%
  count(line, sentiment) %>%
  arrange(line) %>%
  head(10)

還是只顯示結(jié)果的前10行闸与。

## Joining, by = "word"

## # A tibble: 10 x 3
##     line    sentiment     n
##    <int>        <chr> <int>
##  1     1 anticipation     1
##  2     1         fear     1
##  3     1     negative     2
##  4     1     positive     1
##  5     1        trust     3
##  6     4         fear     1
##  7     4     negative     1
##  8     5     positive     1
##  9     5        trust     1
## 10     6     positive     1

以第1行為例,包含“期待”的詞有1個岸售,包含“恐懼”的有1個践樱,包含“信任”的有3個。

如果我們以1行為單位分析情感變化凸丸,粒度過細(xì)拷邢。鑒于整個劇本包含了幾百行文字,我們以5行作為一個基礎(chǔ)單位屎慢,來進(jìn)行分析瞭稼。

這里我們使用index來把原先的行號處理一下,分成段落腻惠。%/%代表整除符號弛姜,這樣0-4行就成為了第一段落,5-9行成為第二段落妖枚,以此類推廷臼。

tidy_script %>%
  inner_join(get_sentiments("nrc")) %>%
  count(line, sentiment) %>%
  mutate(index = line %/% 5) %>%
  arrange(index) %>%
  head(10)
## Joining, by = "word"

## # A tibble: 10 x 4
##     line    sentiment     n index
##    <int>        <chr> <int> <dbl>
##  1     1 anticipation     1     0
##  2     1         fear     1     0
##  3     1     negative     2     0
##  4     1     positive     1     0
##  5     1        trust     3     0
##  6     4         fear     1     0
##  7     4     negative     1     0
##  8     5     positive     1     1
##  9     5        trust     1     1
## 10     6     positive     1     1

可以看出,第一段包含的情感還真是很豐富。

只是如果讓我們把結(jié)果表格從頭讀到尾荠商,那也真夠難受的寂恬。我們還是用可視化的方法,把圖繪制出來吧莱没。

繪圖我們采用ggplot包初肉。這個包我們在《 如何用Python做輿情時(shí)間序列可視化?
》一文中介紹過饰躲,歡迎查閱復(fù)習(xí)牙咏。

我們使用geom_col指令,讓R幫我們繪制柱狀圖嘹裂。對不同的情緒妄壶,我們用不同顏色表示出來。

tidy_script %>%
  inner_join(get_sentiments("nrc")) %>%
  count(line, sentiment) %>%
  mutate(index = line %/% 5) %>%
  ggplot(aes(x=index, y=n, color=sentiment)) %>%
  + geom_col()
## Joining, by = "word"

結(jié)果是豐富多彩的寄狼,可惜看不大清楚丁寄。為了區(qū)別不同情緒,我們調(diào)用facet_wrap函數(shù)泊愧,把不同情緒拆開伊磺,分別繪制。

tidy_script %>%
  inner_join(get_sentiments("nrc")) %>%
  count(line, sentiment) %>%
  mutate(index = line %/% 5) %>%
  ggplot(aes(x=index, y=n, color=sentiment)) %>%
  + geom_col() %>%
  + facet_wrap(~sentiment, ncol=3)
## Joining, by = "word"

嗯删咱,這張圖看著就舒服多了屑埋。

不過這張圖也會給我們造成一些疑惑。按照道理來說痰滋,每一段落的內(nèi)容里摘能,包含單詞數(shù)量大致相當(dāng)。結(jié)尾部分情感分析結(jié)果里面即寡,正向和負(fù)向幾乎同時(shí)上升徊哑,這就讓人很不解袜刷。是這里的幾行太長了聪富,還是出了什么其他的問題呢?

數(shù)據(jù)分析的關(guān)鍵著蟹,就是在這種令人疑惑的地方深挖進(jìn)去墩蔓。

我們不妨來看看,出現(xiàn)最多的正向和負(fù)向情感詞都有哪些萧豆。

先來看看正向的奸披。我們這次不是按照行號,而是按照詞頻來排序涮雷。

tidy_script %>%
  inner_join(get_sentiments("nrc")) %>%
  filter(sentiment == "positive") %>%
  count(word) %>%
  arrange(desc(n)) %>%
  head(10)
## Joining, by = "word"

## # A tibble: 10 x 2
##        word     n
##       <chr> <int>
##  1     lord    13
##  2     good     9
##  3    guard     9
##  4 daughter     8
##  5 shoulder     7
##  6     love     6
##  7     main     6
##  8    quiet     6
##  9    bride     5
## 10     king     5

看到這個詞頻阵面,我們不禁有些失落——看來分析結(jié)果是有問題的。許多詞匯都是名詞,而且在《權(quán)力的游戲》故事中样刷,這些詞根本就沒有明確的情感指向仑扑。例如lord這個詞,劇中的lord有的正直善良置鼻,但也有很多不是什么好人镇饮;king也一樣,雖然Robb和Jon是國王箕母,但別忘了Joffrey也是國王啊储藐。

我們再來看看負(fù)向情感詞匯吧。

tidy_script %>%
  inner_join(get_sentiments("nrc")) %>%
  filter(sentiment == "negative") %>%
  count(word) %>%
  arrange(desc(n)) %>%
  head(10)
## Joining, by = "word"

## # A tibble: 10 x 2
##       word     n
##      <chr> <int>
##  1   stark    16
##  2     pig    14
##  3    lord    13
##  4    worm    12
##  5    kill    11
##  6   black     9
##  7  dagger     8
##  8    shot     8
##  9 killing     7
## 10  afraid     4

看了這個結(jié)果嘶是,就更令人沮喪不已了——同樣的一個lord钙勃,竟然既被當(dāng)成了正向,又被當(dāng)成了負(fù)向詞匯俊啼。詞典標(biāo)注者太不負(fù)責(zé)任了吧肺缕!

別著急。出現(xiàn)這樣的情況授帕,是因?yàn)槲覀冏龇治鰰r(shí)少了一個重要步驟——處理停用詞同木。對于每一個具體場景,我們都需要使用停用詞表跛十,把那些可能干擾分析結(jié)果的詞扔出去彤路。

tidytext提供了默認(rèn)的停用詞表。我們先拿來試試看芥映。這里使用的語句是anti_join洲尊,就可以把停用詞先去除,再進(jìn)行情緒詞表連接奈偏。

我們看看停用詞去除后坞嘀,正向情感詞匯的高頻詞有沒有變化。

tidy_script %>%
  anti_join(stop_words) %>%
  inner_join(get_sentiments("nrc")) %>%
  filter(sentiment == "positive") %>%
  count(word) %>%
  arrange(desc(n)) %>%
  head(10)
## Joining, by = "word"
## Joining, by = "word"

## # A tibble: 10 x 2
##        word     n
##       <chr> <int>
##  1     lord    13
##  2    guard     9
##  3 daughter     8
##  4 shoulder     7
##  5     love     6
##  6     main     6
##  7    quiet     6
##  8    bride     5
##  9     king     5
## 10    music     5

結(jié)果令人失望惊来±錾看來停用詞表里沒有包含我們需要去除的那一堆名詞。

沒關(guān)系裁蚁,我們自己來修訂停用詞表矢渊。使用R中的bind_rows語句,我們就能在基礎(chǔ)的預(yù)置停用詞表基礎(chǔ)上枉证,附加上我們自己的停用詞矮男。

custom_stop_words <- bind_rows(stop_words,
                               data_frame(word = c("stark", "mother", "father", "daughter", "brother", "rock", "ground", "lord", "guard", "shoulder", "king", "main", "grace", "gate", "horse", "eagle", "servent"),
                                          lexicon = c("custom")))

我們加入了一堆名詞和關(guān)系代詞。因?yàn)樗鼈兒颓榫w之間沒有必然的關(guān)聯(lián)室谚。但是名詞還是保留了一些毡鉴。例如“新娘”總該是和好的情感和情緒相連吧崔泵。

用了定制的停用詞表后,我們來看看詞頻的變化猪瞬。

tidy_script %>%
  anti_join(custom_stop_words) %>%
  inner_join(get_sentiments("nrc")) %>%
  filter(sentiment == "positive") %>%
  count(word) %>%
  arrange(desc(n)) %>%
  head(10)
## Joining, by = "word"
## Joining, by = "word"

## # A tibble: 10 x 2
##           word     n
##          <chr> <int>
##  1        love     6
##  2       quiet     6
##  3       bride     5
##  4       music     5
##  5        rest     5
##  6     finally     4
##  7        food     3
##  8     forward     3
##  9        hope     3
## 10 hospitality     3

這次好多了管削,起碼解釋情緒可以自圓其說了。我們再看看那些負(fù)向情感詞匯撑螺。

tidy_script %>%
  anti_join(custom_stop_words) %>%
  inner_join(get_sentiments("nrc")) %>%
  filter(sentiment == "negative") %>%
  count(word) %>%
  arrange(desc(n)) %>%
  head(10)
## Joining, by = "word"
## Joining, by = "word"

## # A tibble: 10 x 2
##       word     n
##      <chr> <int>
##  1     pig    14
##  2    worm    12
##  3    kill    11
##  4   black     9
##  5  dagger     8
##  6    shot     8
##  7 killing     7
##  8  afraid     4
##  9    fear     4
## 10   leave     4

比起之前含思,也有很大進(jìn)步。

做好了基礎(chǔ)的修訂工作甘晤,下面我們來重新作圖吧含潘。我們把停用詞表加進(jìn)去,并且還用filter語句把情感屬性刪除掉了线婚。因?yàn)槲覀兎治龅膶ο笫乔榫w(emotion)遏弱,而不是情感(sentiment)。

tidy_script %>%
  anti_join(custom_stop_words) %>%
  inner_join(get_sentiments("nrc")) %>%
  filter(sentiment != "negative" & sentiment != "positive") %>%
  count(line, sentiment) %>%
  mutate(index = line %/% 5) %>%
  ggplot(aes(x=index, y=n, color=sentiment)) %>%
  + geom_col() %>%
  + facet_wrap(~sentiment, ncol=3)
## Joining, by = "word"
## Joining, by = "word"

這幅圖一下子變得清晰塞弊,也值得琢磨漱逸。

在這一集的結(jié)尾,多種情緒混雜交織——?dú)g快的氣氛陡然下降游沿,期待與信任在波動饰抒,厭惡在不斷上漲,恐懼與悲傷陡然上升诀黍,憤怒突破天際袋坑,交雜著數(shù)次的驚訝……

你可能會納悶兒,情緒怎么可能這么復(fù)雜眯勾?是不是分析又出問題了枣宫?

還真不是,這一集的故事吃环,有個另外的名字也颤,叫做《紅色婚禮》。

收獲

通過本文的學(xué)習(xí)郁轻,希望你已初步掌握了如下技能:

  1. 如何用Python對網(wǎng)絡(luò)摘取的文本做處理翅娶,從中找出正文,并且去掉空行等內(nèi)容范咨;
  2. 如何用數(shù)據(jù)框?qū)?shù)據(jù)進(jìn)行存儲故觅、表示與格式轉(zhuǎn)換厂庇,在Python和R中交換數(shù)據(jù)渠啊;
  3. 如何安裝和使用RStudio環(huán)境,用R Notebook做交互式編程权旷;
  4. 如何利用tidytext方式來處理情感分析與情緒分析替蛉;
  5. 如何設(shè)置自己的停用詞表贯溅;
  6. 如何用ggplot繪制多維度切面圖形。

掌握了這些內(nèi)容后躲查,你是否覺得用這么強(qiáng)大的工具分析個劇本找影視作品它浅,有些大炮轟蚊子的感覺?

討論

除了本文介紹的方法之外镣煮,你還知道哪些方便的情緒分析工具與方法姐霍?在尋找新劇方面,你有什么獨(dú)家心得體悟典唇?有了情緒分析這個利器镊折,你還可以處理哪些有趣的問題?歡迎留言介衔,記錄下你的思考恨胚,分享給大家。我們一起交流討論炎咖。

喜歡請點(diǎn)贊赃泡。還可以微信關(guān)注和置頂我的公眾號“玉樹芝蘭”(nkwangshuyi)

如果你對數(shù)據(jù)科學(xué)感興趣乘盼,不妨閱讀我的系列教程索引貼《如何高效入門數(shù)據(jù)科學(xué)升熊?》,里面還有更多的有趣問題及解法绸栅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僚碎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阴幌,更是在濱河造成了極大的恐慌勺阐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矛双,死亡現(xiàn)場離奇詭異渊抽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)议忽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門懒闷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栈幸,你說我怎么就攤上這事愤估。” “怎么了速址?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵玩焰,是天一觀的道長。 經(jīng)常有香客問我芍锚,道長昔园,這世上最難降的妖魔是什么蔓榄? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮默刚,結(jié)果婚禮上甥郑,老公的妹妹穿的比我還像新娘。我一直安慰自己荤西,他們只是感情好澜搅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邪锌,像睡著了一般店展。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秃流,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天赂蕴,我揣著相機(jī)與錄音,去河邊找鬼舶胀。 笑死概说,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚣伐。 我是一名探鬼主播糖赔,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佛猛,長吁一口氣:“原來是場噩夢啊……” “哼鹃两!你這毒婦竟也來了捏卓?” 一聲冷哼從身側(cè)響起涩维,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墙歪,沒想到半個月后乌企,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晌该,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拱层,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年弥臼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片根灯。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡径缅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烙肺,到底是詐尸還是另有隱情纳猪,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布桃笙,位于F島的核電站氏堤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怎栽。R本人自食惡果不足惜丽猬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熏瞄。 院中可真熱鬧脚祟,春花似錦、人聲如沸强饮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邮丰。三九已至行您,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剪廉,已是汗流浹背娃循。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斗蒋,地道東北人捌斧。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像泉沾,于是被迫代替她去往敵國和親捞蚂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容