| | 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) |
| |
|