File size: 6,150 Bytes
24060c9 |
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 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
#/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'
####################################################################
# modules/database/semantic_mongo_db.py
# modules/database/semantic_mongo_db.py
def store_student_semantic_result(username, text, analysis_result, lang_code='en'):
"""
Guarda el resultado del análisis semántico en MongoDB.
Args:
username: Nombre del usuario
text: Texto completo analizado
analysis_result: Diccionario con los resultados del análisis
lang_code: Código de idioma (opcional, default 'en')
"""
try:
# Verificar datos mínimos requeridos
if not username or not text or not analysis_result:
logger.error("Datos insuficientes para guardar el análisis")
return False
# Preparar el gráfico conceptual
concept_graph_data = None
if 'concept_graph' in analysis_result and analysis_result['concept_graph'] is not None:
try:
if isinstance(analysis_result['concept_graph'], bytes):
concept_graph_data = base64.b64encode(analysis_result['concept_graph']).decode('utf-8')
else:
logger.warning("El gráfico conceptual no está en formato bytes")
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),
'text': text,
'analysis_type': 'semantic',
'key_concepts': analysis_result.get('key_concepts', []),
'concept_centrality': analysis_result.get('concept_centrality', {}),
'concept_graph': concept_graph_data,
'language': lang_code # Usamos el parámetro directamente
}
# Insertar en MongoDB
result = insert_document(COLLECTION_NAME, analysis_document)
if result:
logger.info(f"Análisis semántico guardado para {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)}", exc_info=True)
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'
] |