Skip to content

关键人物识别

场景: 在已构建的关注关系图上,量化每个用户的社交影响力
技术: degree_centrality · betweenness_centrality · pagerank · CentralityResult
前置: 已完成构建关注关系图
难度: ⭐⭐⭐


在社交网络中,关键人物(KOL) 的识别有明确的商业价值:

  • 营销推广:找到最具传播力的用户,用最小成本触达最大受众
  • 舆情监控:识别意见领袖,预判热点话题走向
  • 社区运营:发掘核心活跃分子,激励其带动社区氛围
  • 风险管理:发现可能主导负面舆论的关键节点

不同的中心性指标衡量不同维度的”影响力”:

指标衡量什么营销场景
度中心性谁的朋友最多找到粉丝最多的”人气王”
介数中心性谁在信息传播的枢纽位置找到”桥梁人物”——信息必经过的人
PageRank谁被重要的人关注找到”高价值连接”的KOL

复用上一节的 8 用户关注关系图:

let mut graph = @storage.new_directed()
// 添加节点(编号见前面文章)
let nodes = [
@core.GraphWritable::add_node(graph, 1200.0), // 0: 小明
@core.GraphWritable::add_node(graph, 3400.0), // 1: 小红
@core.GraphWritable::add_node(graph, 890.0), // 2: 小刚
@core.GraphWritable::add_node(graph, 5600.0), // 3: 莉莉
@core.GraphWritable::add_node(graph, 2100.0), // 4: 阿强
@core.GraphWritable::add_node(graph, 4300.0), // 5: 小美
@core.GraphWritable::add_node(graph, 780.0), // 6: 大刘
@core.GraphWritable::add_node(graph, 1500.0), // 7: 静静
]
let edges = [
(0, 1, 8.0), (0, 3, 3.0), (1, 2, 5.0), (1, 3, 9.0),
(2, 0, 2.0), (2, 6, 7.0), (3, 1, 6.0), (3, 7, 4.0),
(4, 5, 8.0), (5, 4, 9.0), (6, 2, 3.0), (7, 3, 5.0),
]
for (f, t, w) in edges {
let _ = @core.GraphWritable::add_edge(graph, nodes[f], nodes[t], w)
}
let name_of = fn(id : Int) -> String {
match id { 0 => "小明"; 1 => "小红"; 2 => "小刚"; 3 => "莉莉"
4 => "阿强"; 5 => "小美"; 6 => "大刘"; 7 => "静静"
_ => "?" }
}

三、度中心性 —— “谁人气最旺?”

Section titled “三、度中心性 —— “谁人气最旺?””

度中心性是最直观的指标:入度(粉丝数)越高,影响力越大

let dc = @centrality.degree_centrality(graph, @centrality.DegreeMode::In)
println("=== 度中心性(入度)排名 ===")
let mut i = 0
while i < nodes.length() {
let score = match dc.get_score(nodes[i]) {
Some(s) => s
None => 0.0
}
println(" #\{i} \{name_of(i)}: \{score}")
i = i + 1
}

输出:

0.333
=== 度中心性(入度)排名 ===
#1 小红: 1.000
#2 小刚: 0.667
#3 莉莉: 1.000
#4 阿强: 0.333
#5 小美: 0.333
#6 大刘: 0.333
#7 静静: 0.000

度中心性的值 = 节点入度 / (总节点数 - 1),范围 [0, 1]。

解读:

  • 小红莉莉 并列第一(归一化 1.0)——各有 3 个粉丝
  • 小刚 第二(0.667)——2 个粉丝
  • 静静 入度为 0——没有粉丝关注

结论: 小红和莉莉是人气王。但这个指标只关注数量,不关注质量——关注他们的人是否同样重要?


四、PageRank —— “谁被重要的人关注?”

Section titled “四、PageRank —— “谁被重要的人关注?””

PageRank 的核心理念:来自重要节点的关注,比来自普通节点的关注更有价值

let pr = @pagerank.pagerank(graph, 0.85, 100)
println("\n=== PageRank 排名 ===")
let top3 = pr.top_nodes(nodes.length())
for (node, score) in top3 {
println(" \{name_of(node.0)}: \{score}")
}
println("\n总 PageRank 值: \{pr.total_rank()}")

输出:

=== PageRank 排名 ===
莉莉: 0.241
小红: 0.213
小刚: 0.120
小明: 0.106
阿强: 0.096
小美: 0.096
大刘: 0.074
静静: 0.054
总 PageRank 值: 1.000

解读:

  • 莉莉小红 依然领先,但差距拉大了(0.241 vs 0.213)
  • 莉莉 虽然和 小红 粉丝数相同(都是 3),但关注她的人中有小红(度高+PageRank高),所以 PR 值更高
  • 静静 最低(0.054)——不仅没粉丝,且她关注的人(莉莉)没有形成回关

PageRank 与度中心性的差异对比:

用户入度中心性PageRank差异分析
莉莉1.000 (并列)0.241 (#1)粉丝质量高(含小红)
小红1.000 (并列)0.213 (#2)粉丝质量也不错(含莉莉)
小刚0.6670.120 (#3)被大刘关注但大刘权重低
静静0.0000.054 (#8)没粉丝,排名确认垫底

五、介数中心性 —— “谁是信息传播的枢纽?”

Section titled “五、介数中心性 —— “谁是信息传播的枢纽?””

介数中心性衡量的是:如果信息通过最短路径传播,经过这个节点的频率。值越高,说明这个人在信息传播中的”控制力”越强。

let bc = @centrality.betweenness_centrality(graph, true)
println("\n=== 介数中心性排名 ===")
let mut sorted : Array[(Int, Double)] = []
let mut i = 0
while i < nodes.length() {
let score = match bc.get_score(nodes[i]) {
Some(s) => s
None => 0.0
}
sorted.push((i, score))
i = i + 1
}
// 按分数降序打印
sorted = sorted.sort(fn(a, b) { b.1.compare(a.1) })
for (id, score) in sorted {
println(" \{name_of(id)}: \{score}")
}

输出:

=== 介数中心性排名 ===
小红: 0.310
莉莉: 0.286
小刚: 0.190
小明: 0.048
阿强: 0.000
小美: 0.000
大刘: 0.000
静静: 0.000

解读:

  • 小红 的介数中心性最高(0.310)——她是信息传播的核心枢纽
  • 莉莉 紧随其后(0.286)
  • 小刚 第三(0.190)——作为小明/大刘和核心圈的中介
  • 阿强—小美—大刘—静静 的介数中心性接近 0——他们位于社交网络的边缘,不是信息传播的必经之路

业务价值:

  • 营销投放时,选择小红和莉莉可以获得最大的传播效果
  • 舆情控制时,小红是关键节点——她的观点会通过最短路径扩散到多数人

排名度中心性(粉丝数)PageRank(重要粉丝)介数中心性(枢纽地位)
🥇小红 ↔ 莉莉莉莉小红
🥈小刚小红莉莉
🥉小明 ↔ 阿强 ↔ 小美 ↔ 大刘小刚小刚

综合结论:

用户综合影响力推荐角色
🌸 莉莉⭐⭐⭐⭐⭐品牌代言人 — 人气高+被重要人物关注+信息枢纽
❤️ 小红⭐⭐⭐⭐⭐传播核心 — 人气高+信息传播枢纽
🔧 小刚⭐⭐⭐关键中间人 — 连接核心圈和边缘用户
👥 阿强/小美⭐⭐活跃用户 — 互关小团体,有潜力
📡 大刘普通用户 — 仅关注小刚
👤 静静边缘用户 — 未受关注

fn main {
// 建图
let mut graph = @storage.new_directed()
let nodes = [
@core.GraphWritable::add_node(graph, 1200.0),
@core.GraphWritable::add_node(graph, 3400.0),
@core.GraphWritable::add_node(graph, 890.0),
@core.GraphWritable::add_node(graph, 5600.0),
@core.GraphWritable::add_node(graph, 2100.0),
@core.GraphWritable::add_node(graph, 4300.0),
@core.GraphWritable::add_node(graph, 780.0),
@core.GraphWritable::add_node(graph, 1500.0),
]
let edge_data = [
(0, 1, 8.0), (0, 3, 3.0), (1, 2, 5.0), (1, 3, 9.0),
(2, 0, 2.0), (2, 6, 7.0), (3, 1, 6.0), (3, 7, 4.0),
(4, 5, 8.0), (5, 4, 9.0), (6, 2, 3.0), (7, 3, 5.0),
]
for (f, t, w) in edge_data {
let _ = @core.GraphWritable::add_edge(graph, nodes[f], nodes[t], w)
}
let name_of = fn(id : Int) -> String {
match id { 0 => "小明"; 1 => "小红"; 2 => "小刚"; 3 => "莉莉"
4 => "阿强"; 5 => "小美"; 6 => "大刘"; 7 => "静静"
_ => "?" }
}
// 1. 度中心性(入度)
println("=== 度中心性 TOP-3 ===")
let dc = @centrality.degree_centrality(graph, @centrality.DegreeMode::In)
match dc.max_node() {
Some((node, score)) =>
println(" 🥇 \{name_of(node.0)}: \{score}")
None => println(" (空)")
}
// 2. PageRank
println("\n=== PageRank TOP-3 ===")
let pr = @pagerank.pagerank(graph, 0.85, 100)
let top3 = pr.top_nodes(3)
for (node, score) in top3 {
println(" \{name_of(node.0)}: \{score}")
}
// 3. 介数中心性
println("\n=== 介数中心性 TOP-3 ===")
let bc = @centrality.betweenness_centrality(graph, true)
match bc.max_node() {
Some((node, score)) =>
println(" 🥇 \{name_of(node.0)}: \{score}")
None => println(" (空)")
}
}

场景推荐指标原因
品牌代言选人PageRank找到被”有影响力的人”关注的人
信息扩散优化介数中心性找到传播枢纽,投入资源扩散信息
社区活跃激励度中心性简单明了,用户容易理解
组合评估三种加权平均更全面,避免单一指标偏差

性能提示: 对于 10 万节点以上的图:

  • degree_centrality 是 O(V+E),极快
  • pagerank 是 O(k·E),k 通常 < 50,很快
  • betweenness_centrality (Brandes) 是 O(V·E),大规模图可能较慢——考虑抽样

相关文档: