前段時間比較辛苦,連著幾周下來,終於該來的都來了,發燒、頭疼加嗜睡,一樣都不少,一天下來清醒的時候也不多,更新了個代碼,還有點時間突然好想看個小說。手機上隨便打開一個,半小時一下就沒了,賊啊,這書好看,網上搜索發現是《近身兵王》(秦淵),好評如潮,決定看完,但目錄顯示這是個連載,已經一千多章,這得猴年馬月才能看完呢,我可只有這感冒的幾天空擋…看來只能快速選著看了,但怎麼來定位自己想要的章節呢,記起之前R會議上一個美女尾巴AR介紹了用R讀小說,這次也來試試看.
數據導入 小說網上下載近身兵王.txt
下載放於項目目錄下。
語言環境設置# 中文環境Sys.setlocale("LC_CTYPE", "Chinese")
#> [1] "Chinese (Simplified)_People's Republic of China.936"
小說讀入library(readr)library(stringr)library(dplyr, quietly = TRUE, warn.conflicts = FALSE)JSBW <- read_lines("近身兵王.txt")
head(JSBW, n = 10)
#> [1] "<---->"#> [2] " 溫馨提示:您所閱讀的小說來自【久久小說網】 www.99txt.cc" #> [3] " 本網站沒有彈窗可放心閱讀" #> [4] "<---->"#> [5] "" #> [6] " 《近身兵王》"#> [7] " 連載閱讀地址:http://www.99txt.cc/7902/" #> [8] "" #> [9] "" #> [10] " 第1章 來世再做兄弟!"
小說章節目錄查看章節目錄,並按目錄分割為小文件。
Content <- str_subset(JSBW, "第\\d*章") %>% str_trim(side = "both")
# 總章節數
ContentNum <- length(Content)ContentNum
#> [1] 1612
# 前10章目錄:
head(Content, n = 10)
#> [1] "第1章 來世再做兄弟!" "第2章 色狼,你的手對哪摸呢?"#> [3] "第3章 英雄救美" "第4章 一個打七個" #> [5] "第5章 魯雪晴的決定" "第6章 你想包養老娘?" #> [7] "第7章 痛打惡少" "第8章 跟我回家" #> [9] "第9章 撩人的小姨" "第10章 裸睡的悲劇"
write_lines(Content, "Content.txt")# 按章節分割 目錄保存本地
if (!dir.exists("章節目錄")) { dir.create("章節目錄")}ContentLocation <- which(str_detect(JSBW, "第\\d*章"))temp <- c(ContentLocation, length(JSBW))for (i in seq_len(ContentNum)) { data <- JSBW[temp[i]:(temp[i + 1] - 1)]
write_lines(data, paste0("章節目錄/", str_pad(i, width = 4, side = "left", pad = "0"), "-", Content[i], ".txt"))}
head(list.files("章節目錄"), n = 10)
#> [1] "0001-第1章 來世再做兄弟!.txt" #> [2] "0002-第2章 色狼,你的手對哪摸呢?.txt"#> [3] "0003-第3章 英雄救美.txt" #> [4] "0004-第4章 一個打七個.txt" #> [5] "0005-第5章 魯雪晴的決定.txt" #> [6] "0006-第6章 你想包養老娘?.txt" #> [7] "0007-第7章 痛打惡少.txt" #> [8] "0008-第8章 跟我回家.txt" #> [9] "0009-第9章 撩人的小姨.txt" #> [10] "0010-第10章 裸睡的悲劇.txt"
人物段落查看某個人物出現的所有段落,以冷豔美女「易紅月」為例:
Yhy <- str_subset(JSBW, "易紅月") # 易紅月的段落
head(Yhy) # 預覽易紅月的段落
#> [1] " 少女恍然,她能夠分辨得出秦淵的茫然是否在做作,旋即輕聲說道:「我叫易紅月。」" #> [2] " 「易紅月,很好聽的名字。」秦淵毫不吝惜自己的讚美說道。" #> [3] " 「謝謝!」易紅月的聲音優雅平靜,說完再次轉身面對著初升的朝陽。"#> [4] " 秦淵發現,此刻的他居然不會說話了,就這麼默默地站在易紅月的背後,欣賞著這難得的畫面。"#> [5] " 秦淵不說話,易紅月也不說話。" #> [6] " 良久,易紅月突然出聲,又相似自言自語,「你喜歡看日出麼?」"
# 目錄保存本地if (!dir.exists("人物章節")) { dir.create("人物章節")}write_lines(Yhy, "人物章節/易紅月.txt")
人物互動同一個段落裡面同時出現兩個人的姓名, 以「易紅月」和「秦淵」為例,
Yhy.Qy <- str_subset(JSBW, "(易紅月.*秦淵)|(秦淵.*易紅月)")
head(Yhy.Qy)
#> [1] " 少女恍然,她能夠分辨得出秦淵的茫然是否在做作,旋即輕聲說道:「我叫易紅月。」" #> [2] " 「易紅月,很好聽的名字。」秦淵毫不吝惜自己的讚美說道。"#> [3] " 秦淵發現,此刻的他居然不會說話了,就這麼默默地站在易紅月的背後,欣賞著這難得的畫面。"#> [4] " 秦淵不說話,易紅月也不說話。"#> [5] " 秦淵回神,旋即將目光從易紅月身上轉移,看向那萬丈金光的太陽。"#> [6] " 「為什麼?」易紅月再次轉過身,看著秦淵時,眼神微微有些愕然。"
# 目錄保存本地if (!dir.exists("人物互動")) { dir.create("人物互動")}write_lines(Yhy.Qy, "人物互動/易紅月-秦淵.txt")
人物出場場次人物眾多,我只關心美女呵呵
meiNv <- c("蘇傾月|曼陀羅", "葉雲曼|小姨", "雪晴", "可卿", "李欣", "易紅月", "安倚橋", "納蘭明珠|茗珠", "左瑤", "左璃", "柳夢心", "何伊人", "洛櫻")zhangJie.list <- list.files("章節目錄")zhangJie.path <- paste0("章節目錄/", zhangJie.list)zhangJie.all <- lapply(zhangJie.path, read_lines)zhangJie.sum <- list(章節 = zhangJie.list)for (i in seq_along(meiNv)) { zhangJie.sum[[i + 1]] <- sapply(zhangJie.all, function(str) {
sum(str_count(str, meiNv[i])) })}
names(zhangJie.sum)[-1] <- meiNv
library(DT)
# 生成人物-場次圖,篩選排序找出關鍵章節
datatable(as.data.frame(zhangJie.sum), options = list(paging = TRUE, pageLength = 5,searching = TRUE), rownames = FALSE)
Show 5102550100 entries
Search:
章節蘇傾月.曼陀羅葉雲曼.小姨雪晴可卿李欣易紅月安倚橋納蘭明珠.茗珠左瑤左璃柳夢心何伊人洛櫻
Showing 1 to 5 of 1,612 entries
Previous12345…323Next
# 本地保存write.csv(as.data.frame(zhangJie.sum), "meiNv.csv", fileEncoding = "GB2312", row.names = FALSE)
人物關係網看看男豬腳與美女之間的互動關係強弱:
# 看看秦淵與各個美女之間的關係圖
nameAll <- c(meiNv, "秦淵|兇獸")
# 互動關係
num <- length(nameAll)relation <- matrix(data = rep(0, num^2), nrow = num)
colnames(relation) <- nameAll
rownames(relation) <- nameAllfor (i in 1:(num - 1)) { for (j in (i + 1):num) { relation[i, j] <- sum(str_detect(JSBW, paste0("((", nameAll[[i]], ").*(", nameAll[[j]], "))|((", nameAll[[j]], ").*(", nameAll[[i]], "))"))) relation[j, i] <- relation[i, j] }}
library(igraph, quietly = TRUE, warn.conflicts = FALSE)
library(ggthemes)g <- graph_from_adjacency_matrix(relation, mode = "upper", diag = FALSE, weighted = TRUE)
E(g)$width <- E(g)$weight/500
E(g)$color <- tableau_seq_gradient_pal("Red")(E(g)$weight/max(relation))
# E(g)$curved <- 0.2
temp <- rowSums(relation)node.weight <- temp/max(temp)
V(g)$size <- node.weight * 20
V(g)$label.dist <- 0.5
V(g)$label.cex <- 0.7
# V(g)$color <- tableau_seq_gradient_pal('Red')(node.weight)
plot(g, layout = layout.circle, vertex.shape = "none")
寫在後面的話
搗鼓了半天時間,大概了解的人物角色、場次與互動關係,選看了感興趣章節,前面部分很不錯,後面的劇情超出了所能理解的層次,於是中止,半天時間,到此結束。
明天生龍活虎!