File size: 5,167 Bytes
4340657 7ef8110 77a25bb 4340657 7ef8110 22a0901 7ef8110 4340657 bbf3161 ecf0cbb 7ef8110 bbf3161 7ef8110 bbf3161 ecf0cbb 4340657 ecf0cbb bbf3161 4340657 ecf0cbb 4340657 ecf0cbb 4340657 ecf0cbb 19a15dc 4340657 182af1b 19a15dc 182af1b 19a15dc 71433cb 182af1b 19a15dc 182af1b 19a15dc 182af1b 71433cb 182af1b 19a15dc 71433cb 19a15dc 182af1b 19a15dc 4340657 |
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
#/modules/database/semantic_mongo_db.py
# Importaciones estándar
import io
import base64
from datetime import datetime, timezone
import logging
# Importaciones de terceros
import matplotlib.pyplot as plt
# Importaciones locales
from .mongo_db import (
get_collection,
insert_document,
find_documents,
update_document,
delete_document
)
# Configuración del logger
logger = logging.getLogger(__name__) # Cambiado de name a __name__
COLLECTION_NAME = 'student_semantic_analysis'
def store_student_semantic_result(username, text, analysis_result):
"""
Guarda el resultado del análisis semántico en MongoDB.
"""
try:
# El gráfico ya viene en bytes, solo necesitamos codificarlo a base64
concept_graph_data = None
if 'concept_graph' in analysis_result and analysis_result['concept_graph'] is not None:
try:
# Ya está en bytes, solo codificar a base64
concept_graph_data = base64.b64encode(analysis_result['concept_graph']).decode('utf-8')
except Exception as e:
logger.error(f"Error al codificar gráfico conceptual: {str(e)}")
# Crear documento para MongoDB
analysis_document = {
'username': username,
'timestamp': datetime.now(timezone.utc).isoformat(),
'text': text,
'analysis_type': 'semantic',
'key_concepts': analysis_result.get('key_concepts', []),
'concept_graph': concept_graph_data
}
# Insertar en MongoDB
result = insert_document(COLLECTION_NAME, analysis_document)
if result:
logger.info(f"Análisis semántico guardado con ID: {result} para el usuario: {username}")
return True
logger.error("No se pudo insertar el documento en MongoDB")
return False
except Exception as e:
logger.error(f"Error al guardar el análisis semántico: {str(e)}")
return False
####################################################################################
def get_student_semantic_analysis(username, limit=10):
"""
Recupera los análisis semánticos de un estudiante.
"""
try:
# Obtener la colección
collection = get_collection(COLLECTION_NAME)
if collection is None: # Cambiado de if not collection a if collection is None
logger.error("No se pudo obtener la colección semantic")
return []
# Consulta
query = {
"username": username,
"analysis_type": "semantic"
}
# Campos a recuperar
projection = {
"timestamp": 1,
"concept_graph": 1,
"_id": 1
}
# Ejecutar consulta
try:
cursor = collection.find(query, projection).sort("timestamp", -1)
if limit:
cursor = cursor.limit(limit)
# Convertir cursor a lista
results = list(cursor)
logger.info(f"Recuperados {len(results)} análisis semánticos para {username}")
return results
except Exception as db_error:
logger.error(f"Error en la consulta a MongoDB: {str(db_error)}")
return []
except Exception as e:
logger.error(f"Error recuperando análisis semántico: {str(e)}")
return []
####################################################################################################
def update_student_semantic_analysis(analysis_id, update_data):
"""
Actualiza un análisis semántico existente.
Args:
analysis_id: ID del análisis a actualizar
update_data: Datos a actualizar
"""
query = {"_id": analysis_id}
update = {"$set": update_data}
return update_document(COLLECTION_NAME, query, update)
def delete_student_semantic_analysis(analysis_id):
"""
Elimina un análisis semántico.
Args:
analysis_id: ID del análisis a eliminar
"""
query = {"_id": analysis_id}
return delete_document(COLLECTION_NAME, query)
def get_student_semantic_data(username):
"""
Obtiene todos los análisis semánticos de un estudiante.
Args:
username: Nombre del usuario
Returns:
dict: Diccionario con todos los análisis del estudiante
"""
analyses = get_student_semantic_analysis(username, limit=None)
formatted_analyses = []
for analysis in analyses:
formatted_analysis = {
'timestamp': analysis['timestamp'],
'text': analysis['text'],
'key_concepts': analysis['key_concepts'],
'entities': analysis['entities']
# No incluimos los gráficos en el resumen general
}
formatted_analyses.append(formatted_analysis)
return {
'entries': formatted_analyses
}
# Exportar las funciones necesarias
__all__ = [
'store_student_semantic_result',
'get_student_semantic_analysis',
'update_student_semantic_analysis',
'delete_student_semantic_analysis',
'get_student_semantic_data'
] |