Python、R對小說進行文本挖掘和層次聚類可視化分析案例

原文連接:http://tecdat.cn/?p=5673

原文出處:拓端數據部落公衆號

《第_二十二_條軍規》是美國做家約瑟夫·海勒創做的長篇小說,該小說以第二次世界大戰爲背景,經過對駐紮在地中海一個名叫皮亞諾扎島(此島爲做者所虛構)上的美國空軍飛行大隊所發生的一系列事件的描寫,揭示了一個非理性的、無秩序的、夢魘似的荒誕世界。我喜歡整本書中語言的創造性使用和荒謬人物的互動。本文對該小說進行文本挖掘和可視化。正則表達式

數據集

該文有大約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。

相關文章
相關標籤/搜索