如何从带年份边属性的文章-关键词二分图生成时序关键词网络投影?
问题描述
需要构建科学论文关键词的时序(快照)网络,要求每个关键词关联对应的发表年份。当前的文章-关键词二分图中,年份是边属性,希望将该二分图投影为关键词网络,让年份成为关键词的属性——具体通过区分同一关键词的不同发表年份来实现。尝试使用igraph的bipartite_projection函数,但该函数无法保留边属性,相关R代码如下:
df <- cbind.data.frame(c(1:6), c(2022,2023,2022,2015,2024,2025), c("Environment", "Sustai", "Sustai", "Sustai","Doughnu","Environment"), c("Plastic","Domesti…", "Sustain…", "Doughnu…", "Environment","Plastic")) colnames(df) <- c("id","year","key1","key2") df <- pivot_longer(df, cols = starts_with("key"), values_to = "key") df <- df[-3] df <- df[,c(1,3,2)] g <- graph_from_data_frame(df, directed=F) V(g)$type <- bipartite_mapping(g)$type key <- bipartite_projection(g, which="true",multiplicity=T) E(key)$weight
解决方案
核心思路是在投影前,把关键词+年份合并成新的节点名称,让同一关键词的不同发表年份被视为独立节点,自然携带年份属性,之后再投影即可得到带时序信息的关键词网络。
修改后的R代码如下:
library(igraph) library(tidyr) # 原始数据处理 df <- cbind.data.frame(c(1:6), c(2022,2023,2022,2015,2024,2025), c("Environment", "Sustai", "Sustai", "Sustai","Doughnu","Environment"), c("Plastic","Domesti…", "Sustain…", "Doughnu…", "Environment","Plastic")) colnames(df) <- c("id","year","key1","key2") df <- pivot_longer(df, cols = starts_with("key"), values_to = "key") df <- df[, -3] df <- df[, c(1,3,2)] # 关键步骤:将关键词与年份合并为新节点名,同时保留年份属性 df$key_with_year <- paste(df$key, df$year, sep = "_") # 构建二分图,使用带年份的关键词作为节点 g <- graph_from_data_frame(df[, c("id", "key_with_year")], directed = F) V(g)$type <- bipartite_mapping(g)$type # 投影得到关键词网络(带年份区分) key_net <- bipartite_projection(g, which = "true", multiplicity = T) # 给关键词节点提取年份和原始关键词属性 V(key_net)$year <- sapply(V(key_net)$name, function(x) strsplit(x, "_")[[1]][2]) V(key_net)$original_key <- sapply(V(key_net)$name, function(x) strsplit(x, "_")[[1]][1]) # 查看结果 print(V(key_net)$name) print(V(key_net)$year) print(E(key_net)$weight)
说明
- 通过
paste(df$key, df$year, sep = "_")生成带年份的节点名,解决了同一关键词不同年份的区分问题,同时天然携带了年份信息。 - 投影后可通过字符串拆分,将年份和原始关键词重新提取为节点属性,方便后续的时序分析或节点筛选。
- 最终得到的关键词网络中,边的权重代表对应年份下,两个关键词共同出现在同一篇文章的次数。
内容的提问来源于stack exchange,提问作者Sebastián
相关产品推荐
相关产品推荐

