File size: 1,489 Bytes
421f9b7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""Load the complete Quranic root graph from the pre-built JSON."""

import json
from pathlib import Path
import networkx as nx

GRAPH_PATH = Path(__file__).parent / "full_graph.json"


def load_graph(path=None):
    path = path or GRAPH_PATH
    with open(path, "r", encoding="utf-8") as f:
        data = json.load(f)

    G = nx.DiGraph()
    for node_id, attrs in data["nodes"].items():
        G.add_node(node_id, **attrs)

    for edge in data["edges"]:
        src = edge.pop("source")
        tgt = edge.pop("target")
        G.add_edge(src, tgt, **edge)

    return G


def graph_stats(G):
    roots = [n for n, d in G.nodes(data=True) if d.get("type") == "root"]
    derived = [n for n, d in G.nodes(data=True) if d.get("type") == "derived"]
    deriv_edges = sum(1 for _, _, d in G.edges(data=True) if d.get("relation") == "derivation")
    sem_edges = sum(1 for _, _, d in G.edges(data=True) if d.get("relation") == "semantic")

    top_roots = sorted(roots, key=lambda n: G.nodes[n].get("frequency", 0), reverse=True)[:20]

    return {
        "total_nodes": G.number_of_nodes(),
        "root_nodes": len(roots),
        "derived_nodes": len(derived),
        "total_edges": G.number_of_edges(),
        "derivation_edges": deriv_edges,
        "semantic_edges": sem_edges,
        "top_roots": [
            {"root": r, "frequency": G.nodes[r].get("frequency", 0),
             "summary": G.nodes[r].get("summary", "")[:80]}
            for r in top_roots
        ],
    }