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

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
视觉智能开放平台,视频资源包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天前
|
人工智能 自然语言处理 前端开发
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
Director 是一个构建视频智能体的 AI 框架,用户可以通过自然语言命令执行复杂的视频任务,如搜索、编辑、合成和生成视频内容。该框架基于 VideoDB 的“视频即数据”基础设施,集成了多个预构建的视频代理和 AI API,支持高度定制化,适用于开发者和创作者。
75 9
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
|
22天前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
73 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
16天前
|
自然语言处理 搜索推荐 API
如何构建一套qwen-max智能体拥有媲美通义千问在线接口的能力
基于Qwen-Max构建的智能系统,融合了自然语言处理、决策引擎、任务识别与工具选择等技术,具备强大的多模态理解和生成能力。该系统能自动分析用户输入,识别任务类型,选择最优工具执行任务,并整合结果反馈给用户,广泛应用于查询、生成、翻译和图像处理等多个领域,显著提升了任务处理效率和智能化水平。
98 9
|
14天前
|
人工智能 自然语言处理 搜索推荐
如何构建媲美通义千问在线接口的qwen-max智能体
qwen-max智能体是一个高效、多功能的系统,擅长处理查询、文本生成、翻译、图像处理等任务。通过自然语言理解、任务识别、决策引擎和工具选择,它能自动选择最佳方案,满足用户多样化需求,提供智能化服务。系统旨在快速响应、精准执行,并持续优化,支持多任务类型,适应不断变化的需求。
|
16天前
|
人工智能 自然语言处理 搜索推荐
如何构建一套qwen-max智能体拥有媲美通义千问在线接口的能力
智能系统通过任务识别、决策引擎、工具选择和结果整合,自动选择合适的工具和方法,高效处理查询、生成、翻译、图像处理等任务,提供精准的解决方案。系统支持自然语言理解、任务分类、语义解析与意图识别,确保任务的准确执行和反馈。
|
20天前
|
存储 人工智能 自然语言处理
通义千问 Qwen 系列的 Agent 方向探索
通义千问Qwen系列在AI领域展现了强大的Agent方向探索能力,包括灵活的Tool调用、单/多Agent场景实践等,通过丰富的代码示例展示了其在文本生成、信息检索、任务自动化及专业领域应用等方面的优势,为复杂应用场景提供了多元且实用的解决方案。
|
29天前
|
机器学习/深度学习 算法 Python
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。本文详细介绍了随机森林的工作原理、性能优势、影响因素及调优方法,并提供了Python实现示例。适用于分类、回归及特征选择等多种应用场景。
54 7
|
1月前
|
自然语言处理 Python
使用Python和Qwen模型实现一个简单的智能问答Agent
使用Python和Qwen模型实现一个简单的智能问答Agent
103 4
|
1月前
|
JSON 数据可视化 知识图谱
基于百炼 qwen plus 、开源qwen2.5 7B Instruct 建非schema限定的图谱 用于agent tool的图谱形式结构化 文本资料方案
基于百炼 qwen plus 的上市企业ESG图谱构建工作,通过调用阿里云的 OpenAI 服务,从 Excel 文件读取上市公司 ESG 报告数据,逐条处理并生成知识图谱,最终以 YAML 格式输出。该过程包括数据读取、API 调用、结果处理和文件保存等步骤,确保生成的知识图谱全面、动态且结构清晰。此外,还提供了基于 Pyvis 的可视化工具,将生成的图谱以交互式图形展示,便于进一步分析和应用。
364 3
|
1月前
|
存储 Serverless API
基于百炼平台构建智能体应用——十分钟构造能主动提问的导购智能体
本文介绍了如何使用阿里云百炼大模型服务平台构建一个多智能体的智能导购应用,并将其部署到钉钉。通过百炼的Assistant API,您可以快速构建一个包含规划助理、手机导购、冰箱导购和电视导购的智能导购系统。文章详细讲解了从创建函数计算应用、访问网站、验证智能导购效果到将商品检索应用集成到智能导购中的全过程,帮助您快速实现智能导购功能。
173 0
基于百炼平台构建智能体应用——十分钟构造能主动提问的导购智能体