| from openai import OpenAI |
| import re |
|
|
| client = OpenAI() |
|
|
| |
| def fernandez_huerta_score(text: str) -> float: |
| sentences = re.split(r'[.!?]+', text) |
| sentences = [s.strip() for s in sentences if s.strip()] |
| n_sentences = len(sentences) if sentences else 1 |
|
|
| words = text.split() |
| n_words = len(words) if words else 1 |
|
|
| vowels = "aeiouáéíóúüAEIOUÁÉÍÓÚÜ" |
| n_syllables = sum(sum(1 for ch in word if ch in vowels) for word in words) |
|
|
| return 206.84 - 0.60 * (n_syllables / n_words * 100) - 1.02 * (n_words / n_sentences) |
|
|
|
|
| |
| LABEL_PROMPTS = { |
| "easy": """Texto original: |
| {original_text} |
| |
| Reescribe el texto en un lenguaje muy simple, frases cortas y vocabulario fácil, adecuado para estudiantes de 5º a 7º grado. |
| El resultado debe seguir lógicamente el texto original y mantener el mismo significado. |
| No añadas información nueva, no elimines detalles importantes ni cambies los hechos. |
| """, |
| "intermediate": """Texto original: |
| {original_text} |
| |
| Reescribe el texto con una complejidad moderada, frases más largas y vocabulario variado, adecuado para secundaria/bachillerato (8º a 12º grado). |
| El resultado debe seguir lógicamente el texto original y mantener el mismo significado. |
| No añadas información nueva, no elimines detalles importantes ni cambies los hechos. |
| """, |
| "hard": """Texto original: |
| {original_text} |
| |
| Reescribe el texto con lenguaje técnico, detallado y especializado, adecuado para universidad o profesionales. |
| El resultado debe seguir lógicamente el texto original y mantener el mismo significado. |
| No añadas información nueva, no elimines detalles importantes ni cambies los hechos. |
| """ |
| } |
|
|
|
|
| |
| def generate_label_text(original_text: str, label: str) -> str: |
| prompt = LABEL_PROMPTS[label].format(original_text=original_text) |
| response = client.chat.completions.create( |
| model="gpt-5-mini", |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| return response.choices[0].message.content.strip() |
|
|
|
|
| |
| def regenerate_label_text(original_text: str, old_text: str, label: str, target_range: tuple) -> str: |
| prompt = f"""Texto original: |
| {original_text} |
| |
| Texto generado (necesita ajuste): |
| {old_text} |
| |
| El texto anterior no cumple con el rango de legibilidad {target_range}. |
| Reescribe nuevamente el texto en el nivel "{label}", ajustando la dificultad |
| para que el puntaje de Fernández Huerta quede dentro del rango {target_range}. |
| El resultado debe seguir lógicamente el texto original y mantener el mismo significado. |
| No añadas información nueva, no elimines detalles importantes ni cambies los hechos. |
| """ |
| response = client.chat.completions.create( |
| model="gpt-5", |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| return response.choices[0].message.content.strip() |
|
|
|
|
|
|
| |
| RANGES = { |
| "easy": (70, 100), |
| "intermediate": (50, 70), |
| "hard": (0, 50) |
| } |
|
|
|
|
| |
| def generate_synthetic_data(original_text: str, original_language: str, topic: str, data_id: int): |
| results = { |
| "id": data_id, |
| "original_text_language": original_language, |
| "source_topic": topic, |
| "readability_versions": {} |
| } |
|
|
| for label, target_range in RANGES.items(): |
| |
| text = generate_label_text(original_text, label) |
|
|
| |
| score = fernandez_huerta_score(text) |
| if not (target_range[0] <= score <= target_range[1]): |
| text = regenerate_label_text(original_text, text, label, target_range) |
|
|
|
|
| |
| results["readability_versions"][label] = { |
| "readability_level": label, |
| "fernandez_huerta_range": f"{target_range[0]}-{target_range[1]}", |
| "target_audience": ( |
| "Estudiantes de primaria/media (5º a 7º grado)" if label == "easy" else |
| "Secundaria/Bachillerato (8º a 12º grado)" if label == "intermediate" else |
| "Profesionales / Universidad o posgrado" |
| ), |
| "text": text |
| } |
|
|
| return results |
|
|
|
|
| |
| if __name__ == "__main__": |
| original_text = "Se diagnosticó osteoartritis bilateral en un paciente de 61 años con dolor en la ingle." |
| data = generate_synthetic_data(original_text, "es", "Osteoartritis de cadera", 1) |
| print(data) |
|
|