基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
视觉智能开放平台,视频资源包5000点
NLP自然语言处理_基础版,每接口每天50万次
简介: 利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。

如何利用图序列进行数据解读?

  1. 节点序列分析
    • 节点度分析
      • 计算每个节点的入度和出度。入度表示指向该节点的边的数量,出度表示从该节点出发的边的数量。例如,对于一个知识图谱中的“事件”节点,高入度可能意味着该事件受到很多其他因素的影响,高出度可能表示这个事件会引发很多后续的其他事件。通过分析节点度,可以识别出图中的关键节点。比如在社交网络图谱中,那些具有高入度和高出度的用户可能是意见领袖。
      • 还可以计算节点的度中心性,它衡量了一个节点在整个图中的中心程度。度中心性高的节点在信息传播等过程中可能起到更关键的作用。以学术引用网络为例,度中心性高的论文往往是该领域的核心文献。
    • 节点属性分析
      • 对于节点序列中的每个节点,其附带的属性包含了丰富的信息。如果是一个产品知识图谱,节点代表产品,属性可能包括价格、品牌、功能等。通过分析节点属性的分布,可以了解数据的一些基本特征。例如,统计不同品牌节点的数量,可以知道各品牌在图谱中的占比,进而分析市场竞争情况。
      • 还可以对节点属性进行聚类分析。以客户知识图谱为例,根据客户的年龄、消费频率、消费金额等属性进行聚类,将节点分为不同的客户群体,从而有针对性地制定营销策略。
    • 节点标签分析(如果有)
      • 当节点有标签时,分析不同标签的节点数量和分布。在生物知识图谱中,节点标签可能是不同的生物种类,通过统计标签的频率,可以了解图谱中生物种类的构成。
      • 研究标签之间的关联,即不同类型节点之间的连接情况。比如在一个疾病 - 治疗方法的知识图谱中,分析“疾病”标签节点和“药物”标签节点之间的连接关系,有助于了解疾病的治疗方案分布。
  2. 边序列分析
    • 边的权重分析(如果有)
      • 如果边有表示关联强度的权重属性,那么可以分析权重的分布。在物流网络图谱中,边代表运输路线,权重可能是运输成本或运输时间。通过分析权重分布,可以找到成本最低或时间最短的运输路径。
      • 对于权重较高的边,重点研究它们连接的节点,因为这些边可能代表着重要的关系。例如在合作网络图谱中,边的权重表示合作的紧密程度,权重高的边连接的合作伙伴可能是核心合作关系。
    • 边的类型分析
      • 统计不同类型关系(边类型)的数量。在企业组织架构图谱中,边类型可能包括“管理”“协作”“汇报”等,统计各类型边的数量可以了解组织架构的特点,如管理层次的复杂度等。
      • 研究不同类型边的连接模式。例如在语义知识图谱中,分析“是一种”“属于”“包含”等不同类型的边如何连接概念节点,有助于理解知识的组织结构。
    • 路径分析
      • 利用边序列计算节点之间的最短路径。在城市交通图谱中,通过计算最短路径可以为出行提供最佳路线建议。
      • 分析不同节点对之间的所有路径,以发现潜在的间接关系。在人际关系图谱中,发现两个人之间通过多个中间人的间接联系路径,有助于理解社交圈子的关联深度。
  3. 结合节点和边序列的分析
    • 子图挖掘
      • 通过节点和边的关联,挖掘出具有特定结构的子图。例如在基因调控网络图谱中,挖掘出具有反馈调节结构的子图,这对于理解基因表达的调控机制非常重要。
      • 分析子图的功能和性质。如果是在软件系统架构图谱中,挖掘出的子图可能代表一个功能模块,通过分析子图内节点和边的关系,可以了解该模块的功能和性能特点。
    • 图的动态分析(如果有时间序列数据)
      • 当图序列是随时间变化时,观察节点和边的变化情况。在股票市场关系图谱中,节点代表股票,边代表相关性,随着时间的推移,新的边可能出现(表示新的相关性),旧的边可能消失,通过分析这种动态变化可以预测市场趋势。
      • 研究节点和边的变化对图的整体结构和功能的影响。例如在生态系统图谱中,物种(节点)的灭绝或新物种的引入(新节点)以及它们之间相互关系(边)的变化,会对生态系统的稳定性产生重大影响。

以下是基于上述利用图序列进行数据解读的思路对代码进行修改后的版本,在代码中添加了具体的数据分析相关函数来展示如何对节点序列和边序列做进一步处理,示例代码如下:

import networkx as nx
import pandas as pd
import json

# 初始化知识图谱
G = nx.DiGraph()


# 定义函数用于添加节点和边(逻辑和原代码类似,简化了部分重复的获取逻辑)
def add_entities_and_relationships(graph, entities, relationships):
    # 添加实体
    for entity in entities:
        graph.add_node(entity['name'], **entity)
    # 添加关系
    for relation in relationships:
        source = relation.get('source', relation.get('subject', relation.get('from', relation.get('source_event', ''))))
        target = relation.get('target', relation.get('object', relation.get('to', relation.get('target_event', ''))))
        predicate = relation.get('relation_type', relation.get('relationship', relation.get('type', '')))

        if source and target and predicate:
            if isinstance(target, list):
                for target_one in target:
                    graph.add_edge(source, target_one, relation_type=predicate)
            else:
                graph.add_edge(source, target, relation_type=predicate)


# 分析节点的度相关信息(入度、出度、度中心性)并生成指令格式
def analyze_node_degrees(graph):
    in_degrees = dict(graph.in_degree())
    out_degrees = dict(graph.out_degree())
    degree_centrality = nx.degree_centrality(graph)

    # 构建指令格式的字典
    instruction = {
   
        "分析类型": "节点度分析",
        "入度信息": [],
        "出度信息": [],
        "度中心性信息": []
    }
    for node, in_degree in in_degrees.items():
        instruction["入度信息"].append({
   "节点": node, "入度": in_degree})
    for node, out_degree in out_degrees.items():
        instruction["出度信息"].append({
   "节点": node, "出度": out_degree})
    for node, centrality in degree_centrality.items():
        instruction["度中心性信息"].append({
   "节点": node, "度中心性": centrality})
    return instruction


# 分析节点属性信息(这里简单示例统计具有某属性的节点数量,可根据实际情况拓展)并生成指令格式
def analyze_node_attributes(graph):
    # 假设节点有一个叫'category'的属性,统计不同类别节点数量
    category_count = {
   }
    for node, data in graph.nodes(data=True):
        category = data.get('category', 'unknown')
        category_count[category] = category_count.get(category, 0) + 1

    # 构建指令格式的字典
    instruction = {
   
        "分析类型": "节点属性分析",
        "属性分布信息": []
    }
    for category, count in category_count.items():
        instruction["属性分布信息"].append({
   "属性值": category, "节点数量": count})
    return instruction


# 分析边的类型数量情况并生成指令格式
def analyze_edge_types(graph):
    edge_types = {
   }
    for _, _, edge_data in graph.edges(data=True):
        edge_type = edge_data.get('relation_type', 'unknown')
        edge_types[edge_type] = edge_types.get(edge_type, 0) + 1

    # 构建指令格式的字典
    instruction = {
   
        "分析类型": "边类型分析",
        "边类型数量信息": []
    }
    for edge_type, count in edge_types.items():
        instruction["边类型数量信息"].append({
   "边类型": edge_type, "数量": count})
    return instruction


# 分析节点之间的最短路径(简单示例,选取部分节点对查看)并生成指令格式
def analyze_shortest_paths(graph):
    some_nodes = list(graph.nodes())  # 选取前5个节点做示例,可按需调整
    instruction = {
   
        "分析类型": "节点最短路径分析",
        "最短路径信息": []
    }
    for i in range(len(some_nodes)):
        for j in range(i + 1, len(some_nodes)):
            source = some_nodes[i]
            target = some_nodes[j]
            try:
                shortest_path = nx.shortest_path(graph, source=source, target=target)
                instruction["最短路径信息"].append({
   "源节点": source, "目标节点": target, "最短路径": shortest_path})
            except nx.NetworkXNoPath:
                continue
                # instruction["最短路径信息"].append({"源节点": source, "目标节点": target, "是否存在路径": "否"})
    return instruction


# 主逻辑部分
if __name__ == "__main__":
    try:
        # 读取Excel数据,和原代码逻辑一致
        knowledge_glm = pd.read_excel("南海战略态势感知计划_knowledge.xlsx").values.tolist()
        datasets = []
        for i in knowledge_glm:
            try:
                data = eval(i[1])
            except:
                continue
            datasets.append(data)

        for dataset in datasets:
            entities = dataset.get('entities', [])
            relationships = dataset.get('relationships', [])
            add_entities_and_relationships(G, entities, relationships)

        # 获取图的节点序列和边序列(这里可以根据具体需求进一步处理这些序列,例如用于后续的数据分析、特征提取等)
        node_sequence = list(G.nodes())
        edge_sequence = list(G.edges(data=True))

        print("节点序列:", node_sequence)
        print("边序列:", edge_sequence)

        # 调用数据分析函数生成指令并输出到 JSON 文件
        result = {
   
            "节点度分析": analyze_node_degrees(G),
            "节点属性分析": analyze_node_attributes(G),
            "边类型分析": analyze_edge_types(G),
            "节点最短路径分析": analyze_shortest_paths(G)
        }
        with open('analysis_result.json', 'w',encoding="utf-8") as f:
            json.dump(result, f, indent=4,ensure_ascii=False)

    except FileNotFoundError:
        print("指定的Excel文件不存在,请检查文件路径是否正确。")
    except Exception as e:
        print("出现其他错误:", str(e))

在上述代码中:

主逻辑部分的调整
在成功构建知识图谱并获取节点序列和边序列后,依次调用上述新添加的分析函数,对知识图谱的数据进行多维度的解读分析,从而挖掘出图中隐藏的一些信息和特征,辅助后续的决策或者进一步的研究等工作。

需要注意的是,代码中的分析函数只是简单示例,具体应用时可根据数据的实际意义以及业务需求,对这些分析函数进行更深入的拓展和定制,比如在分析节点属性时可以做聚类分析等更复杂的操作,在分析最短路径时可以结合路径长度等信息做更多统计分析等。同时,代码中对于读取 Excel 文件及解析数据部分依赖于实际数据格式,如果格式有变化可能需要适当调整相关代码逻辑以确保正确解析数据。

以下是一些常用的图算法,可以从多个维度去解读图谱,你可以根据图谱的具体特点和想要挖掘的信息来选择合适的算法应用:

节点重要性相关算法

  • PageRank算法
    • 原理:最初用于网页排名,其基本思想是认为如果一个网页被很多其他重要的网页链接,那么这个网页也很重要。在图谱中,节点相当于网页,边相当于链接。通过不断迭代计算每个节点的重要性得分,收敛后得到各节点相对重要程度的排序。比如在社交网络图谱里,如果一个人(节点)被很多有影响力(重要性得分高)的人关注(有边指向),那这个人的重要性也相对较高。
    • 应用场景和解读维度:可以用于找出图谱中关键的实体(节点)。例如在学术合作图谱中,通过PageRank能找出在整个学术网络里影响力较大的学者;在企业合作图谱中,可确定处于核心地位、对合作关系网络较为关键的企业等。
import networkx as nx
import pandas as pd
import json

# 初始化知识图谱,使用有向图(Directed Graph)类型
G = nx.DiGraph()


# 定义函数用于添加节点和边(逻辑和原代码类似,简化了部分重复的获取逻辑)
def add_entities_and_relationships(graph, entities, relationships):
    """
    该函数用于向给定的图中添加实体节点以及实体之间的关系边。
    参数:
    graph (networkx.DiGraph): 要添加节点和边的图对象。
    entities (list): 包含实体信息的字典列表,每个字典代表一个实体,至少包含'name'键用于表示节点名称。
    relationships (list): 包含关系信息的字典列表,每个字典描述了实体之间的关系,需包含能提取出源节点、目标节点以及关系类型的相关键值。

    返回:
    无,直接在传入的图对象上添加节点和边。
    """
    # 添加实体
    for entity in entities:
        graph.add_node(entity['name'], **entity)
    # 添加关系
    for relation in relationships:
        source = relation.get('source', relation.get('subject', relation.get('from', relation.get('source_event', ''))))
        target = relation.get('target', relation.get('object', relation.get('to', relation.get('target_event', ''))))
        predicate = relation.get('relation_type', relation.get('relationship', relation.get('type', '')))

        if source and target and predicate:
            if isinstance(target, list):
                for target_one in target:
                    graph.add_edge(source, target_one, relation_type=predicate)
            else:
                graph.add_edge(source, target, relation_type=predicate)

# 新增函数,使用PageRank算法分析节点重要性并选择前10%的节点
def select_top_nodes_by_pagerank(graph, percentile=10):
    """
    使用PageRank算法分析图中节点的重要性,并选择前指定百分比的节点。
    参数:
    graph (networkx.DiGraph): 要分析的图对象。
    percentile (int): 要选择的顶部节点百分比。
    返回:
    list: 包含顶部节点名称的列表。
    """
    pagerank_scores = nx.pagerank(graph)
    # 将节点按PageRank值降序排序
    sorted_nodes = sorted(pagerank_scores.items(), key=lambda x: x[1], reverse=True)
    # 计算需要保留的节点数量
    num_nodes_to_keep = int(len(sorted_nodes) * (percentile / 100))
    # 选择前10%的节点
    top_nodes = [node[0] for node in sorted_nodes[:num_nodes_to_keep]]
    return top_nodes

# 主逻辑部分
if __name__ == "__main__":
    try:
        # 读取Excel数据,和原代码逻辑一致
        knowledge_glm = pd.read_excel("南海战略态势感知计划_knowledge.xlsx").values.tolist()
        datasets = []
        for i in knowledge_glm:
            try:
                data = eval(i[1])
            except:
                continue
            datasets.append(data)

        for dataset in datasets:
            entities = dataset.get('entities', [])
            relationships = dataset.get('relationships', [])
            add_entities_and_relationships(G, entities, relationships)

        # 使用PageRank选择前10%的节点
        top_nodes = select_top_nodes_by_pagerank(G)

        # 可以选择创建一个新的子图,只包含这些顶部的节点和它们之间的边
        subgraph = G.subgraph(top_nodes)

        # 获取子图的节点序列和边序列
        node_sequence = list(subgraph.nodes())
        edge_sequence = list(subgraph.edges(data=True))

        print("前10%权重节点序列:", node_sequence)
        print("子图的边序列:", edge_sequence)

        result = {
   
            "前10%权重节点序列": node_sequence,
            "子图的边序列": edge_sequence
        }
        with open('pagerank_prompt.json', 'w', encoding="utf-8") as f:
            json.dump(result, f, indent=4, ensure_ascii=False)

    except FileNotFoundError:
        print("指定的Excel文件不存在,请检查文件路径是否正确。")
    except Exception as e:
        print("出现其他错误:", str(e))
  • Degree Centrality(度中心性)
    • 原理:分为入度和出度(针对有向图),入度是指向该节点的边的数量,出度是从该节点出发指向其他节点的边的数量,而度中心性就是计算节点的度(无向图里就是与该节点相连的边的总数)。度越大,说明该节点在网络中的连接越广泛,在一定程度上越重要。例如在人际关系图谱中,一个人认识(有边相连)的人越多,其度中心性越高。
    • 应用场景和解读维度:能够快速了解哪些节点是网络中的“交际中心”。在交通网络图谱中,可以确定哪些站点连接的线路最多,是重要的交通枢纽;在通信网络图谱里,能找到与其他设备连接数量较多的关键设备节点等。
      
      

社区发现相关算法

  • Louvain算法
    • 原理:基于模块度优化的贪心算法,旨在将网络划分成多个社区,使得社区内部节点连接紧密,而社区之间的连接相对稀疏。它从每个节点作为一个单独社区开始,不断合并社区以提高模块度的值,直到达到最优划分。比如在社交平台用户关系图谱中,会把互动频繁(边多)的一群用户划分到一个社区,不同社区之间用户互动相对少些。
    • 应用场景和解读维度:可以深入了解图谱中不同群体的聚集情况。在电商用户行为图谱里,通过社区发现能找出具有相似购买偏好的用户群体,方便进行精准营销;在生物物种关系图谱中,能划分出不同的生态群落,分析物种之间的共生、竞争等关系在群落层面的表现。

使用Louvain算法进行社区发现功能的代码,整体逻辑更聚焦于从原始图谱数据构建图,然后运用Louvain算法划分社区,并输出相关结果到JSON文件,代码如下:

import networkx as nx
import pandas as pd
import json
from community import community_louvain

# 初始化知识图谱,使用有向图(Directed Graph)类型
# G = nx.DiGraph()

G = nx.Graph()
# 定义函数用于添加节点和边(逻辑和原代码类似,简化了部分重复的获取逻辑)
def add_entities_and_relationships(graph, entities, relationships):
    """
    该函数用于向给定的图中添加实体节点以及实体之间的关系边。

    参数:
    graph (networkx.DiGraph): 要添加节点和边的图对象。
    entities (list): 包含实体信息的字典列表,每个字典代表一个实体,至少包含'name'键用于表示节点名称。
    relationships (list): 包含关系信息的字典列表,每个字典描述了实体之间的关系,需包含能提取出源节点、目标节点以及关系类型的相关键值。

    返回:
    无,直接在传入的图对象上添加节点和边。
    """
    # 添加实体
    for entity in entities:
        graph.add_node(entity['name'], **entity)
    # 添加关系
    for relation in relationships:
        source = relation.get('source', relation.get('subject', relation.get('from', relation.get('source_event', ''))))
        target = relation.get('target', relation.get('object', relation.get('to', relation.get('target_event', ''))))
        predicate = relation.get('relation_type', relation.get('relationship', relation.get('type', '')))

        if source and target and predicate:
            if isinstance(target, list):
                for target_one in target:
                    graph.add_edge(source, target_one, relation_type=predicate)
            else:
                graph.add_edge(source, target, relation_type=predicate)


# 新增函数,使用Louvain算法进行社区发现,并返回社区划分结果
def detect_communities_by_louvain(graph):
    """
    使用Louvain算法对给定的图进行社区发现,将网络划分成多个社区,使得社区内部节点连接紧密,社区间连接相对稀疏。

    参数:
    graph (networkx.DiGraph): 要进行社区发现的图对象。

    返回:
    list: 包含各个社区的节点列表的列表,每个子列表代表一个社区。
    """
    # 运行Louvain算法,得到每个节点所属的社区编号
    partition = community_louvain.best_partition(graph)
    # 将节点按照所属社区进行分组
    communities = {
   }
    for node, community_id in partition.items():
        if community_id not in communities:
            communities[community_id] = []
        communities[community_id].append(node)
    return list(communities.values())


# 新增函数,根据社区划分结果构建指令信息
def build_instructions(communities):
    """
    根据社区划分结果构建指令信息,包括每个社区的节点数量和主要节点信息。

    参数:
    communities (list): 社区划分结果,每个元素是一个社区的节点列表。

    返回:
    list: 包含每个社区指令信息的列表,每个指令信息是一个字典。
    """
    instructions = []
    for community in communities:
        # 社区节点数量
        num_nodes = len(community)
        if num_nodes < 5:
            continue
        # 选取社区中的部分主要节点(这里简单取前两个,可根据实际需求调整)
        main_nodes = community[:10] if num_nodes >= 10 else community
        instruction = {
   
            "社区节点数量": num_nodes,
            "主要节点信息": main_nodes
        }
        instructions.append(instruction)
    return instructions


# 主逻辑部分
if __name__ == "__main__":
    try:
        # 读取Excel数据,和原代码逻辑一致
        knowledge_glm = pd.read_excel("ESG报告基于非限制性图谱类别性质的大模型生成_yaml_builder_2024年11月25日.xlsx").values.tolist()
        datasets = []
        for i in knowledge_glm:
            try:
                data = eval(i[1])
            except:
                continue
            datasets.append(data)

        for dataset in datasets:
            entities = dataset.get('entities', [])
            relationships = dataset.get('relationships', [])
            add_entities_and_relationships(G, entities, relationships)

        # 使用Louvain算法进行社区发现
        communities = detect_communities_by_louvain(G)

        # 根据社区划分结果构建指令
        instructions = build_instructions(communities)

        # 获取图的节点序列和边序列
        node_sequence = list(G.nodes())
        edge_sequence = list(G.edges(data=True))

        print("节点序列:", node_sequence)
        print("边序列:", edge_sequence)
        print("社区划分结果:", communities)
        print("指令信息:", instructions)

        result = {
   
            "节点序列": node_sequence,
            "边序列": edge_sequence,
            "社区划分结果": communities,
            "指令信息": instructions
        }
        with open('louvain_result_with_instructions.json', 'w', encoding="utf-8") as f:
            json.dump(result, f, indent=4, ensure_ascii=False)

    except FileNotFoundError:
        print("指定的Excel文件不存在,请检查文件路径是否正确。")
    except Exception as e:
        print("出现其他错误:", str(e))

以下是对上述代码的详细解释:

代码整体结构及功能

  • 代码主要分为三部分:函数定义部分、Louvain算法相关函数部分以及主逻辑部分。整体功能是读取Excel文件中的图谱数据构建图结构,然后使用Louvain算法对构建好的图进行社区划分,最后将图的节点序列、边序列以及社区划分结果输出保存到JSON文件中。

函数定义部分

  • add_entities_and_relationships函数:
    • 功能:用于向给定的图对象中添加实体节点和它们之间的关系边。它接收一个图对象、包含实体信息的列表以及包含关系信息的列表作为参数。
    • 具体实现:遍历实体列表,将每个实体以其名称作为节点添加到图中,并附带实体自身的其他属性信息(通过**entity展开添加)。然后遍历关系列表,从关系字典中提取源节点、目标节点以及关系类型信息,根据这些信息向图中添加对应的边。如果目标节点是列表形式(表示一个源节点对应多个目标节点的情况),则遍历目标节点列表逐个添加边。

Louvain算法相关函数部分

  • detect_communities_by_louvain函数:
    • 功能:实现对给定图运用Louvain算法进行社区发现的功能,返回划分好的社区结果,每个社区以包含节点名称的列表形式表示。
    • 具体实现
      • 首先调用community_louvain.best_partition函数对传入的图执行Louvain算法,得到一个字典,其中键是图中的节点,值是该节点所属的社区编号(整数类型)。
      • 接着创建一个空字典communities,用于按照社区编号来归类节点。通过遍历前面得到的节点所属社区编号的字典,对于每个节点及其对应的社区编号,若该社区编号尚未在communities字典中出现过,则创建一个新的空列表来存放属于该社区编号的节点,然后将当前节点添加到对应列表中。
      • 最后,将communities字典中存储的各个社区节点列表提取出来,形成一个包含多个子列表的列表,也就是最终的社区划分结果并返回。

主逻辑部分

  • 首先尝试读取指定Excel文件(南海战略态势感知计划_knowledge.xlsx)中的数据,将其解析处理后存放到datasets列表中。这里的读取和解析逻辑与之前保持一致,即把文件内容转换为列表形式,并对每个元素中的数据部分(通过eval函数解析)进行提取,遇到解析失败的情况则跳过该元素。
  • 然后遍历datasets列表中的每个数据集,从中获取实体和关系信息,并调用add_entities_and_relationships函数将这些实体和关系添加到初始化的知识图谱G中,逐步构建完整的图结构。
  • 接着调用detect_communities_by_louvain函数对构建好的图G运用Louvain算法进行社区发现,得到社区划分结果communities
  • 之后获取图G的节点序列和边序列,通过list(G.nodes())list(G.edges(data=True))分别获取所有节点名称列表以及包含边信息(源节点、目标节点和边属性)的列表。
  • 最后将节点序列、边序列以及社区划分结果整理到result字典中,并使用json.dump将其保存为名为louvain_result.json的JSON文件,文件编码采用utf-8,并设置缩进为4以保证文件格式的可读性,同时确保非ASCII字符能正常保存。

如果在代码执行过程中出现文件不存在的情况(即找不到指定的Excel文件),则会捕获FileNotFoundError异常并打印相应提示信息告知用户检查文件路径。若出现其他类型的异常,则会打印出具体的错误信息,方便排查问题。

这样,通过运行上述代码就能实现从原始数据构建图谱,运用Louvain算法进行社区划分,并将相关结果保存下来以供后续进一步分析图谱结构以及各社区内部与社区之间的关系特点等内容。你可以根据实际需求对代码进行适当调整,比如根据社区划分结果进行更深入的数据分析或者可视化展示等操作。

示例指令构建结果

[{
   '社区节点数量': 64,
            '主要节点信息': ['公司', '董事会成员人数', '员工管理', '健康安全', '资源使用及温室气体排放', '综合能耗',
                             '综合能耗强度', 'Senior Managers', 'Compensation Incentive Policy',
                             'Performance Management Rules']}, {
   '社区节点数量': 36,
                                                                '主要节点信息': ['董事会', '政府及监管部门',
                                                                                 '股东及投资者', '员工', '客户',
                                                                                 '供应商', '社区', '投资者', 'Aiko',
                                                                                 '股东大会']}, {
   '社区节点数量': 111,
                                                                                                '主要节点信息': [
                                                                                                    '爱旭股份',
                                                                                                    '投资者关系管理',
                                                                                                    '客户权益',
                                                                                                    '反贪腐',
                                                                                                    '供应链管理',
                                                                                                    '知识产权保障',
                                                                                                    'ESG 治理',
                                                                                                    '其他资源管理',
                                                                                                    '社区关系 环境管理',
                                                                                                    '别墅全覆盖光伏发电项目']},
           {
   '社区节点数量': 24,
            '主要节点信息': ['《公司章程》', '粤高速', '《公司法》', '《证券法》', '《上市公司治理准则》', '《股票上市规则》',
                             '三会运作的议事规则', '董事会专门委员会议事规则', '总经理工作细则', '投资发展部']},
           {
   '社区节点数量': 6,
            '主要节点信息': ['事故应急救援指挥部', '疏散组', '抢救组', '医疗组', '支援组', '通讯组']},
           {
   '社区节点数量': 79,
            '主要节点信息': ['天津基地', '浙江基地', '佛山基地', 'Aiko Solar', 'PERC cells', '高效PERC细胞',
                             '双面PERC细胞', '政府和监管机构', '行业政策和趋势', '行业基准']}, {
   '社区节点数量': 5,
                                                                                                '主要节点信息': [
                                                                                                    'Guangdong Aiko Solar Energy Technology Co., Ltd',
                                                                                                    'Zhejiang Aiko Solar Energy Technology Co., Ltd',
                                                                                                    'Tianjin Aiko Solar Energy Technology Co., Ltd',
                                                                                                    'Zhuhai Fushan Aiko Solar Energy Technology Co., Ltd',
                                                                                                    'Shanghai Aiko Solar Energy Co., Ltd']},
           {
   '社区节点数量': 9,
            '主要节点信息': ['Zhejiang Base', 'Soil and Underground Water Self-Monitoring Plan', 'PH', 'fluoride',
                             'silver', 'tin', 'petroleum hydrocarbons', 'local environment authority',
                             'Yiwu Charity Federation']}, {
   '社区节点数量': 43,
                                                           '主要节点信息': ['京基智农', '饲料生产', '育种', '养殖',
                                                                            '生猪产业链项目', '饲料安全',
                                                                            'ISO9001 质量管理体系',
                                                                            'ISO22000 食品安全管理体系认证',
                                                                            '产品质量合格率', '食品安全管理体系']},
           {
   '社区节点数量': 11,
            '主要节点信息': ['自动喂料系统', '楼房养殖模式', '生产区', '生活区', '环保区', '前置功能区', '自配料区域',
                             '自动饮水系统', '自动清粪系统', '自动除臭系统']}, {
   '社区节点数量': 13,
                                                                                '主要节点信息': ['节约用水',
                                                                                                 '饲料端源头减排',
                                                                                                 '循环用水',
                                                                                                 '低蛋白氨基酸平衡技术',
                                                                                                 '酶制剂', '微生态制剂',
                                                                                                 '植物提取物',
                                                                                                 '达标中水净化回用',
                                                                                                 '洗消水再生',
                                                                                                 '定时供水电磁阀']},
           {
   '社区节点数量': 14,
            '主要节点信息': ['无害化处理设备', '危废储存间', '中继池', '除臭管路', '二沉池', '泵组', '设施',
                             '文昌京基智农', '中继池水位', '生态循环产业园区']},
           {
   '社区节点数量': 5, '主要节点信息': ['路况水平', '行车环境', '通行能力', '安全指数', '智慧交通系统']}]

通过这样的社区发现算法,我们就能找到esg报告中相关性主题。从而支持我们进行提示词的构建。

  • Girvan-Newman算法
    • 原理:通过逐步移除网络中边介数(经过某条边的最短路径的数量)最高的边来发现社区结构。边介数高的边往往是连接不同社区的“桥梁”,移除它们后,网络自然就分割出不同的社区了。例如在城市交通流量图谱中,那些连接不同城区且车流量大(类似边介数高)的道路去除后,就能看出不同城区内部相对独立的交通网络结构,也就是不同的社区。
    • 应用场景和解读维度:有助于揭示图谱里隐藏的社区边界。在科研合作图谱中,可区分出不同研究领域的合作群体,了解各领域内相对独立又有一定联系的科研团队构成;在企业市场竞争图谱中,划分出不同竞争阵营的企业社区,分析各阵营之间的竞争态势和合作可能性等。

路径相关算法

  • Dijkstra算法
    • 原理:用于计算带权重(边有对应权重,比如距离、成本等)的有向图或无向图中从一个起始节点到其他所有节点的最短路径。它通过不断扩展已确定最短路径的节点集合,更新与这些节点相邻节点的最短路径估计值,直到遍历完所有节点。比如在地图道路网络图谱中,如果边的权重是道路的长度,使用Dijkstra算法就能找出从出发地到各个目的地的最短行车路线。
    • 应用场景和解读维度:可以分析在图谱中不同节点之间资源传递、信息流通等的最优路径情况。在物流配送网络图谱里,确定货物从仓库到各个零售点的最经济(距离最短、成本最低等)的运输路线;在通信网络图谱中,找到信号从源节点到目标节点的最快传播路径等。
  • Floyd-Warshall算法
    • 原理:能求解所有节点对之间的最短路径(同样适用于带权重的图),通过动态规划的思想,利用中间节点逐步更新两点之间的最短路径长度。相较于Dijkstra算法一次只能计算从一个源点出发的最短路径,它可以一次性得出整个图谱中任意两点间的最短距离情况。例如在大型城市轨道交通换乘图谱中,能快速知晓任意两个站点之间最少需要换乘几次、最短距离是多少等。
    • 应用场景和解读维度:全面了解图谱内节点间的连通效率、距离关系等。在互联网数据传输网络图谱中,评估不同服务器节点之间的数据传输最短耗时情况,优化网络架构;在供应链图谱中,分析各供应商、生产商、零售商之间的最短供应链路,提升整体供应链效率。

聚类系数相关算法

  • Clustering Coefficient(聚类系数)
    • 原理:衡量一个节点的邻居节点之间相互连接的紧密程度,也就是局部网络的成团情况。对于某个节点,其聚类系数的计算是其邻居节点之间实际存在的边数与所有可能存在的边数的比例。在社交圈子图谱中,如果一个人的朋友们(邻居节点)之间相互认识(有边相连)的比例很高,那这个节点对应的聚类系数就大,说明这个小圈子联系很紧密。
    • 应用场景和解读维度:可以洞察图谱中局部区域的凝聚性、网络结构的紧密程度变化等。在电力网络图谱里,分析各变电站周边电网线路的连接紧密情况,判断局部电网的稳定性;在知识图谱中,了解不同知识概念的相关节点之间的关联紧密程度,辅助知识体系的梳理和挖掘潜在的知识关联等。

你可以根据自己图谱的类型(比如是社交网络图谱、知识图谱、生物图谱等)以及想要分析的具体维度(节点重要性、社区结构、路径情况还是局部紧密性等)来选择合适的图算法进行解读,必要时还可以综合多种算法来获取更全面深入的图谱信息。
那么我们就用esg图谱数据来构建基于图论算法的指令构建方法哦那个

相关文章
|
14天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
18天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
9天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
14天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
22天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
4天前
|
云安全 存储 弹性计算
|
6天前
|
云安全 人工智能 自然语言处理
|
10天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
|
25天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3985 5
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
4天前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
309 4