Spaces:
Runtime error
Runtime error
Commit
·
6fb487c
1
Parent(s):
74c9c9a
memory draf lib, grapher draft lib
Browse files- lib/grepher.py +115 -0
- 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 |
+
|