AI 知识图谱辅助分析实体关系自动发现与关联分析你的数据里藏着多少关系没被用到用知识图谱把表与表的关联、用户与商品的互动变成一张网AI 帮你自动发现隐藏的关联模式。一、关系型数据库的局限表里只有字段没有关系我们天天跟数据库打交道但其实数据库只告诉了你一件事这张表有什么字段。它从来不告诉你这个字段跟那张表有什么关系这个用户跟那个商品之间有什么隐含关联举个实际例子一张用户订单表里有user_id、product_id、order_time、amount。你能通过 JOIN 查到某个用户买了哪些商品但你想知道买过 A 类商品的用户通常还会买哪些 B 类商品这就不再是简单的 SQL 能回答的了——这需要实体关系分析。知识图谱就是把这个关系网络显式地构建出来。每个实体用户、商品、渠道、地区是一个节点实体之间的关系购买、浏览、属于、相似于是边。有了这样的关系网络你就能做很多传统 SQL 做不到的分析。二、从结构化数据构建知识图谱可能有人觉得知识图谱很高大上需要 Neo4j、图数据库、一堆专家标注……其实对于数据分析场景我们用 NetworkX 就能在本地搭一个轻量级的图谱。import networkx as nx import pandas as pd from itertools import combinations class BehaviorGraphBuilder: 从用户行为数据构建知识图谱 把每一条行为记录转成图中的边 用户 → 商品浏览/购买/收藏 用户 → 品类感兴趣 用户 → 地区位于 商品 → 品类属于 def __init__(self): # 用 MultiDiGraph 支持多重关系同一对实体间可以有多种关系 self.graph nx.MultiDiGraph() def add_user_behavior(self, behavior_df): 添加用户行为边 数据格式user_id, item_id, category, action_type, timestamp for _, row in behavior_df.iterrows(): uid fuser_{row[user_id]} iid fitem_{row[item_id]} cid fcategory_{row[category]} # 用户 → 商品行为边 self.graph.add_edge(uid, iid, relationrow[action_type], # browse / cart / order timestamprow[timestamp] ) # 商品 → 品类归属边 self.graph.add_edge(iid, cid, relationbelongs_to) # 用户 → 品类间接兴趣边如果不存在才加 if not self.graph.has_edge(uid, cid): self.graph.add_edge(uid, cid, relationinterested_in) def build_co_purchase_graph(self, order_df): 构建共现图同一订单中的商品被认为是协同购买关系 这是推荐系统的基础被一起买的商品可能互补或相似 # 按订单分组每个订单里有哪些商品 order_items order_df.groupby(order_id)[item_id].apply(list) for items in order_items: # 对同一订单中的每对商品建立共现边 for item_a, item_b in combinations(set(items), 2): iid_a fitem_{item_a} iid_b fitem_{item_b} # 如果边已存在权重加 1否则新建 if self.graph.has_edge(iid_a, iid_b): self.graph[iid_a][iid_b][0][weight] 1 else: self.graph.add_edge(iid_a, iid_b, relationco_purchased, weight1 ) def get_graph_stats(self): 输出图的基本统计信息 return { nodes: self.graph.number_of_nodes(), edges: self.graph.number_of_edges(), density: nx.density(self.graph), # 图密度 components: nx.number_weakly_connected_components(self.graph) } # 使用示例 # builder BehaviorGraphBuilder() # 添加用户行为 # builder.add_user_behavior(user_behavior_df) # 构建共现图 # builder.build_co_purchase_graph(order_df) # 查看统计 # stats builder.get_graph_stats() # print(f节点数: {stats[nodes]:,}, 边数: {stats[edges]:,})三、图算法做关联分析PageRank 社区发现有了图就能用图算法做很多有趣的分析。1. PageRank发现核心节点PageRank 本来是用来给网页打分的用在商品图上可以找出最核心的商品——被很多热门商品关联的商品权重高def analyze_central_items(graph, top_k20): 用 PageRank 找出最核心的商品 核心商品的特征被很多其他商品指向共同购买 而且指向它的商品本身也重要 # 提取商品子图只保留 item_ 开头的节点 item_nodes [n for n in graph.nodes() if n.startswith(item_)] item_subgraph graph.subgraph(item_nodes) # PageRank 计算每个节点的重要性 # alpha0.85 是 PageRank 的标准阻尼系数 pagerank nx.pagerank(item_subgraph, alpha0.85) # 按分数排序取 top_k top_items sorted(pagerank.items(), keylambda x: x[1], reverseTrue)[:top_k] for item_id, score in top_items: print(f{item_id}: PageRank {score:.6f}) return top_items为什么 PageRank 的阻尼系数默认是 0.85这个数不是拍脑袋定的背后是图分析里局部重要性和全局传播的权衡。α0.85 意味着每次随机游走有 85% 的概率沿着边传递权重15% 的概率随机跳到任意节点。α1100% 沿边走会导致权重困在死胡同里只能进不能出的节点抢走所有权重α0 则所有节点得分一样完全随机跳失去了图结构的意义。0.85 是 Google 创始人 Brin 和 Page 在 1998 年原始论文里经过大量实验定的值——既能保证权重沿着关系传播到该去的地方又不让权重被小圈子锁死在局部子图里。在商品共现图的场景中这个 15% 的随机跳转为冷门但高质量的商品提供了被发现的机会——否则 PageRank 只会在超级爆款之间循环长尾商品永远排不上。2. 社区发现自动识别用户兴趣群Louvain 算法可以把图中的节点自动分成若干社区——同一个社区内的节点连接紧密社区之间的连接稀疏。用在商品图上就是自动发现品类之外的隐含分类import community as community_louvain # python-louvain 库 def discover_item_communities(graph): 用 Louvain 社区发现算法找出商品的隐含分类 这个分类不是人定义的比如服装电子 而是从用户行为中自然形成的比如通勤套装宅家神器 # 转换为无向图社区发现用无向图 undirected graph.to_undirected() # Louvain 算法返回 {节点: 社区编号} partition community_louvain.best_partition(undirected) # 统计每个社区的商品数 from collections import Counter community_sizes Counter(partition.values()) print(f发现 {len(community_sizes)} 个社区:) for comm_id, size in community_sizes.most_common(): # 取社区中前 5 个节点作为代表 members [n for n, c in partition.items() if c comm_id][:5] print(f 社区 {comm_id}: {size} 个节点, 代表: {members}) return partition为什么数据场景用 Louvain 而非其他社区发现算法如谱聚类、Label PropagationLouvain 的核心优势是它优化的是模块度Modularity衡量的是图被分割成社区后社区内部连接的密度是否显著高于随机连接的期望值。这个定义的优点有两个第一它不是 pre-define K 个社区的K-Means 的痛点而是数据驱动自然划分如果图本身只配拆 3 个社区Louvain 不会硬拆出 5 个第二它对大规模稀疏图特别友好时间复杂度 O(N log N)这正是用户行为图的特点——几十万用户、几百万条边、图稀疏任何用户买过的商品只占商品总数的不到 0.1%。相比之下谱聚类需要算拉普拉斯矩阵特征值分解在 10 万节点以上就撑不住了。Label Propagation 虽然也快但它对初始随机标签敏感运行 10 次可能出 10 种不同的社区划分结果无法复现——这在数据分析场景是致命缺陷。3. 最短路径分析四、AI 增强让 LLM 解读图分析结果图算法输出的还是数字PageRank 分数、社区编号要让业务方看得懂需要 AI 来做翻译。def interpret_community(graph, partition, community_id, item_features_df): 用 LLM 解读一个社区的含义 社区只是一堆 item_id但 LLM 能从中提炼出 这个社区是母婴用品还是数码配件 # 找出该社区的所有成员 members [n for n, c in partition.items() if c community_id] # 取核心成员PageRank 高的前 10 个 pagerank nx.pagerank(graph.subgraph(members), alpha0.85) core_members sorted(pagerank.items(), keylambda x: x[1], reverseTrue)[:10] # 获取这些商品的特征信息 item_features item_features_df[ item_features_df[item_id].isin( [m.replace(item_, ) for m, _ in core_members] ) ] # 构造 prompt 给 LLM item_list item_features[[item_name, category, price_range]].to_string() prompt f以下是数据库中自动发现的一个商品群体用户频繁共同购买的商品。 核心商品列表 {item_list} 请分析这个商品群体的共同特征并用以下结构输出 1. 群体命名4-8字如通勤数码套装 2. 群体特征描述50字以内 3. 适合的营销场景30字以内 # response call_llm_api(prompt) return prompt这样从原始行为数据 → 知识图谱构建 → 图算法分析 → AI 语义解读就形成了一个完整的自动化分析链路。 踩坑提醒NetworkX 的 PageRank 对方向敏感共现图要先用无向图— 商品共现关系是相互的A 和 B 一起买意味着 B 和 A 一起买但MultiDiGraph是有向图。如果不先用.to_undirected()转换PageRank 会按有向图算结果会大幅偏向出度高的节点被很多边指向的节点与你的共现语义完全不符。Louvain 的分辨率极限问题— Louvain 在非常大的图中百万节点以上有一个盲区它倾向于合并小社区导致规模小于 √(总边数) 的社区被吞掉。如果你的业务场景关心小圈子比如喜欢手工皮具的高单价用户只占 0.1%Louvain 可能把这批人归到大社区里让你找不到这批高价值用户。解决方案是用 Leiden 算法Louvain 的改进版或先用 Top PageRank 过滤核心节点再聚类。LLM 解读社区时要把商品名去重— 如果社区里有 100 个商品但 LLM 的 token 窗口只能塞下 20 个选哪 20 个决定了 LLM 输出的可信度。只送 PageRank 最高的 20 个可能会让 LLM 误以为这是一个高价商品群体因为 PageRank 高的往往是热门爆款而热门≠高价值。更好的做法是分层采样——高 PageRank 10 个 中 PageRank 5 个 低 PageRank长尾5 个让 LLM 看到一个社区的全貌而不是头部。五、总结知识图谱对于数据分析师来说不是要替代 SQL而是在 SQL 做不到的关系分析领域提供新的武器。三个典型应用场景协同推荐用共现图发现买了 A 的人也买了 B用户分群用社区发现找到行为相似的用户群体比 K-Means 更能体现关系影响传播用 PageRank 最短路径分析找到影响范围最大的用户或商品落地的门槛其实不高。小规模数据百万级实体关系用 NetworkX 就够大规模千万级以上再考虑 Neo4j 或 JanusGraph。别被知识图谱四个字吓到本质上它就是把 JOIN 关系变成图结构用图算法替代子查询。从分析的角度图的威力在于你不需要预先知道要找什么关系图算法会帮你发现关系。本文由朱大喜原创十篇文章的系列到这里就结束啦感谢阅读欢迎关注我后续还有更多数据分析与 AI 的实战分享~