小說網絡結構圖(graph)的比較分析:神鵰、天龍、三國、紅樓

2021-01-18 愚者暗於成事智者見於未萌

該圖整體的集聚係數也升為 0.272,表明次要人物之間的互動佔全書篇幅的比例有所上升。畢竟,真實世界是非常去中心化的,三國的故事即使經過文學改造,仍然保留了部分現實的特點。

網絡圖中則體現得更為明顯:前面三張圖中明顯的星型模式消失了。雖然仍有比較次要的外圍人物,但中間再也不是一個人、一個軸心,而是賈寶玉、賈母、王熙鳳、王夫人、薛寶釵、林黛玉構成的六邊形這個結構,成為了中心。在這個六邊形內外,可以看到密密麻麻的二元關係。一般文學意義上主角和配角的區分,在《紅樓夢》中大大地淡化了。

但筆者跑這個程序,倒不是為了文學鑑賞,而是像開頭提到的上篇日誌中那樣,是為了優化對國際關係的研究和表述。我們對國際經濟和國際政治的理解,能不能像《紅樓夢》那樣,在腦海中天然呈現一個高度集聚的網絡的樣子,時時想到多方之間的相互影響,而不是動不動就歸結為兩國之間的博弈?複雜網絡範式的傳播,我覺得仍然任重而道遠。

---title: "Relation Network"subtitle: ''author: ""date: "`r Sys.Date()`"output:  html_document:    df_print: paged    fig_caption: yes    theme: united    highlight: haddock    number_sections: yes    toc: yes    toc_depth: 3    toc_float:      collapsed: true      smooth_scroll: FALSE  rticles::ctex:    df_print: default    fig_caption: yes    number_sections: yes    toc: yes    toc_depth: '2'  word_document:    fig_caption: yes    toc: yes    toc_depth: 3    reference_docx:   pdf_document:    toc: yes    toc_depth: '2'documentclass: ctexartclassoption: hyperref,---
```{r setup, include = FALSE}knitr::opts_chunk$set( fig.width = 7, fig.asp = 0.618, out.width = "90%", fig.align = "center", fig.path = 'Figures/', fig.show = "hold", warn = 1, warning = FALSE, message = FALSE, echo = TRUE, comment = '', collapse = F, cache = T, cache.comments = F, autodep = TRUE )library('pacman')p_load(tidyverse, lubridate, data.table, ggthemes, showtext, gridExtra, igraph, ggraph, tidygraph, lmtest, plm, orcutt, stats, forecast, zoo, rvest, httr, xml2, sqldf, DT, jiebaR, wordcloud2, webshot, htmlwidgets, tidytext )options(sqldf.driver = "SQLite") pdf.options(family = "GB1")font_add('YaHei','simhei.ttf')windowsFonts(H = windowsFont("Microsoft YaHei"))showtext_auto(enable = TRUE)mytheme <- theme_economist_white() + theme(text = element_text(family = 'YaHei'), plot.title = element_text(face = 'bold', size = 14), plot.subtitle = element_text(size = 12), plot.caption = element_text(hjust = 0, size = 10, margin = margin(2,0,0,0,'pt')), plot.margin = margin(12,10,12,0,'pt'), legend.position = 'top', legend.justification = 'left', legend.margin = margin(4,0,0,0,'pt'), legend.key.size = unit(1,'lines'), legend.title = element_text(size = 12), legend.text = element_text(size = 10, margin = margin(0,0,0,0,'pt')), axis.text = element_text(size = 10, margin = margin(2,0,2,0,'pt')), axis.ticks.length = unit(-4,'pt') )theme_bar <- theme_economist_white() + theme(text = element_text(family = 'YaHei'), plot.title = element_text(face = 'bold', size = 14), plot.subtitle = element_text(size = 12), plot.caption = element_text(hjust = 0, size = 10, margin = margin(0,0,0,0,'pt')), plot.margin = margin(12,0,12,10,'pt'), legend.position = 'top', legend.justification = 'left', legend.margin = margin(4,0,0,0,'pt'), legend.key.size = unit(0.7,'lines'), legend.title = element_blank(), legend.text = element_text(size = 10, margin = margin(0,8,0,4,'pt')), axis.text = element_text(size = 8), axis.ticks.length = unit(0,'pt') )mytheme_graph <- theme_void() + theme(text = element_text(family = 'YaHei'), plot.title = element_text(face = 'bold', size = 14), plot.subtitle = element_text(size = 10), plot.caption = element_text(hjust = 0, size = 6, margin = margin(8,0,0,0,'pt')), plot.margin = margin(12,0,12,10,'pt'), legend.position = 'right', legend.justification = 'left', legend.margin = margin(4,0,0,0,'pt'), legend.key.size = unit(0.7,'lines'), legend.title = element_text(size = 7, margin = margin(0,8,0,4,'pt')), legend.text = element_text(size = 6, margin = margin(0,8,0,4,'pt')) )```


```{r}total <- readLines('天龍八部.txt', encoding = "UTF-8") %>% tibble(text = .) %>% filter(text != '') %>% mutate(paragraph = row_number())```
```{r}roles <- readLines('天龍八部人物名單.txt', encoding = "ANSI") roles1 <- paste0('(', gsub(' ', ')|(', roles), ')') roles_name <- roles %>% str_sub(1,3) %>% str_trim()name_match <- tibble(name_unique = roles_name, name_all = roles1)replace_name <- function(string){ temp <- string for (i in 1:length(roles_name)) { temp <- str_replace_all(temp, roles1[i], roles_name[i]) } return(temp)}result <- map_chr(total %>% pull(text), replace_name) replace_over <- total %>% mutate(text = result) ```



```{r, fig.showtext = TRUE}count_name <- function(name){ replace_over %>% mutate(count = str_count(text, name)) %>% summarise(n = sum(count)) %>% pull(n) %>% return()}count_n <- function(name){ replace_over %>% mutate(count = str_detect(text, name)) %>% summarise(n = sum(count)) %>% pull(n) %>% return()}count_words <- function(name){ replace_over %>% mutate(count = str_detect(text, name)) %>% filter(count == TRUE) %>% pull(text) %>% str_c(collapse = '\n') %>% str_length() %>% return()}role_freq <- tibble(name = roles_name, count = map(roles_name, count_name) %>% unlist(), n_para = map(roles_name, count_n) %>% unlist(), n_words = map(roles_name, count_words) %>% unlist())p1 <- role_freq %>% mutate(name = reorder(name, n_words)) %>% ggplot(aes(x = name, y = n_words)) + geom_bar(stat = 'identity', position = 'dodge', width = 0.7, fill = '#016392') + scale_y_continuous(position = "right") + labs(title = '人物出現段落的總字數:', subtitle = '', x = '', y = '') + theme_barp1ggsave(file = "./Figures/frequency.pdf", plot = p1, width = 8, height = 5)```
```{r, fig.showtext = TRUE}intimate <- function(string1, string2){ temp <- replace_over %>% mutate(count1 = str_detect(text, string1), count2 = str_detect(text, string2)) %>% filter(count1 == T & count2 == T) ifelse(length(temp$text) == 0, 0, temp %>% pull(text) %>% str_c(collapse = '\n') %>% str_length()) %>% return()} n <- length(roles_name)intimate_matrix <- diag(rep(0, n))colnames(intimate_matrix) <- roles_namerownames(intimate_matrix) <- roles_namefor (i in 1:n) { for (j in 1:n) { intimate_matrix[i,j] <- intimate(roles_name[i], roles_name[j]) } intimate_matrix[i, i] <- 0}most_intimate <- max(intimate_matrix)library(pheatmap)pheatmap(intimate_matrix, cluster_cols = F, cluster_rows = F)intimate('段譽','王語嫣')intimate('虛竹','童姥')```
```{r, fig.showtext = TRUE}relations <- tibble(from = 'A', to = 'B', intimate = 0)for (i in 1:(n - 1)) { for (j in (i + 1):n) { temp <- tibble(from = roles_name[i], to = roles_name[j], intimate = intimate_matrix[i,j]) relations <- bind_rows(relations, temp) }}graph <- graph_from_data_frame(relations %>% filter(intimate > most_intimate/10), vertices = role_freq, directed = F)cfg <- cluster_fast_greedy(graph)cfggraph_tg <- as_tbl_graph(graph) %>% mutate(deg = centrality_betweenness(normalized = T)) %>% mutate(group=group_infomap()) title_tg <- str_c('人物關係網絡圖,集聚係數為 ', transitivity(graph_tg) %>% round(5))title_tgp3 <- ggraph(graph_tg, layout = 'kk') + geom_edge_fan(aes(edge_width = intimate), color="lightblue", end_cap = circle(0.05, 'inches'), show.legend=T) + geom_node_point(aes(size = deg, fill = factor(group)), shape = 21) + geom_node_text(aes(label = name), size = 2.5, vjust = 1, hjust = 1) + scale_color_discrete() + scale_edge_width(range = c(0.1,2)) + guides(fill=F) + labs(title = title_tg, subtitle = '', size = '標準化的中介中心度', edge_width = '共同出現的段落字數', caption = '') + mytheme_graphp3ggsave(file = "./Figures/Network2.pdf", plot = p3, width = 8, height = 5) transitivity(graph_tg) degree(graph_tg,normalized = T) closeness(graph_tg, normalized = T) betweenness(graph_tg, normalized = T) ```

相關焦點

  • 圖神經網絡 Graph Neural Network (GNN)
    傳統的神經網絡比較適合用於歐式空間的數據,而圖神經網絡 GNN 可以把神經網絡用在圖結構 (Graph) 中。圖神經網絡的種類很多,包括圖卷積網絡 GCN、圖注意力網絡 GAT、圖自編碼器 GAE 等。本文介紹最早被提出的圖神經網絡 (Graph Neural Network) GNN。
  • 金庸《天龍八部》與《水滸傳》結構相比較
    若論結構之複雜,層次之奧妙,非蕞爾小樓可比也。自來長篇佳構,非胸中有大丘壑者莫能為也,譬如《紅樓》中之大觀園,賈政引眾清客飽覽秀色,每至一處便有一處之精妙。金庸秉如椽巨筆,揮運如風,撰成《天龍八部》一書,其於結構處既有細膩手法,又不乏宏觀氣魄。金庸平生所學,中西並包,其於小說結構上乃有突出體現。勾連諸種因素,匯合一宏大氣場,乃《天龍八部》結構上之最大特色。
  • 少不看水滸,老不看三國,男不看西遊,女不看紅樓 有沒有道理呢
    四大名著家喻戶曉,關於四大名著,有這樣一個說法,廣為流傳,叫「少不看水滸,老不看三國」,後來人們也繼續補充了一句,叫「男不看西遊,女不看水滸」,合起來便是「少不看水滸,老不看三國,男不看西遊,女不看紅樓。」,那麼,這句話有沒有道理呢?
  • 網絡分析概述之網絡基礎簡介
    從本節開始介紹網絡分析。本篇暫且對網絡概念作個初步簡介,隨後的章節再一一展示怎樣分析數據。根據白魚同學目前比較熟悉的領域,今後的章節主要以「微生物互作網絡」、「基因共表達網絡」為例作闡述。註:該「網絡」是指數學中分析數據的一種方法,不是「網際網路」,也不是「神經網絡」之類的。
  • 圖論Graph theory
    在計算機科學中,圖被用來表示通信網絡、數據組織、計算設備、計算流程等。例如,一個網站的連結結構可以用一個有向圖表示,其中頂點表示網頁,有向邊表示從一個頁面到另一個頁面的連結。類似的方法可以應用到社交媒體、旅遊、生物、計算機晶片設計和許多其他領域。因此,開發處理圖形的算法是計算機科學的主要興趣所在。圖的變換通常是形式化的,並由圖形重寫系統表示。
  • 從圖(Graph)到圖卷積(Graph Convolution):漫談圖神經網絡 (二)
    在從圖(Graph)到圖卷積(Graph Convolution): 漫談圖神經網絡 (一)中,我們簡單介紹了基於循環圖神經網絡的兩種重要模型,在本篇中,我們將著大量筆墨介紹圖卷積神經網絡中的卷積操作。接下來,我們將首先介紹一下圖卷積神經網絡的大概框架,藉此說明它與基於循環的圖神經網絡的區別。
  • 百度安全開源大規模圖資料庫HugeGraph
    近年來百度安全憑著雄厚的技術實力自主研發了全面支持Apache TinkerPop 3框架和Gremlin圖查詢語言的大型分布式圖資料庫HugeGraph,與Neo4j、TitanDB等傳統圖資料庫相比有很多獨特的優勢。今天我們很高興的宣布HugeGraph開源,更好的為網絡安全、機器學習等社區服務。
  • 圖網絡未來幾何?12位學者寄望2021大爆發
    在最近的一次ICML研討會的演講中,我將這種趨勢稱為「關係結構發現」。 GNNs 允許學習一個狀態轉換圖(右側),來解釋複雜的多粒子系統(左側)。 通常我們設計的圖神經網絡,是為了在數據集提供的一個固定(或隨時間演進)結構上去傳遞消息。
  • 金庸的小說《天龍八部》是啥意思?何謂「天龍八部」?
    無論有沒有讀過金庸的小說,你都一定聽說過「天龍八部」。其實,除了金庸的「飛雪連天射白鹿」之外,中國古代的很多小說中都提到過「天龍八部」。比如,《西遊記》裡的白龍馬最後就被如來佛祖封為「八部天龍廣力菩薩」。那麼,天龍八部到底是個什麼東西呢?武俠大師金庸是根據佛經內容來寫的。
  • 初識分布式圖資料庫 Nebula Graph 2.0 Query Engine
    本文主要介紹 Query 層的整體結構,並通過一條 nGQL 語句來介紹其通過 Query 層的四個主要模塊的流程,由於 Nebula Graph 2.0 仍處於開發中,版本變化比較頻繁,本文主要針對 2.0 的 nebula-graph 倉中 master 分支的 aea5befd179585c510fb83452cb82276a7756529 版本。
  • 作品回顧:金庸小說在內地:從「毒草」到名著
    《天龍八部》  這部小說展現了遼、宋、大理、西夏、吐蕃各國各民族之間的矛盾,場面宏大,波瀾壯闊,人物眾多,是金庸最費精力的兩部小說之一,另一部是《倚天屠龍記》。這部書中金庸首次嘗試使用了三主角,並獲得了巨大成功,開啟了武俠小說這方面的先河,後來古龍的《邊城浪子》也採用了雙主角。
  • GAT 圖注意力網絡 Graph Attention Network
    圖神經網絡 GNN 把深度學習應用到圖結構 (Graph) 中,其中的圖卷積網絡 GCN 可以在 Graph 上進行卷積操作。但是 GCN 存在一些缺陷:依賴拉普拉斯矩陣,不能直接用於有向圖;模型訓練依賴於整個圖結構,不能用於動態圖;卷積的時候沒辦法為鄰居節點分配不同的權重。
  • 使用Keras構建具有自定義結構和層次圖卷積神經網絡
    來源:DeepHub IMBA本文約3600字,建議閱讀5分鐘本文為你介紹了如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)。如何構建具有自定義結構和層次的神經網絡:Keras中的圖卷積神經網絡(GCNN)在生活中的某個時刻我們會發現,在Tensorflow Keras中預先定義的層已經不夠了!我們想要更多的層!我們想要建立一個具有創造性結構的自定義神經網絡!幸運的是,通過定義自定義層和模型,我們可以在Keras中輕鬆地執行此任務。
  • 為什麼深度模型在 CV 領域好使,但用在圖網絡上就這麼難呢?
    作者給出了幾個觀點:   01圖的結構 現有工作告訴我們,在分子圖、點雲和網格(圖像也可以看作是一種網格狀的圖)上使用深度圖網絡是有效的,這些圖跟我們常用以評估圖神經網絡效果的引用網絡(例如:Cora、PubMed 或 CoauthorCS)等有何不同呢?
  • Bioinf | 生物醫學網絡中的圖嵌入:方法、應用與評價
    實驗結果表明,最新的圖嵌入方法取得了可喜的結果,並在未來的生物醫學圖分析中值得更多的關注。最近,研究人員專注於設計各種高階數據鄰接矩陣以保留圖結構,並提出各種基於MF的圖嵌入學習方法。例如,GraRep考慮了網絡的高階鄰近性,並設計了k階概率矩陣分解。
  • 知深行遠:關於圖神經網絡層數加深的探索
    圖 (Graph) 由結點和連邊組成,我們把應用於圖上的神經網絡算法稱為圖神經網絡 (Graph Neural Network, 簡稱GNN)。受啟發於卷積神經網絡 (Convolutional Neural Network, 簡稱CNN) 和圖嵌入算法,GNN以圖作為輸入,根據「相鄰的結點具有相似性」這一假設,對圖中結點採用聚合其周圍結點信息作為自身的表徵的方式,將圖中結點映射為連續向量空間中的向量,使得結構上相近的結點在嵌入空間中有相似的向量表示。
  • 北大、微軟亞洲研究院:高效的大規模圖神經網絡計算
    GNN(圖神經網絡)代表了一種新興的計算模型,這自然地產生了對在大型graph上應用神經網絡模型的需求。但是,由於GNN固有的複雜性,這些模型超出了現有深度學習框架的設計範圍。此外,這些模型不容易在並行硬體(如GPU)上有效地加速。
  • 圖神經網絡的表達能力,究竟有多強大?
    作者 | Mr Bear編輯 | 叢 末近年來,隨著圖神經網絡在各個領域的火熱應用,越來越多的學者試圖從圖論的角度對圖神經網絡的表達能力進行理論分析,並基於這些理論分析開發出了性能強大的模型。然而,在實際應用中,這些在理論上非常強大的模型的性能往往會受到計算複雜度等因素的限制。
  • 通俗易懂:圖卷積神經網絡入門詳解
    但是現實生活中,其實有很多很多不規則的數據結構,典型的就是圖結構,或稱拓撲結構,如社交網絡、化學分子結構、知識圖譜等等;即使是語言,實際上其內部也是複雜的樹形結構,也是一種圖結構;而像圖片,在做目標識別的時候,我們關注的實際上只是二維圖片上的部分關鍵點,這些點組成的也是一個圖的結構。
  • 一文學會網絡分析——Co-occurrence網絡圖在R中的實現
    撰文:陳亮 中科院微生物所責編:劉永鑫 中科院遺傳發育所網絡分析背景知識近年來,隨著計算機技術的發展,網絡科學研究在社會網絡方面的分析方法已經成熟