Compare commits

...

3 Commits

24 changed files with 226 additions and 34 deletions

View File

@@ -0,0 +1 @@
,mongar,mongar,13.11.2025 12:45,file:///home/mongar/.config/libreoffice/4;

View File

@@ -2,6 +2,19 @@ import pandas as pd
import os
import sys
from extraccion import agentes_entidades
from extraccion.schemas_entidades import (
Acciones,
Temas,
Estrategias,
Factores,
Entidades,
Competencias,
Herramientas,
Mecanismos,
Opiniones,
Expectativas,
)
module_path = os.path.abspath(os.path.join(".."))
@@ -11,51 +24,193 @@ if module_path not in sys.path:
print(module_path)
INPUT_FOLDER = f"{module_path}/input/Preguntas Categoricas/"
OUTPUT_FOLDER = f"{module_path}/output/fase1"
INPUT_FOLDER = "input/Preguntas Categoricas"
OUTPUT_FOLDER = "output/fase1"
FILES_TO_PROCESS = os.listdir(INPUT_FOLDER)
DELIMITER = "|^"
DIC_QUESTIONS = {
"Encuesta_MediaG01Q02.csv": agentes_entidades.extractor_pre_1,
"Encuesta_MediaG01Q04.csv": agentes_entidades.extractor_pre_2,
"Encuesta_MediaG01Q10.csv": agentes_entidades.extractor_pre_3,
"Encuesta_MediaG03Q17.csv": agentes_entidades.extractor_pre_4,
"Encuesta_MediaG03Q18.csv": agentes_entidades.extractor_pre_5,
# "Encuesta_MediaG03Q19.csv": agentes_entidades.extractor_pre_6,
"Encuesta_MediaG04Q22.csv": agentes_entidades.extractor_pre_7,
"Encuesta_MediaG04Q23.csv": agentes_entidades.extractor_pre_8,
"Encuesta_MediaG04Q25.csv": agentes_entidades.extractor_pre_9,
"Encuesta_MediaG05Q30.csv": agentes_entidades.extractor_pre_10,
"Encuesta_MediaG05Q34.csv": agentes_entidades.extractor_pre_11,
# "Encuesta_MediaG05Q27.csv": agentes_entidades.extractor_pre_12,
"Encuesta_MediaG06Q35.csv": agentes_entidades.extractor_pre_13,
# "Encuesta_MediaG06Q37.csv": agentes_entidades.extractor_pre_14,
# "Encuesta_MediaG06Q39.csv": agentes_entidades.extractor_pre_15
# COMPLETAR RESTO
# "Encuesta_MediaG01Q04.csv": agentes_entidades.extractor_pre_2,
# "Encuesta_MediaG01Q10.csv": agentes_entidades.extractor_pre_3,
# "Encuesta_MediaG03Q17.csv": agentes_entidades.extractor_pre_4,
# "Encuesta_MediaG03Q18.csv": agentes_entidades.extractor_pre_5,
# # "Encuesta_MediaG03Q19.csv": agentes_entidades.extractor_pre_6,
# "Encuesta_MediaG04Q22.csv": agentes_entidades.extractor_pre_7,
# "Encuesta_MediaG04Q23.csv": agentes_entidades.extractor_pre_8,
# "Encuesta_MediaG04Q25.csv": agentes_entidades.extractor_pre_9,
# "Encuesta_MediaG05Q30.csv": agentes_entidades.extractor_pre_10,
# "Encuesta_MediaG05Q34.csv": agentes_entidades.extractor_pre_11,
# "Encuesta_MediaG05Q28.csv": agentes_entidades.extractor_pre_12,
# "Encuesta_MediaG06Q35.csv": agentes_entidades.extractor_pre_13,
# "Encuesta_MediaG06Q38.csv": agentes_entidades.extractor_pre_14,
# "Encuesta_MediaG06Q40.csv": agentes_entidades.extractor_pre_15,
}
def extract_answers(answers):
answer_formated = ""
iterator_answers = answers.acciones
for item in iterator_answers:
answer_formated += f"{item.accion}{DELIMITER}"
return answer_formated
def extract_answers(answers_obj):
"""
Toma el objeto Pydantic devuelto por un extractor y devuelve
una LISTA de los textos de respuesta extraídos.
Devuelve:
list[str]: Una lista de strings (ej. ["Accion 1", "Accion 2"])
"""
list_items_text = [] # Lista para guardar solo los strings finales
list_items = [] # Lista genérica de objetos
item_attr_name = "" # Atributo a extraer
# --- Manejo de esquemas de listas de objetos ---
if isinstance(answers_obj, Acciones):
list_items = answers_obj.acciones
item_attr_name = "accion"
elif isinstance(answers_obj, Temas):
list_items = answers_obj.temas
item_attr_name = "tema"
elif isinstance(answers_obj, Estrategias):
list_items = answers_obj.estrategias
item_attr_name = "estrategia"
elif isinstance(answers_obj, Factores):
list_items = answers_obj.factores
item_attr_name = "factor"
elif isinstance(answers_obj, Entidades):
list_items = answers_obj.entidades
item_attr_name = "entidad"
elif isinstance(answers_obj, Herramientas):
list_items = answers_obj.herramientas
item_attr_name = "herramienta"
elif isinstance(answers_obj, Mecanismos):
list_items = answers_obj.mecanismos
item_attr_name = "mecanismo"
elif isinstance(answers_obj, Opiniones):
list_items = answers_obj.opiniones
item_attr_name = "opinion"
elif isinstance(answers_obj, Expectativas):
list_items = answers_obj.expectativas
item_attr_name = "expectativa"
if list_items and item_attr_name:
for item in list_items:
item_text = getattr(item, item_attr_name, "")
if item_text:
list_items_text.append(item_text)
return list_items_text # Devuelve la lista de textos
# --- Manejo del caso especial: Competencias ---
elif isinstance(answers_obj, Competencias):
if answers_obj.basicas:
list_items_text.extend([f"Básica: {c}" for c in answers_obj.basicas if c])
if answers_obj.socioemocionales:
list_items_text.extend(
[f"Socioemocional: {c}" for c in answers_obj.socioemocionales if c]
)
if answers_obj.ciudadanas:
list_items_text.extend(
[f"Ciudadana: {c}" for c in answers_obj.ciudadanas if c]
)
if answers_obj.siglo_xxi:
list_items_text.extend(
[f"Siglo XXI: {c}" for c in answers_obj.siglo_xxi if c]
)
return list_items_text # Devuelve la lista de textos de competencias
# Si no se encontró nada, devuelve una lista vacía
return []
def format_answer(dataframe, function):
"""
Itera sobre el dataframe, aplica la función extractora y gestiona
el contador de IDs global para ESE dataframe.
"""
dataframe["respuestas_formato"] = None
dataframe["respuestas_formato_id"] = None
# Inicializar el contador de ID global para este archivo
global_id_counter = 1
for index, row in dataframe.iterrows():
# 1. Obtener el objeto Pydantic
answers = function(row["respuesta"])
answer_to_insert = extract_answers(answers)
dataframe.loc[index, "respuestas_formato"] = answer_to_insert
# 2. Obtener la LISTA de textos extraídos
list_items_text = extract_answers(answers)
# 3. Si la lista está vacía, poner strings vacíos y continuar
if not list_items_text:
dataframe.loc[index, "respuestas_formato"] = ""
dataframe.loc[index, "respuestas_formato_id"] = ""
continue # No incrementa el contador
# 4. Si hay textos, formatear la salida
count = len(list_items_text)
# Formatear el texto
answer_formated = DELIMITER.join(list_items_text) + DELIMITER
# Formatear los IDs usando el contador global
id_list = [str(i) for i in range(global_id_counter, global_id_counter + count)]
id_formated = ",".join(id_list)
# 5. Asignar los valores al DataFrame
dataframe.loc[index, "respuestas_formato"] = answer_formated
dataframe.loc[index, "respuestas_formato_id"] = id_formated
# 6. Actualizar el contador global para la siguiente fila
global_id_counter += count
def format_all_answers(Dic_questions):
"""
Función principal que procesa todos los archivos CSV definidos en Dic_questions.
"""
for key, value in Dic_questions.items():
question_dataframe = pd.read_csv(INPUT_FOLDER + "/" + key)
format_answer(question_dataframe, value)
question_dataframe.to_csv(OUTPUT_FOLDER + "/" + key)
try:
# Construir la ruta completa al archivo de entrada
input_file_path = os.path.join(INPUT_FOLDER, key)
# Verificar si el archivo existe
if not os.path.exists(input_file_path):
print(f"Advertencia: El archivo no existe, omitiendo: {key}")
continue
question_dataframe = pd.read_csv(input_file_path)
if question_dataframe.empty:
print(f"Archivo vacío, omitiendo: {key}")
continue
if "respuesta" not in question_dataframe.columns:
print(f"No se encontró la columna 'respuesta' en {key}, omitiendo.")
continue
# Esta función ahora maneja toda la lógica de conteo
format_answer(question_dataframe, value)
# Limpiar NAs antes de guardar
question_dataframe["respuestas_formato"] = question_dataframe[
"respuestas_formato"
].fillna("")
question_dataframe["respuestas_formato_id"] = question_dataframe[
"respuestas_formato_id"
].fillna("")
# Construir la ruta completa al archivo de salida
output_file_path = os.path.join(OUTPUT_FOLDER, key)
# Asegurarse de que el directorio de salida exista
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
question_dataframe.to_csv(output_file_path, index=False)
print(f"Procesado y guardado: {key}")
except pd.errors.EmptyDataError:
print(f"Error: El archivo {key} está vacío o es inválido.")
except Exception as e:
print(f"Error inesperado procesando {key}: {e}")
# --- Ejecutar el proceso ---
format_all_answers(DIC_QUESTIONS)
print("Proceso de Fase 1 completado.")

View File

@@ -25,7 +25,7 @@ def load_prompts_config(file_path):
return prompts_config
path_prompts = f"{os.path.abspath(os.path.join('..'))}/extraccion/prompts.yaml"
path_prompts = "extraccion/prompts.yaml"
prompts_config = load_prompts_config(path_prompts)
context = LLMContext()
@@ -235,7 +235,7 @@ def extractor_pre_9(respuesta: str) -> Entidades:
llm_so = llm.with_structured_output(Entidades)
entidades: list = llm_so.invoke(prompt)
entidades = llm_so.invoke(prompt)
lista_entidades = entidades.entidades
@@ -397,4 +397,4 @@ alianza con cornare y la UMATA, dicha invitación a participar se hizo
por la página de la secretaria departamental, donde a partir de un
infograma explicaba paso a paso como participar y además contaba con linea telefónica.
"""
extractor_pre_15(respuesta)
# extractor_pre_15(respuesta)

View File

@@ -1,2 +1,3 @@
cod_dane,cod_pregunta,respuesta
205120000366/I.E. AURELIO MEJIA,G01Q02,"Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa"
205120000366/I.E. AURELIO MEJIA,G01Q02,"Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa"
1 cod_dane cod_pregunta respuesta
2 205120000366/I.E. AURELIO MEJIA G01Q02 Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa
3 205120000366/I.E. AURELIO MEJIA G01Q02 Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120000366/I.E. AURELIO MEJIA,G01Q02,"Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa"
1 cod_dane cod_pregunta respuesta
2 205120000366/I.E. AURELIO MEJIA G01Q02 Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120000366/I.E. AURELIO MEJIA,G01Q04,Continuamente hacer encuestas de satisfacción para conocer las inquietudes y deseos que tienen nuestros estudiantes. También se ofrecen talleres de nivelación para aquellos que presentan dificultades en el rendimiento
1 cod_dane cod_pregunta respuesta
2 205120000366/I.E. AURELIO MEJIA G01Q04 Continuamente hacer encuestas de satisfacción para conocer las inquietudes y deseos que tienen nuestros estudiantes. También se ofrecen talleres de nivelación para aquellos que presentan dificultades en el rendimiento

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120000366/I.E. AURELIO MEJIA,G01Q10,"Desde hace ya mas de tres años no se actualizaba el PEI, se incluyó el tema de los ajustes razonables y se reorganizó los principios instritucionales"
1 cod_dane cod_pregunta respuesta
2 205120000366/I.E. AURELIO MEJIA G01Q10 Desde hace ya mas de tres años no se actualizaba el PEI, se incluyó el tema de los ajustes razonables y se reorganizó los principios instritucionales

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120000366/I.E. AURELIO MEJIA,G03Q17,"PIAR, STEAM,+H y tecnologías"
1 cod_dane cod_pregunta respuesta
2 205120000366/I.E. AURELIO MEJIA G03Q17 PIAR, STEAM,+H y tecnologías

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120000366/I.E. AURELIO MEJIA,G03Q18,Generalmente la encuesta en linea
1 cod_dane cod_pregunta respuesta
2 205120000366/I.E. AURELIO MEJIA G03Q18 Generalmente la encuesta en linea

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120000366/I.E. AURELIO MEJIA,G03Q19,No
1 cod_dane cod_pregunta respuesta
2 205120000366/I.E. AURELIO MEJIA G03Q19 No

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G04Q22,l la participación de los padres de familia y los estudiantes por lo tanto como estrategia principal esta que ellos participen dando la información de que hay cupos para educación media creando material informativo y que sean los encargados de la distribución en sus barrios
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G04Q22 l la participación de los padres de familia y los estudiantes por lo tanto como estrategia principal esta que ellos participen dando la información de que hay cupos para educación media creando material informativo y que sean los encargados de la distribución en sus barrios

View File

@@ -0,0 +1,3 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G04Q23,"A nivel social y económico, el comercio en la zona necesita mano de obra barata y los estudiantes prefieren ir a trabajar asi sea por poco dinero pero tener algo con que sobrevivir.
A nivel cultural en las familias son pocos los bachilleres que hay entonces terminar no es motivación"
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G04Q23 A nivel social y económico, el comercio en la zona necesita mano de obra barata y los estudiantes prefieren ir a trabajar asi sea por poco dinero pero tener algo con que sobrevivir. A nivel cultural en las familias son pocos los bachilleres que hay entonces terminar no es motivación

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G04Q25,
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G04Q25

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G05Q28,"En la última actualización del PEI intentamos que muchos de los temas de clase tengan como eje las problemáticas del territorio para que ellos analicen y de forma critican generen propuestas, sin embargo algunos profesores aún están reacios a cambiar la metodología"
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G05Q28 En la última actualización del PEI intentamos que muchos de los temas de clase tengan como eje las problemáticas del territorio para que ellos analicen y de forma critican generen propuestas, sin embargo algunos profesores aún están reacios a cambiar la metodología

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G05Q30,"La empatía, trabajo en equipo y se trabaja de manera muy fuerte las competencias matemáticas"
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G05Q30 La empatía, trabajo en equipo y se trabaja de manera muy fuerte las competencias matemáticas

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G05Q34,Rubricas de evaluación por áreas de conocimiento y listas de chequeo de acuerdo a las dimensiones del desarrollo con el grado de transición
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G05Q34 Rubricas de evaluación por áreas de conocimiento y listas de chequeo de acuerdo a las dimensiones del desarrollo con el grado de transición

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G06Q35,Son muy altas pues desde hace varios años hemos venido solicitando el apoyo de dicha institución para que nos colabore con recursos
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G06Q35 Son muy altas pues desde hace varios años hemos venido solicitando el apoyo de dicha institución para que nos colabore con recursos

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G06Q38,"Las veces que han dado charlas son mas que todo para motivarlos a que sigan en educación superior y ellos desean aprender herramientas tecnológicas para sus emprendimientos familiares o propios, pocos quieren seguir estudiando"
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G06Q38 Las veces que han dado charlas son mas que todo para motivarlos a que sigan en educación superior y ellos desean aprender herramientas tecnológicas para sus emprendimientos familiares o propios, pocos quieren seguir estudiando

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta
205120001435/I.E. GASPAR DE RODAS,G06Q40,"Comparte mucha información de las alianzas que se han logrado pero en nuestra subregión no hay nada, todo es para el oriente "
1 cod_dane cod_pregunta respuesta
2 205120001435/I.E. GASPAR DE RODAS G06Q40 Comparte mucha información de las alianzas que se han logrado pero en nuestra subregión no hay nada, todo es para el oriente

View File

@@ -0,0 +1 @@
,mongar,mongar,14.11.2025 16:57,file:///home/mongar/.config/libreoffice/4;

View File

@@ -1,2 +1,3 @@
,cod_dane,cod_pregunta,respuesta,respuestas_formato
0,205120000366/I.E. AURELIO MEJIA,G01Q02,"Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa",Realiza promoción por radio para informar a la comunidad sobre el acceso a educación media.|^Difunde mensajes informativos en la portería del establecimiento educativo.|^Utiliza carteleras del plantel para comunicar información sobre acceso a educación media.|^Implementa estrategia de comunicación de voz a voz con la comunidad educativa para promover el acceso a educación media.|^
cod_dane,cod_pregunta,respuesta,respuestas_formato,respuestas_formato_id
205120000366/I.E. AURELIO MEJIA,G01Q02,"Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa",Realiza promoción por radio para informar a la comunidad sobre el acceso a educación media.|^Difunde mensajes informativos en la portería del establecimiento educativo.|^Utiliza carteleras del plantel para comunicar información sobre acceso a educación media.|^Implementa estrategia de comunicación de voz a voz con la comunidad educativa para promover el acceso a educación media.|^,"1,2,3,4"
205120000366/I.E. AURELIO MEJIA,G01Q02,"Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa",Realiza promoción por radio para informar a la comunidad sobre el acceso a educación media.|^Difunde mensajes informativos en la portería del establecimiento educativo.|^Utiliza carteleras del plantel para comunicar información sobre acceso a educación media.|^Implementa estrategia de comunicación de voz a voz con la comunidad educativa para promover el acceso a educación media.|^,"5,6,7,8"
1 cod_dane cod_pregunta respuesta respuestas_formato respuestas_formato_id
2 0 205120000366/I.E. AURELIO MEJIA G01Q02 Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa Realiza promoción por radio para informar a la comunidad sobre el acceso a educación media.|^Difunde mensajes informativos en la portería del establecimiento educativo.|^Utiliza carteleras del plantel para comunicar información sobre acceso a educación media.|^Implementa estrategia de comunicación de voz a voz con la comunidad educativa para promover el acceso a educación media.|^ 1,2,3,4
3 205120000366/I.E. AURELIO MEJIA G01Q02 Realiza promoción por radio, mensajes informativos en porteria y carteleras del plantel, voz a voz con la comunidad educativa Realiza promoción por radio para informar a la comunidad sobre el acceso a educación media.|^Difunde mensajes informativos en la portería del establecimiento educativo.|^Utiliza carteleras del plantel para comunicar información sobre acceso a educación media.|^Implementa estrategia de comunicación de voz a voz con la comunidad educativa para promover el acceso a educación media.|^ 5,6,7,8

View File

@@ -0,0 +1,2 @@
cod_dane,cod_pregunta,respuesta,respuestas_formato,respuestas_formato_id
205120000366/I.E. AURELIO MEJIA,G01Q04,Continuamente hacer encuestas de satisfacción para conocer las inquietudes y deseos que tienen nuestros estudiantes. También se ofrecen talleres de nivelación para aquellos que presentan dificultades en el rendimiento,Realizan encuestas de satisfacción de forma continua para conocer las inquietudes y deseos de los estudiantes.|^Ofrecen talleres de nivelación para estudiantes que presentan dificultades en el rendimiento académico.|^,"1,2"
1 cod_dane cod_pregunta respuesta respuestas_formato respuestas_formato_id
2 205120000366/I.E. AURELIO MEJIA G01Q04 Continuamente hacer encuestas de satisfacción para conocer las inquietudes y deseos que tienen nuestros estudiantes. También se ofrecen talleres de nivelación para aquellos que presentan dificultades en el rendimiento Realizan encuestas de satisfacción de forma continua para conocer las inquietudes y deseos de los estudiantes.|^Ofrecen talleres de nivelación para estudiantes que presentan dificultades en el rendimiento académico.|^ 1,2

Binary file not shown.

View File

@@ -15,4 +15,4 @@ llm = context.get_llm()
pregunta = "¿Cuál es el mejor modelo de lenguaje?"
respuesta = llm.invoke(pregunta)
print(respuesta)