《第_二十二_條軍規》是美國做家約瑟夫·海勒創做的長篇小說,該小說以第二次世界大戰爲背景,經過對駐紮在地中海一個名叫皮亞諾扎島(此島爲做者所虛構)上的美國空軍飛行大隊所發生的一系列事件的描寫,揭示了一個非理性的、無秩序的、夢魘似的荒誕世界。我喜歡整本書中語言的創造性使用和荒謬人物的互動。本文對該小說進行文本挖掘和可視化。正則表達式
該文有大約175,000個單詞,分爲42章。我在網上找到了這本書的原始文本版本。算法
我使用正則表達式和簡單字符串匹配的組合在Python中解析文本。ide
我shiny在R中以交互方式可視化這些數據集。ui
geo<- catch22\[( geo$Time > chapters\[1\]) & ( geo$Time < (chapters\[2\] + 1)),\] paths_sub <- paths\[( paths$time > chapters\[1\]) & ( paths$time < (chapters\[2\] + 1)),\] # 繪圖 p <- ggplot() + borders("world", colour="black", fill="lightyellow") + ylab(NULL) + xlab(NULL) + # 僅在有條件的狀況下嘗試繪製位置和路徑 if (nrow( geo_sub) != 0) { p + geom\_point(data= geo\_sub, aes(x = Lon, y = Lat), size=3, colour='red') + geom\_point(data= paths\_sub\[1,\], aes(x = lon, y = lat), size=3, colour='red') + geom\_path(data= paths\_sub, aes(x = lon, y = lat, alpha=alpha), size=.7,
可視化映射了整本書中提到的地中海周圍位置。 spa
ggplot(catch22, aes(x=Chapter, y=Character, colour=cols)) + geom_point(size=size, shape='|', alpha=0.8) + scale\_x\_continuous(limits=c(chapters\[1\],(chapters\[2\] + 1)), expand=c(0,0), breaks=(1:42)+0.5, labels=labs) + ylab(NULL) + xlab('Chapter') + theme(axis.text.x = element_text(colour = "black", angle = 45, hjust = 1, vjust=1.03), axis.text.y = element_text(colour = "black"), axis.title.x = element_text(vjust=5), plot.title = element_text(vjust=1)) +
該圖基本上表明瞭書中提到不一樣人物的序列。 code
我將數據繪製爲標準散點圖,章節爲x軸(由於它與時間類似),人物爲離散y軸。orm
ggplot(coloca, aes(x=Character, y=variable, alpha=alpha)) + geom_tile(aes(fill=factor(cluster)), colour='white') + ylab(NULL) + xlab(NULL) + theme(axis.text.x = element_text(colour = "black", angle = 45, hjust = 1, vjust=1.03), axis.text.y = element_text(colour = "black"), axis.ticks.y = element_blank(), axis.ticks.x = element_blank(), panel.grid.minor = element_line(colour = "white", size = 1), panel.grid.major = element_blank()) + scale\_fill\_manual(values = cols, guide = FALSE) + scale\_alpha\_continuous(guide = FALSE)
用於構建此可視化的數據與前一箇中使用的數據徹底相同,但須要進行大量的轉換。 排序
聚類爲此圖添加了另外一個維度。在整本書上應用層次聚類,以嘗試在角色中找到社羣。使用AGNES算法對字符進行聚類。對不一樣聚類方案進行人工檢查發現最優聚類,由於更頻繁出現的角色占主導地位最少。這是六個簇的樹形圖:事件
ag <- agnes(cat2\[,-1\], method="complete", stand=F) # 從樹狀圖中切出聚類 cluster <- cutree(ag, k=clusters)
應該注意,聚類是在整個文本上執行的,而不是章節。按聚類排序會將角色帶入緊密的社區,讓觀衆也能夠看到角色之間的某些交互。element
ggplot( pos2, aes(Chapter, normed, colour=Word, fill=Word)) + scale\_color\_brewer(type='qual', palette='Set1', guide = FALSE) + scale\_fill\_brewer(type='qual', palette='Set1') + scale\_y\_continuous(limits=c(0,y_max), expand=c(0,0)) + ylab('Relative Word Frequency') + xlab('Chapter') +
堆疊條形圖更好地顯示了單詞所在的章節。
我在這個過程當中學到了不少東西,不管是在使用方面,仍是在shiny。