import pandas as pd import random from pathlib import Path import re from transformers import pipeline # Configuración básica raw_path = Path("../data/raw") processed_path = Path("../data/processed") synthetic_path = Path("../data/synthetic") # Cargar datos medqa_file = raw_path / "medqa.csv" medqa = pd.read_csv(medqa_file, encoding='utf-8') # Limpieza de datos def clean_text(text): if pd.isna(text): return "" text = str(text).lower().strip() text = re.sub(r'\s+', ' ', text) # Elimina espacios extras text = re.sub(r'[^\w\s]', '', text) # Elimina caracteres especiales (opcional, ajusta según necesidad) return text # Aplicar limpieza a las columnas relevantes medqa['question'] = medqa['question'].apply(clean_text) medqa['answer'] = medqa['answer'].apply(clean_text) # Si las opciones están en formato de lista o texto, también puedes limpiarlas if 'options' in medqa.columns: medqa['options'] = medqa['options'].apply(lambda x: clean_text(str(x)) if pd.notnull(x) else "") # Verificación inicial (opcional, para debugging) print("Dimensiones de MedQA:", medqa.shape) print("Valores nulos en MedQA:\n", medqa.isnull().sum()) print("Duplicados en MedQA:", medqa.duplicated().sum()) # Manejo de nulos (por ejemplo, rellenar con valores predeterminados) medqa.fillna({"options": "No options provided"}, inplace=True) # Generación de datos sintéticos para MedQA def generate_synthetic_medqa(df, n=100): """ Genera datos sintéticos para el dataset MedQA. Toma 'n' muestras y modifica ligeramente el texto en las columnas question y answer. """ sampled = df.sample(n, replace=True) modificaciones = [ "(consulta sintética)", "[versión aumentada]", "(datos generados)", "[synthetic data]" ] questions, answers = [], [] for _, row in sampled.iterrows(): mod = random.choice(modificaciones) question = str(row["question"]) + " " + mod answer = str(row["answer"]) + " " + mod questions.append(question) answers.append(answer) # Si quieres incluir opciones sintéticas, puedes generarlas de manera similar if 'options' in df.columns: options_sinteticas = [str(row["options"]) + " " + mod for _, row in sampled.iterrows()] df_synthetic = pd.DataFrame({ "question_sintetica": questions, "answer_sintetica": answers, "options_sinteticas": options_sinteticas }) else: df_synthetic = pd.DataFrame({ "question_sintetica": questions, "answer_sintetica": answers }) return df_synthetic # Generar y guardar datos sintéticos medqa_synthetic = generate_synthetic_medqa(medqa, n=100) medqa_synthetic.to_csv(synthetic_path / "medqa_synthetic.csv", index=False) # Combinar datos originales y sintéticos medqa_combined = pd.concat([medqa, medqa_synthetic], ignore_index=True) medqa_combined.to_csv(processed_path / "medqa_combined.csv", index=False) print("Datos procesados y sintéticos generados exitosamente para MedQA.")