import requests import json import networkx as nx import matplotlib.pyplot as plt from fuzzywuzzy import fuzz from fuzzywuzzy import process from lib.memory import * class APIRequester: def __init__(self): pass def make_request(self, url): response = requests.get(url) if response.status_code == 200: return response.json() else: return None class Grapher: def __init__(self, memoria_nlp, threshold=70): self.threshold = threshold self.graph = nx.Graph() self.memoria_nlp = memoria_nlp def parse_json(self, data, parent=None): if isinstance(data, dict): for key, value in data.items(): if parent: self.graph.add_node(parent) self.graph.add_node(key) self.graph.add_edge(parent, key) for node in self.graph.nodes(): if node != parent and fuzz.ratio(node, key) >= self.threshold: self.graph = nx.contracted_nodes(self.graph, node, key, self_loops=False) self.memoria_nlp.agregar_concepto("keys", [(key, 1.0)]) if isinstance(value, (dict, list)): self.parse_json(value, key) else: self.memoria_nlp.agregar_concepto("values", [(str(value), 1.0)]) if parent: self.graph.add_node(value) self.graph.add_edge(key, value) for node in self.graph.nodes(): if node != value and fuzz.ratio(node, value) >= self.threshold: self.graph = nx.contracted_nodes(self.graph, node, value, self_loops=False) elif isinstance(data, list): for item in data: self.parse_json(item, parent) def draw_graph(self): pos = nx.spring_layout(self.graph, seed=42) nx.draw(self.graph, pos, with_labels=True, node_size=700, node_color='skyblue', font_size=10, font_weight='bold') plt.title("JSON Graph") plt.show() def guardar_en_memoria(self): keys = self.memoria_nlp.obtener_conceptos_acotados(100) with open("memoria.json", "w") as file: json.dump(keys, file) def buscar_nodo(self, nodo): return process.extractOne(nodo, self.graph.nodes())[0] def eliminar_nodo(self, nodo): self.graph.remove_node(nodo) def agregar_nodo(self, nodo): self.graph.add_node(nodo) def distancia_entre_nodos(self, nodo1, nodo2): return nx.shortest_path_length(self.graph, source=nodo1, target=nodo2) def ruta_entre_nodos(self, nodo1, nodo2): return nx.shortest_path(self.graph, source=nodo1, target=nodo2) def unir_grafos(self, otro_grafo, umbral): for nodo in otro_grafo.nodes(): nodo_similar = process.extractOne(nodo, self.graph.nodes())[0] if fuzz.ratio(nodo, nodo_similar) >= umbral: self.graph = nx.contracted_nodes(self.graph, nodo_similar, nodo, self_loops=False) else: self.graph.add_node(nodo) for vecino in otro_grafo.neighbors(nodo): self.graph.add_edge(nodo, vecino) if __name__ == "__main__": # Ejemplo de uso memoria_nlp = MemoriaRobotNLP(max_size=100) json_parser = JSONParser(memoria_nlp) api_requester = APIRequester() url = "https://jsonplaceholder.typicode.com/posts" data = api_requester.make_request(url) if data: json_parser.parse_json(data) json_parser.draw_graph() otro_parser = JSONParser(MemoriaRobotNLP(max_size=100)) otro_parser.parse_json({"id": 101, "title": "New Title", "userId": 11}) print("Uniendo los grafos...") json_parser.unir_grafos(otro_parser.graph, umbral=80) print("Grafo unido:") json_parser.draw_graph() json_parser.guardar_en_memoria() else: print("Error al realizar la solicitud a la API.")