shahidul034's picture
Add files using upload-large-folder tool
9c6961c verified
from openai import OpenAI
import re
client = OpenAI()
# --- Fernández Huerta formula ---
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)
# --- Prompt templates for each label ---
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.
"""
}
# --- Generate text for a label ---
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", # first try with mini
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content.strip()
# --- Regenerate if FH score is out of range ---
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", # use stronger model for regeneration
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content.strip()
# --- Target ranges for FH ---
RANGES = {
"easy": (70, 100),
"intermediate": (50, 70),
"hard": (0, 50)
}
# --- Full pipeline for one topic ---
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():
# Step 1: generate
text = generate_label_text(original_text, label)
# Step 2: check FH score
score = fernandez_huerta_score(text)
if not (target_range[0] <= score <= target_range[1]):
text = regenerate_label_text(original_text, text, label, target_range)
# Step 4: save
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
# --- Example usage ---
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)