GNN应用:网站结构建模(一)
文章目录
- 一、说明
- 二、模型介绍
- 三、GNN 简介
- 四、什么是 GNNExplainer?
- 五、生成网络
- 5.1 可视的初始图
- 5.2 节点属性
- 5.3 弧属性
- 六、目标模拟
下文连接:https://blog.csdn.net/gongdiwudu/article/details/154698597?spm=1011.2124.3001.6209
词汇解释:
SEO:Search engine optimization 搜索引擎优化
GNN:Graph Neural Networks 图神经网络
一、说明
在在一个以互联性为主的数字世界,网页之间的链接不仅仅是超链接,而是定义网站架构、可导航性和信息价值的复杂结构。每个网站都可以表示为一个图表:页面是节点,页面之间的链接是边缘。 分析该网络不仅可以让您了解网站的逻辑结构,还可以优化其在 SEO、可用性和转化方面的性能。
图神经网络 (GNN) 提供了一种现代且结构化的方法来对这些关系进行建模。
这使得它们非常适合分析复杂的网络网络,在这些网络中,页面的含义不仅取决于其各个属性,还取决于它与网站其余部分的链接方式。
二、模型介绍
在本文中,我们将展示如何构建模拟真实网络结构的合成图。节点代表不同类型的页面(主页、博客、产品、登陆等),而弧表示放置在页面不同区域(页眉、正文、页脚)的内部或外部链接。将为每个节点和边缘分配反映 SEO 字段中常见属性的属性:例如,PageRank、页面平均停留时间、DOM 中的链接位置和锚文本。
目标是训练 GNN 对战略链接进行分类,这些链接可以最大限度地提高点击概率或与排名最相关。此任务可以表述为二元分类(战略性与非战略性)或回归(点击率预测)。
一旦 GNN 被训练出来,我们将使用 GNNExplainer 来解释它的决策。GNNExplainer 是一种可解释性工具,可让您了解哪些节点属性和子图对分类影响最大。这在 SEO 环境中特别有用,在这些环境中,自动化决策需要以非技术利益相关者可以理解的方式证明其合理性。例如,我们可以看到哪些链接模式或页面类型和锚文本的哪些组合使链接特别具有战略意义。
这种方法的兴趣不仅仅是理论上的:任何从事 SEO、信息架构、用户体验或漏斗优化工作的人都会发现一个有用的模型,它不仅可以预测,还可以解释。网站的结构会严重影响用户行为和搜索引擎排名:使用 GNN 来建模和解释这些动态是迈向更加科学和透明的 SEO 的一步。
总之,通过阅读本文,您将了解到:
- 如何将网站结构建模为图表,并在 Python 中构建具有真实 SEO 属性(例如,PageRank、锚文本、DOM 中的位置等)
- 如何训练图神经网络 (GNN) 对战略链接进行分类,从而最大限度地提高点击率或改善 SEO
- 如何使用 GNNExplainer 解释模型的决策,使输出即使是非技术利益相关者也能理解
- 如何应用GNNs来分析和优化网站导航、转化和信息结构
三、GNN 简介
图神经网络 (GNN) 是一系列深度学习模型,旨在处理图等结构化数据。
与对矢量输入或矩阵(图像、文本、表格)进行作的经典神经网络不同,GNN 利用图的拓扑结构,将来自节点的信息与其邻居的信息相结合。这使得它们非常适合分析社交网络、分子系统、知识图谱,以及像我们的例子一样的网站结构。
在网站的上下文中,每个页面都可以表示为一个节点,每个超链接都可以表示为一个有向边。页面类型、模拟 PageRank 或平均停留时间等属性与节点相关联;其他属性(例如链接在 DOM 中的位置或链接类型(内部或外部))可以与圆弧相关联。GNN 允许我们模拟这些信息如何在页面之间传播,以及节点的行为如何不仅取决于其自身的特征,还取决于链接页面的特征。
GNN 的基本原理是邻居聚合。每个节点通过组合来自相邻节点的信息来更新其表示(“嵌入”)。这个过程重复一定数量的“跳”(步骤),使每个节点都能获得越来越广阔的网络视图。
在最普遍的建筑风格中,我们发现:
-
GCN(图卷积网络):应用邻居的度归一化加权聚合。它简单而稳定,但它假设图是无向的并且具有同质属性。
-
GAT(图注意力网络):引入注意力机制,在聚合过程中以不同的方式对每个邻居进行权重。它更加灵活,适用于结构复杂、方向异构的图。
-
其他更高级的架构包括 GraphSAGE、图同构网络 (GIN) 和异构模型 (HeteroGNN),但在本文中,我们将重点介绍 GCN 和 GAT,以确保标准库的简单性和可用性。
我们将要解决的任务可以通过两种方式表述: -
二元分类:对于每个链接,模型预测它是否具有战略性(标签 0/1)。
-
回归: 对于每个链接,模型估计点击率 (CTR),从而提供连续输出。
在这两种情况下,GNN 都会学习一个函数,该函数将图的结构和语义特征与每个节点(页面)或边缘(链接)的预测相关联。输出可以直接用于分类或根据链接的相关性对链接进行排序。
GNN 的优势之一是它们能够在存在非欧几里得结构和非线性分布的情况下进行泛化。然而,这种预测能力往往伴随着缺乏透明度:因此需要像 GNNExplainer 这样的解释工具,我们将在下一节中深入探讨。
四、什么是 GNNExplainer?
图神经网络的主要局限性之一是其可解释性差。虽然它们是捕获复杂结构模式的强大模型,但通常很难理解为什么 GNN 以某种方式对节点或边缘进行分类。这在实际应用中尤其成问题,因为向非技术利益相关者、SEO 专家或开发人员解释模型的决策至关重要。为了解决这个问题,引入了GNNExplainer,这是一种旨在使GNN预测透明的方法。
GNNExplainer 的工作原理是选择证明模型预测合理的图形信息、子图和节点特征的最小但足够的子集。更准确地说,给定对节点或边的预测,该算法识别:
- 与执行的分类或回归最相关的节点特征。
- 对模型输出贡献最大的局部子图(邻域)。
该作通过可微分的过程进行优化:GNNExplainer 在边缘上搜索最佳掩码,在特征上搜索最佳掩码,惩罚过于复杂的解决方案,以获得简洁易懂的解释。结果是图形的哪些部分以及哪些属性指导 GNN 决策的可视化和数字表示。
在我们的模拟场景中,GNNExplainer 可以帮助我们回答以下问题
-
哪些特征使链接具有“战略性”?
-
锚文本、DOM 中的位置和源/目标页面类型的组合是什么,可以最大限度地提高点击概率?
-
哪种内部链接模式最有效?
实际示例:假设 GNN 将从博客到登录页面的链接归类为“战略性”。GNNExplainer 可能会显示: -
DOM 中的位置(例如,标题)具有很高的权重。
-
锚文本内容丰富(例如,“发现优惠”)。
-
源节点(博客)的平均页面停留时间较高。
-
目标节点(登陆页面)连接到其他高 PageRank 页面。
通过可视化 GNNExplainer 突出显示的局部子图,我们可以验证是否存在驱动该预测的相关页面的“社区”。这对于评估 GNN 是否学习了一致的模式或过度拟合了训练集也很有用。
另一个有用的方面是能够比较战略和非战略联系的解释。这种比较使我们能够识别网络已经学习到的隐式规则,这些规则可以转化为作指南以优化网站结构。
模拟场景
为了研究图神经网络在类似于网站结构的上下文中的行为,我们构建了一个逼真的合成图。
目标是模拟一个由内部和外部链接链接的数百个页面的网站,以便我们可以使用 GNNExplainer 测试 GNN 的训练及其后续解释。
五、生成网络
该图是使用 NetworkX 的scale_free_graph模型 (networkx.generators.directed.scale_free_graph(n=500)) 生成的,它反映了 Web 网络的一个典型属性:度分布遵循幂律(无尺度定律)。
基本上,少数页面集中了许多链接(中心),而大多数页面很少。这种模式在真实的抓取数据(例如维基百科、电子商务网站、博客)中被系统地观察到,并且比随机图更合理。
5.1 可视的初始图
- 定向:链接从一个页面转到另一个页面;
- 删除自循环后:我们不考虑指向同一页面的链接;
- 简化为一个简单的图表:两个节点之间的每条弧都是唯一的,即使最初可能存在多重性。
我们获得大约 500 个节点和 2500 到 4000 之间的可变数量的边,具体取决于种子和生成器的特性。
import networkx as nx
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from scipy.special import expit # logistic function
import random
import matplotlib.pyplot as plt# Initial settings
np.random.seed(42)
random.seed(42)
n_nodes = 500# === 1. Graph Creation ===
G_raw = nx.scale_free_graph(n=n_nodes, seed=42)
G_raw = nx.DiGraph(G_raw) # grafo orientato
G_raw.remove_edges_from(nx.selfloop_edges(G_raw)) # remove self-loop
G = nx.DiGraph()
G.add_edges_from(set(G_raw.edges())) # convert to simple graph# Visualization of the graph
plt.figure(figsize=(10, 10))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=False, node_size=20, edge_color='gray', alpha=0.6)
plt.show()

5.2 节点属性
每个节点(页面)都分配了反映 SEO 和 UX 中关键属性的功能:
- page_type:页面类型,从固定集(主页、博客、登陆、产品、联系人)中选择,非统一分配(“博客”和“产品”多于“主页”)。
- avg_time:平均页面停留时间,模拟均匀分布在 10 到 240 秒之间。
- PageRank:使用 PageRank 算法在图表上计算,然后使用 z 分数进行规范化。
- word_count:内容中的字数,分配高斯分布(μ = 800,σ = 400),在 100 到 2000 之间截断。
- 深度:与指定为主页的节点的距离(从连接最多的节点中选择),使用 shortest_path_length 计算。
这些特征用于表示网站中页面的结构和语义重要性。
# === 2. ADDING ATTRIBUTES TO NODES ===
page_types = ['home', 'blog', 'landing', 'product', 'contacts']
page_type_dist = [0.01, 0.4, 0.2, 0.3, 0.09] # non-unform distribution
pagerank_dict = nx.pagerank(G)
pagerank_vals = np.array(list(pagerank_dict.values()))
pagerank_scaled = StandardScaler().fit_transform(pagerank_vals.reshape(-1, 1)).flatten()home_node = max(pagerank_dict, key=pagerank_dict.get)
depth_dict = nx.single_source_shortest_path_length(G.reverse(), home_node) # distance from homepagefor i, node in enumerate(G.nodes()):depth = depth_dict.get(node, None)G.nodes[node]['page_type'] = np.random.choice(page_types, p=page_type_dist)G.nodes[node]['avg_time'] = np.random.uniform(10, 240)G.nodes[node]['pagerank'] = pagerank_scaled[i]G.nodes[node]['word_count'] = int(np.clip(np.random.normal(800, 400), 100, 2000))# Sostituisce np.inf con -1 se il nodo non è raggiungibileG.nodes[node]['depth'] = depth if depth is not None else -1
5.3 弧属性
每个链接(弧)都包含影响其可见性和相关性的上下文信息:
- 链接类型:室内或室外(室内概率90%,室外10%概率模拟)。
dom_position:页眉、正文或页脚,分布不均衡的布局(页眉 15%、正文 70%、页脚 15%)。 - anchor_keyword:一个布尔值,指示锚文本是否包含战略关键字(例如,“buy”、“discover”、“offer”)。
- anchor_length:链接文本长度(1-7 个单词,倾斜分布)。
# === 3. ADDING ARC ATTRIBUTES ===
for u, v in G.edges():G[u][v]['link_type'] = np.random.choice(['internal', 'external'], p=[0.9, 0.1])G[u][v]['dom_position'] = np.random.choice(['header', 'body', 'footer'], p=[0.15, 0.7, 0.15])G[u][v]['anchor_keyword'] = np.random.choice([0, 1], p=[0.7, 0.3])G[u][v]['anchor_length'] = np.random.randint(1, 8)
六、目标模拟
二进制目标is_strategic指示链接是否被视为“战略性”链接,即与转化或渠道相关。它是作为以下功能的逻辑函数生成的:
如果dom_position是“header”,则更有可能,
如果anchor_keyword为 True, 则
如果源页面的 pagerank 较高,
如果目标页面的page_type为“登陆”或“产品”
这种方法可以模拟链接属性与其“战略重要性”之间的非线性和合理关系,这与真实的 SEO 优化实践和内部链接设计一致。
通过这种模拟场景,我们获得了与真实网站结构一致的数据集,该数据集足够复杂,可以测试 GNN 模型和可解释性工具,但可控以进行分析和可视化。
# === 4. CALCULATION OF TARGET (is_strategic) ===
def logistic(x): return expit(x)edges_data = []
for u, v, attrs in G.edges(data=True):dom_weight = {'header': 1.0, 'body': 0.5, 'footer': 0.2}[attrs['dom_position']]keyword = attrs['anchor_keyword']pagerank_src = G.nodes[u]['pagerank']page_type_dst = G.nodes[v]['page_type']dst_weight = 1 if page_type_dst in ['landing', 'product'] else 0score = 2.5 * dom_weight + 1.5 * keyword + 1.0 * pagerank_src + 1.0 * dst_weightprob = logistic(score)is_strategic = np.random.binomial(1, prob)edges_data.append({'source': u,'target': v,'is_strategic': is_strategic,**attrs,'pagerank_src': pagerank_src,'page_type_dst': page_type_dst,'dom_weight': dom_weight})df_edges = pd.DataFrame(edges_data)print("Example of strategic simulated links:")
print(df_edges.sample(5))
Example of strategic simulated links:source target is_strategic link_type dom_position anchor_keyword \
461 172 9 1 internal body 0
122 483 0 1 external body 0
163 33 1 1 internal header 0
746 230 139 1 internal body 0
763 237 155 1 internal header 0 anchor_length pagerank_src page_type_dst dom_weight
461 3 -0.163020 blog 0.5
122 7 -0.163020 product 0.5
163 3 0.586682 product 1.0
746 3 -0.163020 blog 0.5
763 5 -0.163020 blog 1.0
(下文:模型的实现 )
