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
],
}
|