Download code/finetune-inference/old/api_call.py from shahidul034/readCtrl_lambda: direct link, hf CLI and curl.
- Browser
- Download file 4.58 kB
-
https://huggingface.co/shahidul034/readCtrl_lambda/resolve/main/code/finetune-inference/old/api_call.py
- Command line
-
hf download hf://shahidul034/readCtrl_lambda/code/finetune-inference/old/api_call.py
-
curl -L -o api_call.py https://huggingface.co/shahidul034/readCtrl_lambda/resolve/main/code/finetune-inference/old/api_call.py
4.58 kB
| 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) | |