博客總目錄:http://www.cnblogs.com/weibaar/p/4507801.html
目錄:
零:寫在前面的一些廢話
一、R眼看琅琊榜的基本原理
1、導入數據
2、篩選數據
3、多條件篩選對話
4、導出數據
二、R眼看琅琊榜的基礎分析
1、快速對文本分章節
2、快速定位人物出場章節
3、快速定位人物互動章節
三、總結
零:寫在前面的一些廢話
最近電視劇琅琊榜非常之火,除了主角以外,里面很多配角都非常出彩。
原著琅琊榜也是非常精彩的。有些電視劇里沒明說的解析,在小說里會明文說出來,這讓智商不夠的樓主終於看懂了電視劇里各個對話的含義。
不過小說有些太長,作者非常喜歡鋪設伏筆以及涉及多個人物,如果想只看一個人或者一個團體的活時,非常困難。
然后樓主偶然間想到了R語言的文本挖掘項目,試着用readLines讀入了小說全文,一個新的世界打開了。
綜上,本文以一個偽程序員+偽數據分析的角度,講一下用R語言讀琅琊榜的一些故事。
這個也可以用於以后做一些讀書筆記和線索整理。
不在博客園上閱讀時才會看到的,這篇博文歸http://www.cnblogs.com/weibaar 所有
僅保證在博客園博客上的排版干凈利索還有代碼塊與圖片正確顯示,他站請保留作者信息尊重版權啊
一、R眼看琅琊榜的基本原理
導入數據/篩選數據/導出txt或html文件
#readLines里面放的是txt地址 text<-readLines("D:/琅琊榜/LangYaBang.txt") text<-text[nchar(text)!=0] #預覽一下: text[40:50]
可以看到,用readLines讀入txt后,R會幫我們把小說文檔按空行分段,生成長達20000多的文本向量,而這個就是我們用來做文本整理的主要材料。
2、篩選數據
接下來,我們就可以抓取一些數據來看了。
在寫作領域,有一本書叫做《你的劇本遜斃了》,第43個技巧里有提到,要塑造好人物,寫好任務的對白時,在A-B對話時,要拼了老命去想A的對話,直到在腦子里聽到他的聲音,抓住了他的說話特點,再去想B的對話。
而在寫作時,保證每一個人的講話都帶着他獨有的特點,在塑造人物上非常重要。
所以,要分析琅琊榜小說人物特點,我們可以先試試把人物對話摘出來。
簡單分析小說文本,我們會發現在琅琊榜小說里,對話基本都是用雙引號“”括起來的。我們只需要用grep,就能很輕易把這些對話提取出來,代碼示例如下:
#方法1:用grepl出TRUE/FALSE,再與直接儲存的text對照提取 conversation<-text[grepl("“|”",text)] #方法2:用grep直接看對話效果 conversation_temp<-grep("“|”",text,value=TRUE) #取個樣本看看 conversation[sample(1:length(conversation),14)]
查看一下數據。
恩,用雙引號確實把我們需要的對話都摘了出來,存在了conversation變量里面。
3、多條件篩選對話
現在,我們增加一些條件,再繼續篩選一下。譬如說,我們看了電視劇,對能讓飛流避之不及的藺晨非常感興趣,想看看飛流與藺晨的互動,我們可以用以下代碼:
feiliu_linchen<-text[grepl("飛流",text)&grepl("藺晨|閣主|藺大公子",text)] #隨機選幾個樣本看看 feiliu_linchen[sample(1:length(feiliu_linchen),20)]
R現在自動幫我們把段落里又出現藺晨,又出現飛流的片段抓了出來。
一個很有意思的點是,在小說前期藺晨沒有出現時,梅長蘇已經多次提到說,飛流,你想不想藺晨哥哥啊,飛流,你忘了藺晨哥哥怎么教你的啊,等等等等。雖然飛流已經很聽蘇哥哥的話了,但是從這些對話里我們會發現在教育飛流方面,藺晨哥哥還是出現得非常頻繁的。就更別提等小說后期藺晨到金陵以后,他們每天雞飛狗跳,你追我趕的生活了。
那么,我們可以繼續按照各種邏輯,把我們想看的都找出來。
簡單來說就是,grepl(“條件”,要篩選的字符串向量)。
”條件“這里,我們可以用“ | ” 把兩個有OR關系的中文字符分隔開,譬如grep(“靖王|景琰|水牛”,text,value=TRUE),會把段落里含有靖王或者景琰或者水牛這樣的字樣全部摘選出來。
但是一個條件只能有OR的關系。如果要並列查找,則需寫多個grepl,譬如
text[grepl(“靖王殿下”,text) & grepl(“梅長蘇”,text)]
如果在grepl前加一個”!”號,則表示去除所有有某個字段的段落,舉例如:
text[(!grepl(“靖王”,text) )&grepl(“景琰”,text) & grepl(“梅長蘇”,text) & grepl(““|””,text)]
這一段,只會給你找出,是對話(看最后一個grepl條件),有”景琰“和”梅長蘇“出現,但不出現“靖王”的段落。
具體的用法可以搜索網上各種“R語言 grepl 正則表達式”等方法。
下面提供一些代碼示例。
#示例1: 飛流與靖王殿下的所有互動 text[grepl("飛流",text)&grepl("靖王|景琰",text)] #示例2:飛流與梅長蘇的互動對話 conversation[!grepl("梅長蘇",conversation) & grepl("飛流",conversation)] #示例3:梅長蘇提及靖王殿下時的對話 text[grepl("靖王殿下",text) & grepl("梅長蘇",text)& grepl("“|”",text)]
綜上,依據這些,我們就可以把想要的文段摘選出來一一欣賞了。
4、導出數據
但是摘選出來還不夠,有時候我們會希望可以把它導出到本地盤,像txt或者html那樣保存起來。
R提供了write函數,可以導出字符串為txt文件,或者直接生成html。
請看示例:
景琰_梅長蘇<-text[(!grepl("靖王",text) )&grepl("景琰",text) & grepl("梅長蘇",text) & grepl("“|”",text)] #導出為txt文件: write(景琰_梅長蘇,"D:/琅琊榜/景琰&梅長蘇.text") #接下來,導出html。 #需要把段落與段落之間加上html分行代碼,否則導出來的文字會密密麻麻擠在一起 html_1<-paste(景琰_梅長蘇,collapse = "<br></br>") write(html_1,"D:/琅琊榜/景琰&梅長蘇.html")
這里我存在了D盤琅琊榜文件夾里,運行代碼看看,文件已經放在D盤里了~~
這樣的結果,就可以簡單分享給其他人看。
二、R眼看琅琊榜的基礎分析
1、快速對文本分章節
做完上面這一步,我們來聊聊劇情。
劇情是由人物而帶動的。雖然我們看的小說,往往都有章節的內容,但有時候只看標題,真的很難確定這個章節的內容。
我們先對琅琊榜小說按章節分拆。涉及一些其他函數,大家直接看代碼吧
#grep,用.代替任何一個字符 章節名<-(grep("第.卷",text,value=TRUE)) 章節分段<-c(grep("第.卷",text),length(text)+1) #創建一個文件夾,放分好段的章節 dir.create("D:/琅琊榜/章節分段",recursive=TRUE) #接下來寫一個循環,會把所有章節儲存在一個list里,同時生成相對應的txt文件 分段章節<-list() for (i in 1:(length(章節分段)-1)){ data<-text[章節分段[i]:章節分段[i+1]-1] 分段章節[[i]]<-data names(分段章節)[i]<-章節名[i] write(data,paste0("D:/琅琊榜/章節分段/",i,"-",章節名[i],".txt")) }
打開文件夾看看,所有章節都已經儲存起來了。
然后我們也得到了一個叫做“分段章節”的list,里面儲存了所有的分段數據。
2、快速定位人物出場章節
好了,源數據處理好,我們可以開始做一下分析了。
這里我們主要用到的是R里面的sapply函數,還有前文所介紹的grepl
關鍵代碼如下:
sapply(分段章節,function(e) sum(grepl(“梅長蘇”,e)))
#首先,我們讀入想要的人物數據。這里可以用前文提到的"|"來指代其他稱呼。 角色<-c("梅長蘇|梅宗主|蘇哲|蘇先生|江左梅郎","靖王|景琰|水牛","林殊|小殊", "飛流","藺晨|閣主","蒙摯|蒙大統領","霓凰|郡主","景睿", "豫津|浴巾","穆青|穆小王爺","梁王|皇帝|陛下","靜妃|靜嬪|靜貴妃", "言侯|言闕","夏冬|冬姐","甄平","黎綱","譽王|景桓","赤焰","列戰英|戰英","大梁","謝玉|謝侯","滑族","夏江","公主") #其次,創建用來儲存角色信息的文件夾 dir.create("D:/琅琊榜/角色",recursive=TRUE) #然后寫一個循環,用我們剛剛提到的函數,去寫一段代碼,把統計數據寫入角色統計data.frame來。 角色統計<-data.frame(卷名=names(分段章節)) #循環開始 for (a in 1:length(角色)){ 角色統計[,a+1]<-sapply(分段章節,function(e) sum(grepl(角色[a],e))) names(角色統計)[a+1]<-角色[a] #計算好章節個數后,導出相應文件為HTML output<-text[grepl(角色[a],text)] output<-paste(output,collapse = "<br></br>") filename<-(strsplit(角色[a],"\\|"))[[1]][1] write(output,paste0("D:/琅琊榜/角色/",filename,".html")) } write.csv(角色統計,"D:/琅琊榜/角色統計.csv")
好了,運行整段代碼,在D:/琅琊榜/角色/這里,我們就能看到把小說拆分成若干個小片段的HTML
這樣子,想要回顧個別人物的情節很方便,然后如果想要看哪個章節出現該人物對話最多,打開琅琊榜目錄下的角色統計,就都有了
舉個例子,看下圖吧,靖王殿下第一次出場在第16章,然后第7章應該是飛流的主場。
這樣子按照出現段落數來找相應的章節,回顧起來就更加方便了!
我們還可以對它做一個聯合,譬如說選出“梅長蘇”與“靖王”出場次數都很多的章節,如17章,正好就是“麒麟擇主”。
各個聯合着來看,想看什么人物對決,只要看這張表,也就可以了。
有了這樣規整的一張數據表,就是想做一些數據分析啊,畫一些人物圖啊等等,都非常方便。
3、快速定位人物互動章節
下面我們改一改上面的代碼,專門來看那些有交鋒的關系。請看代碼示例:
dir.create("D:/琅琊榜/互動with梅長蘇/",recursive=TRUE) 互動with梅長蘇<-data.frame(卷名=names(分段章節)) for (a in 2:length(角色)){ 互動with梅長蘇[,a]<-sapply(分段章節, function(e) sum( grepl(角色[a],e) & grepl(角色[1],e))) names(互動with梅長蘇)[a]<-角色[a] output<-text[grepl(角色[a],text)& grepl(角色[1],text)] output<-paste(output,collapse = "<br></br>") filename<-(strsplit(角色[a],"\\|"))[[1]][1] write(output,paste0("D:/琅琊榜/互動with梅長蘇/梅長蘇with",filename,".html")) } write.csv(互動with梅長蘇,"D:/琅琊榜/互動with梅長蘇.csv")
三、總結
不在博客園上閱讀時才會看到的,這篇博文歸http://www.cnblogs.com/weibaar 所有
僅保證在博客園博客上的排版干凈利索還有代碼塊與圖片正確顯示,他站請保留作者信息尊重版權啊
用到的R的知識點主要包括:
1、選取數據的方法:grepl/grep
2、統計數據的方法:sapply
3、多條件篩選: | 與&的選擇,還有!grepl
4、導出:write輸出txt/html的方法
5、循環:for循環
這個方法,不僅僅可以用於琅琊榜,也可以同理推廣到其他各種小說文獻,甚至用來做課本里的專業術語搜索。
適合理清思路,梳理紋路。
而這一切,只需要我們會寫一點點的小R,然后腦洞稍微開大一點,就都可以做到啦。
至於更深層次的,譬如研究人員喜歡做的熱詞分析,文本挖掘,甚至寫作習慣分析,只要有思路,也是可以繼續往下做下去的。
不過注意的是,在中文分詞方面,似乎R這方面的包沒有python來得痛快。如果真的涉及到分詞啊什么的,各位可以每種都去看看。
但是對於小說來說,我們抓住人物和場景去厘清線索,也大概就夠了。
不說了,看劇去~~~
最后提供一下壓縮包給那些不想玩代碼的人……
http://vdisk.weibo.com/s/o_UNVWLckhL