import json import networkx as nx from pyvis.network import Network def create_knowledge_graph(events_file="data/parsed_event_data.json", characters_file="data/parsed_character_metadata.json", output_file="data/knowledge_graph.html"): """ Create a knowledge graph from parsed events and character data Args: events_file (str): Path to parsed event data JSON characters_file (str): Path to character metadata JSON output_file (str): Path to save the HTML knowledge graph """ with open(events_file, "r") as f: parsed_data = json.load(f) with open(characters_file, "r") as f: character_metadata = json.load(f) story_title = list(parsed_data.keys())[0] events = parsed_data[story_title] character_metadata.pop("Story_name", None) G = nx.MultiDiGraph() for char, desc in character_metadata.items(): G.add_node(char, type="character", description=desc) for event in events: event_name = event.get("event_name", "") event_desc = event.get("description", "") G.add_node(event_name, type="event", description=event_desc) for obj in event.get("objects", []): G.add_node(obj, type="object") G.add_edge(event_name, obj, relation="has_object") for env in event.get("environment", []): G.add_node(env, type="environment") G.add_edge(event_name, env, relation="is_in") for actor in event.get("actors", []): matched = False for char in character_metadata: if char.lower() in actor.lower(): G.add_edge(char, event_name, relation="participates_in") matched = True break if not matched: G.add_node(actor, type="actor") G.add_edge(actor, event_name, relation="participates_in") for char, desc in character_metadata.items(): G.nodes[char]["description"] = desc net = Network(height="800px", width="100%", notebook=True, directed=True, cdn_resources="in_line") net.from_nx(G) color_map = { "character": "#ffb347", "event": "#87ceeb", "object": "#90ee90", "environment": "#f08080", "actor": "#dda0dd" } for node in net.nodes: ntype = G.nodes[node["id"]].get("type", "actor") node["color"] = color_map.get(ntype, "#cccccc") node["title"] = G.nodes[node["id"]].get("description", "") net.write_html(output_file) print(f"Knowledge graph saved as {output_file}") if __name__ == "__main__": create_knowledge_graph()