cryptocalypse commited on
Commit
6fb487c
1 Parent(s): 74c9c9a

memory draf lib, grapher draft lib

Browse files
Files changed (2) hide show
  1. lib/grepher.py +115 -0
  2. lib/memory.py +62 -0
lib/grepher.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import json
3
+ import networkx as nx
4
+ import matplotlib.pyplot as plt
5
+ from fuzzywuzzy import fuzz
6
+ from fuzzywuzzy import process
7
+ from lib.memory import *
8
+
9
+
10
+ class APIRequester:
11
+ def __init__(self):
12
+ pass
13
+
14
+ def make_request(self, url):
15
+ response = requests.get(url)
16
+ if response.status_code == 200:
17
+ return response.json()
18
+ else:
19
+ return None
20
+
21
+ class JSONParser:
22
+ def __init__(self, memoria_nlp, threshold=70):
23
+ self.threshold = threshold
24
+ self.graph = nx.Graph()
25
+ self.memoria_nlp = memoria_nlp
26
+
27
+ def parse_json(self, data, parent=None):
28
+ if isinstance(data, dict):
29
+ for key, value in data.items():
30
+ if parent:
31
+ self.graph.add_node(parent)
32
+ self.graph.add_node(key)
33
+ self.graph.add_edge(parent, key)
34
+
35
+ for node in self.graph.nodes():
36
+ if node != parent and fuzz.ratio(node, key) >= self.threshold:
37
+ self.graph = nx.contracted_nodes(self.graph, node, key, self_loops=False)
38
+
39
+ self.memoria_nlp.agregar_concepto("keys", [(key, 1.0)])
40
+
41
+ if isinstance(value, (dict, list)):
42
+ self.parse_json(value, key)
43
+ else:
44
+ self.memoria_nlp.agregar_concepto("values", [(str(value), 1.0)])
45
+ if parent:
46
+ self.graph.add_node(value)
47
+ self.graph.add_edge(key, value)
48
+
49
+ for node in self.graph.nodes():
50
+ if node != value and fuzz.ratio(node, value) >= self.threshold:
51
+ self.graph = nx.contracted_nodes(self.graph, node, value, self_loops=False)
52
+ elif isinstance(data, list):
53
+ for item in data:
54
+ self.parse_json(item, parent)
55
+
56
+ def draw_graph(self):
57
+ pos = nx.spring_layout(self.graph, seed=42)
58
+ nx.draw(self.graph, pos, with_labels=True, node_size=700, node_color='skyblue', font_size=10, font_weight='bold')
59
+ plt.title("JSON Graph")
60
+ plt.show()
61
+
62
+ def guardar_en_memoria(self):
63
+ keys = self.memoria_nlp.obtener_conceptos_acotados(100)
64
+ with open("memoria.json", "w") as file:
65
+ json.dump(keys, file)
66
+
67
+ def buscar_nodo(self, nodo):
68
+ return process.extractOne(nodo, self.graph.nodes())[0]
69
+
70
+ def eliminar_nodo(self, nodo):
71
+ self.graph.remove_node(nodo)
72
+
73
+ def agregar_nodo(self, nodo):
74
+ self.graph.add_node(nodo)
75
+
76
+ def distancia_entre_nodos(self, nodo1, nodo2):
77
+ return nx.shortest_path_length(self.graph, source=nodo1, target=nodo2)
78
+
79
+ def ruta_entre_nodos(self, nodo1, nodo2):
80
+ return nx.shortest_path(self.graph, source=nodo1, target=nodo2)
81
+
82
+ def unir_grafos(self, otro_grafo, umbral):
83
+ for nodo in otro_grafo.nodes():
84
+ nodo_similar = process.extractOne(nodo, self.graph.nodes())[0]
85
+ if fuzz.ratio(nodo, nodo_similar) >= umbral:
86
+ self.graph = nx.contracted_nodes(self.graph, nodo_similar, nodo, self_loops=False)
87
+ else:
88
+ self.graph.add_node(nodo)
89
+ for vecino in otro_grafo.neighbors(nodo):
90
+ self.graph.add_edge(nodo, vecino)
91
+
92
+ # Ejemplo de uso
93
+ memoria_nlp = MemoriaRobotNLP(max_size=100)
94
+ json_parser = JSONParser(memoria_nlp)
95
+
96
+ api_requester = APIRequester()
97
+ url = "https://jsonplaceholder.typicode.com/posts"
98
+ data = api_requester.make_request(url)
99
+
100
+ if data:
101
+ json_parser.parse_json(data)
102
+ json_parser.draw_graph()
103
+
104
+ otro_parser = JSONParser(MemoriaRobotNLP(max_size=100))
105
+ otro_parser.parse_json({"id": 101, "title": "New Title", "userId": 11})
106
+
107
+ print("Uniendo los grafos...")
108
+ json_parser.unir_grafos(otro_parser.graph, umbral=80)
109
+ print("Grafo unido:")
110
+ json_parser.draw_graph()
111
+
112
+ json_parser.guardar_en_memoria()
113
+ else:
114
+ print("Error al realizar la solicitud a la API.")
115
+
lib/memory.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class MemoriaRobotNLP:
2
+ def __init__(self, max_size):
3
+ self.max_size = max_size
4
+ self.memoria = {}
5
+
6
+ def agregar_concepto(self, concepto, strings):
7
+ if concepto not in self.memoria:
8
+ self.memoria[concepto] = []
9
+
10
+ for string, prioridad in strings:
11
+ self.memoria[concepto].append((string, prioridad))
12
+
13
+ def eliminar_concepto(self, concepto):
14
+ if concepto in self.memoria:
15
+ del self.memoria[concepto]
16
+
17
+ def agregar_string(self, concepto, string, prioridad):
18
+ if concepto not in self.memoria:
19
+ self.memoria[concepto] = []
20
+
21
+ self.memoria[concepto].append((string, prioridad))
22
+
23
+ def eliminar_string(self, concepto, string):
24
+ if concepto in self.memoria:
25
+ self.memoria[concepto] = [(s, p) for s, p in self.memoria[concepto] if s != string]
26
+
27
+ def obtener_conceptos_acotados(self, espacio_disponible):
28
+ memoria_ordenada = sorted(self.memoria.items(), key=lambda x: sum(prioridad for _, prioridad in x[1]), reverse=True)
29
+ espacio_utilizado = 0
30
+ conceptos_acotados = []
31
+
32
+ for concepto, strings in memoria_ordenada:
33
+ espacio_concepto = sum(prioridad for _, prioridad in strings)
34
+ if espacio_utilizado + espacio_concepto <= espacio_disponible:
35
+ conceptos_acotados.append((concepto, strings))
36
+ espacio_utilizado += espacio_concepto
37
+ else:
38
+ break
39
+
40
+ return conceptos_acotados
41
+
42
+
43
+ # Ejemplo de uso
44
+ memoria_robot = MemoriaRobotNLP(max_size=100)
45
+
46
+ memoria_robot.agregar_concepto("animales", [("perro", 0.8), ("gato", 0.7), ("pájaro", 0.5)])
47
+ memoria_robot.agregar_concepto("colores", [("rojo", 0.9), ("verde", 0.6), ("azul", 0.7)])
48
+
49
+ print("Memoria completa:")
50
+ print(memoria_robot.memoria)
51
+
52
+ memoria_robot.agregar_string("animales", "pez", 0.6)
53
+ memoria_robot.eliminar_string("colores", "verde")
54
+ memoria_robot.eliminar_concepto("colores")
55
+
56
+ print("\nMemoria después de modificaciones:")
57
+ print(memoria_robot.memoria)
58
+
59
+ conceptos_acotados = memoria_robot.obtener_conceptos_acotados(50)
60
+ print("\nConceptos acotados a un tamaño máximo de memoria:")
61
+ print(conceptos_acotados)
62
+