File size: 27,939 Bytes
1db7196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d3bff56e",
   "metadata": {},
   "source": [
    "https://lmarena.ai/c/9fa09cff-fb85-4719-80db-188a19de0803"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1a11463f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import random\n",
    "from typing import List, Dict, Any, Optional\n",
    "\n",
    "# Your existing prompts for different readability levels\n",
    "PROMPTS = {\n",
    "    \"easy\": '''\n",
    "You are an assistant that rewrites Spanish texts to make them very simple and easy to understand.\n",
    "Your goal is to rewrite the provided input text for younger readers (Fernández Huerta 70–100; grade 5–7).\n",
    "Use short sentences, simple words, and friendly tone. Avoid technical or complex expressions.\n",
    "Keep all important factual details, but remove jargon.\n",
    "Return only the rewritten text without commentary.\n",
    "''',\n",
    "    \"intermediate\": '''\n",
    "You are an assistant specialized in rewriting Spanish texts with medium readability.\n",
    "Your task is to rewrite the provided input text for general or high‑school‑level readers (Fernández Huerta 50–70; grade 8–12).\n",
    "Use clear and complete sentences, moderately complex vocabulary, and structured narration.\n",
    "Retain all relevant medical or factual information, but phrase it in accessible language.\n",
    "Return only the rewritten text with no explanations.\n",
    "''',\n",
    "    \"hard\": '''\n",
    "You are an assistant that rewrites Spanish medical texts with professional, technical precision.\n",
    "Rewrite the following input text using specialized, academic terminology and information‑dense phrasing.\n",
    "The output must target a Fernández Huerta readability index between 0 and 50 (university/professional level).\n",
    "Use clinical vocabulary, formal register, and detailed description of pathophysiology, procedures, and findings.\n",
    "Return only the rewritten text.\n",
    "'''\n",
    "}\n",
    "\n",
    "# Thinking templates for processing medical reports\n",
    "THINKING_TEMPLATES = {\n",
    "    \"input_analysis\": [\n",
    "        \"\"\"Estoy analizando este informe médico. Primero debo identificar:\n",
    "1. Datos del paciente: {patient_info}\n",
    "2. Diagnóstico principal: {diagnosis}\n",
    "3. Síntomas y signos clínicos: {symptoms}\n",
    "4. Pruebas realizadas: {tests}\n",
    "5. Tratamiento: {treatment}\n",
    "\n",
    "Ahora debo adaptar esta información al nivel de lectura solicitado: {difficulty}.\"\"\",\n",
    "\n",
    "        \"\"\"Este es un informe médico que necesito reescribir. Contiene:\n",
    "- Información clínica sobre {diagnosis}\n",
    "- Terminología médica como: {medical_terms}\n",
    "- Datos técnicos que debo {action} según el nivel {difficulty}\n",
    "Mi objetivo es mantener la precisión médica mientras ajusto la complejidad del lenguaje.\"\"\"\n",
    "    ],\n",
    "    \n",
    "    \"easy\": [\n",
    "        \"\"\"Para nivel fácil (FH 70-100), debo:\n",
    "1. Cambiar \"{medical_term}\" por \"{simple_term}\"\n",
    "2. Dividir oraciones largas en frases cortas\n",
    "3. Eliminar jerga médica innecesaria\n",
    "4. Usar palabras que un niño de 10-12 años entienda\n",
    "5. Mantener la historia clara y simple\n",
    "\n",
    "Voy a contar esto como una historia sobre {patient_description} que {simple_story}.\"\"\",\n",
    "\n",
    "        \"\"\"Necesito simplificar mucho este texto:\n",
    "- Cambiar términos médicos complejos por palabras cotidianas\n",
    "- Usar máximo 10-15 palabras por oración\n",
    "- Explicar todo como si fuera para un niño\n",
    "- Mantener solo la información esencial\n",
    "- Hacer que suene amigable y no aterrador\"\"\",\n",
    "    ],\n",
    "    \n",
    "    \"intermediate\": [\n",
    "        \"\"\"Para nivel intermedio (FH 50-70), mi estrategia es:\n",
    "1. Mantener algunos términos médicos pero explicarlos brevemente\n",
    "2. Usar oraciones de complejidad media (15-20 palabras)\n",
    "3. Estructurar la información en párrafos lógicos\n",
    "4. Incluir detalles relevantes sin ser excesivamente técnico\n",
    "5. Vocabulario apropiado para estudiantes de secundaria\n",
    "\n",
    "El texto debe ser informativo pero accesible, manteniendo {key_concepts} pero explicando {complex_terms}.\"\"\",\n",
    "\n",
    "        \"\"\"Nivel intermedio requiere equilibrio:\n",
    "- Puedo usar términos como \"{medical_term}\" pero debo contextualizarlos\n",
    "- Las oraciones pueden ser más complejas pero claras\n",
    "- Incluir información sobre causas y efectos\n",
    "- Mantener estructura narrativa coherente\n",
    "- Apropiado para lectores con educación media\"\"\",\n",
    "    ],\n",
    "    \n",
    "    \"hard\": [\n",
    "        \"\"\"Para nivel profesional (FH 0-50), debo maximizar la precisión técnica:\n",
    "1. Usar nomenclatura médica internacional: {technical_terms}\n",
    "2. Incluir todos los valores de laboratorio y mediciones específicas\n",
    "3. Emplear terminología especializada sin simplificación\n",
    "4. Formato de historia clínica hospitalaria\n",
    "5. Densidad informativa máxima\n",
    "\n",
    "Estructuraré según: Anamnesis → Exploración física → Pruebas complementarias → Diagnóstico → Plan terapéutico.\"\"\",\n",
    "\n",
    "        \"\"\"Reescritura altamente técnica requerida:\n",
    "- Incorporar clasificaciones internacionales (CIE-10, DSM-5, etc.)\n",
    "- Detallar fisiopatología y mecanismos moleculares\n",
    "- Usar abreviaturas médicas estándar\n",
    "- Incluir diagnósticos diferenciales\n",
    "- Lenguaje de publicación científica\n",
    "- Máxima densidad de información médica especializada\"\"\",\n",
    "    ]\n",
    "}\n",
    "\n",
    "class MedicalReportProcessor:\n",
    "    \"\"\"Process medical reports and create training data with thinking mode.\"\"\"\n",
    "    \n",
    "    def __init__(self, original_report: str):\n",
    "        \"\"\"\n",
    "        Initialize with the original medical report.\n",
    "        \n",
    "        Args:\n",
    "            original_report: The original medical report text to be rewritten\n",
    "        \"\"\"\n",
    "        self.original_report = original_report\n",
    "        self.medical_entities = self.extract_medical_entities(original_report)\n",
    "    \n",
    "    def extract_medical_entities(self, text: str) -> Dict[str, List[str]]:\n",
    "        \"\"\"Extract medical entities from the report.\"\"\"\n",
    "        # This is a simplified extraction - you might want to use a medical NER model\n",
    "        entities = {\n",
    "            \"diagnosis\": [],\n",
    "            \"symptoms\": [],\n",
    "            \"medications\": [],\n",
    "            \"tests\": [],\n",
    "            \"medical_terms\": []\n",
    "        }\n",
    "        \n",
    "        # Common medical terms to look for\n",
    "        diagnosis_keywords = [\"diagnóstico\", \"síndrome\", \"enfermedad\", \"trastorno\", \"patología\", \n",
    "                             \"neurofibromatosis\", \"nf1\", \"tdah\", \"déficit\"]\n",
    "        symptom_keywords = [\"dolor\", \"mancha\", \"nódulo\", \"bulto\", \"lesión\", \"síntoma\",\n",
    "                           \"retraso\", \"dificultad\", \"problema\"]\n",
    "        medication_keywords = [\"medicamento\", \"tratamiento\", \"terapia\", \"metilfenidato\", \"fármaco\"]\n",
    "        test_keywords = [\"biopsia\", \"ecografía\", \"análisis\", \"prueba\", \"examen\", \"resonancia\"]\n",
    "        \n",
    "        text_lower = text.lower()\n",
    "        \n",
    "        # Extract based on keywords\n",
    "        for keyword in diagnosis_keywords:\n",
    "            if keyword in text_lower:\n",
    "                entities[\"diagnosis\"].append(keyword)\n",
    "        \n",
    "        for keyword in symptom_keywords:\n",
    "            if keyword in text_lower:\n",
    "                entities[\"symptoms\"].append(keyword)\n",
    "        \n",
    "        for keyword in medication_keywords:\n",
    "            if keyword in text_lower:\n",
    "                entities[\"medications\"].append(keyword)\n",
    "        \n",
    "        for keyword in test_keywords:\n",
    "            if keyword in text_lower:\n",
    "                entities[\"tests\"].append(keyword)\n",
    "        \n",
    "        # Extract all medical terms\n",
    "        all_medical = diagnosis_keywords + symptom_keywords + medication_keywords + test_keywords\n",
    "        for term in all_medical:\n",
    "            if term in text_lower:\n",
    "                entities[\"medical_terms\"].append(term)\n",
    "        \n",
    "        return entities\n",
    "    \n",
    "    def generate_input_thinking(self, difficulty: str) -> str:\n",
    "        \"\"\"Generate thinking for understanding the input medical report.\"\"\"\n",
    "        template = random.choice(THINKING_TEMPLATES[\"input_analysis\"])\n",
    "        \n",
    "        thinking = template.format(\n",
    "            patient_info=\"paciente de 18 años\" if \"18 años\" in self.original_report else \"paciente\",\n",
    "            diagnosis=\", \".join(self.medical_entities[\"diagnosis\"][:2]) or \"condición médica\",\n",
    "            symptoms=\", \".join(self.medical_entities[\"symptoms\"][:3]) or \"síntomas diversos\",\n",
    "            tests=\", \".join(self.medical_entities[\"tests\"][:2]) or \"estudios clínicos\",\n",
    "            treatment=\", \".join(self.medical_entities[\"medications\"][:2]) or \"tratamiento\",\n",
    "            difficulty=difficulty,\n",
    "            medical_terms=\", \".join(self.medical_entities[\"medical_terms\"][:3]),\n",
    "            action=\"simplificar mucho\" if difficulty == \"easy\" else \"adaptar\" if difficulty == \"intermediate\" else \"tecnificar\"\n",
    "        )\n",
    "        \n",
    "        return thinking\n",
    "    \n",
    "    def generate_output_thinking(self, difficulty: str, rewritten_text: str) -> str:\n",
    "        \"\"\"Generate thinking for the rewriting process.\"\"\"\n",
    "        template = random.choice(THINKING_TEMPLATES[difficulty])\n",
    "        \n",
    "        # Customize based on difficulty\n",
    "        if difficulty == \"easy\":\n",
    "            thinking = template.format(\n",
    "                medical_term=self.medical_entities[\"medical_terms\"][0] if self.medical_entities[\"medical_terms\"] else \"término médico\",\n",
    "                simple_term=\"enfermedad\" if \"neurofibromatosis\" in self.medical_entities[\"diagnosis\"] else \"problema de salud\",\n",
    "                patient_description=\"un joven\",\n",
    "                simple_story=\"tenía una enfermedad especial desde pequeño\"\n",
    "            )\n",
    "        elif difficulty == \"intermediate\":\n",
    "            thinking = template.format(\n",
    "                key_concepts=\", \".join(self.medical_entities[\"diagnosis\"][:2]) or \"conceptos médicos principales\",\n",
    "                complex_terms=\", \".join(self.medical_entities[\"medical_terms\"][:3]) or \"terminología especializada\",\n",
    "                medical_term=self.medical_entities[\"medical_terms\"][0] if self.medical_entities[\"medical_terms\"] else \"término médico\"\n",
    "            )\n",
    "        else:  # hard\n",
    "            thinking = template.format(\n",
    "                technical_terms=\", \".join(self.medical_entities[\"medical_terms\"][:5]) or \"terminología especializada\"\n",
    "            )\n",
    "        \n",
    "        return thinking\n",
    "    \n",
    "    def create_training_example(self, difficulty: str, rewritten_text: str, fh_score: float) -> Dict:\n",
    "        \"\"\"Create a complete training example with thinking.\"\"\"\n",
    "        \n",
    "        # Generate system message\n",
    "        system_content = PROMPTS[difficulty].strip()\n",
    "        \n",
    "        # Generate thinking for input and output\n",
    "        input_thinking = self.generate_input_thinking(difficulty)\n",
    "        output_thinking = self.generate_output_thinking(difficulty, rewritten_text)\n",
    "        \n",
    "        # Create the message structure\n",
    "        messages = [\n",
    "            {\n",
    "                \"content\": f\"reasoning language: Spanish\\n\\n{system_content}\",\n",
    "                \"role\": \"system\",\n",
    "                \"thinking\": None\n",
    "            },\n",
    "            {\n",
    "                \"content\": f\"Please rewrite the following medical report to achieve a Fernández Huerta score of {fh_score:.1f} (difficulty level: {difficulty}):\\n\\n{self.original_report}\",\n",
    "                \"role\": \"user\",\n",
    "                \"thinking\": input_thinking\n",
    "            },\n",
    "            {\n",
    "                \"content\": rewritten_text,\n",
    "                \"role\": \"assistant\",\n",
    "                \"thinking\": output_thinking\n",
    "            }\n",
    "        ]\n",
    "        \n",
    "        return {\"messages\": messages}\n",
    "\n",
    "def process_medical_dataset_with_original(\n",
    "    original_reports: List[str],\n",
    "    readability_versions_list: List[Dict],\n",
    "    include_variations: bool = True\n",
    ") -> List[Dict]:\n",
    "    \"\"\"\n",
    "    Process medical dataset with original reports and create training data.\n",
    "    \n",
    "    Args:\n",
    "        original_reports: List of original medical reports\n",
    "        readability_versions_list: List of dictionaries with readability versions\n",
    "        include_variations: Whether to include cross-difficulty variations\n",
    "    \n",
    "    Returns:\n",
    "        List of training examples with thinking mode\n",
    "    \"\"\"\n",
    "    training_dataset = []\n",
    "    \n",
    "    for original_report, versions_dict in zip(original_reports, readability_versions_list):\n",
    "        processor = MedicalReportProcessor(original_report)\n",
    "        readability_versions = versions_dict.get(\"readability_versions\", {})\n",
    "        \n",
    "        # Create training examples for each difficulty level\n",
    "        for difficulty, content in readability_versions.items():\n",
    "            rewritten_text = content[\"text\"]\n",
    "            fh_score = content[\"FH_score\"]\n",
    "            \n",
    "            training_example = processor.create_training_example(\n",
    "                difficulty=difficulty,\n",
    "                rewritten_text=rewritten_text,\n",
    "                fh_score=fh_score\n",
    "            )\n",
    "            \n",
    "            training_dataset.append(training_example)\n",
    "        \n",
    "        # Optionally create cross-difficulty variations\n",
    "        if include_variations:\n",
    "            difficulties = list(readability_versions.keys())\n",
    "            \n",
    "            # Create some mixed examples (e.g., easy to hard, hard to intermediate)\n",
    "            for _ in range(2):  # Create 2 variations per report\n",
    "                source_diff = random.choice(difficulties)\n",
    "                target_diff = random.choice([d for d in difficulties if d != source_diff])\n",
    "                \n",
    "                # Use source difficulty text as \"original\" for variation\n",
    "                source_text = readability_versions[source_diff][\"text\"]\n",
    "                target_text = readability_versions[target_diff][\"text\"]\n",
    "                target_fh = readability_versions[target_diff][\"FH_score\"]\n",
    "                \n",
    "                # Create processor for this variation\n",
    "                var_processor = MedicalReportProcessor(source_text)\n",
    "                variation_example = var_processor.create_training_example(\n",
    "                    difficulty=target_diff,\n",
    "                    rewritten_text=target_text,\n",
    "                    fh_score=target_fh\n",
    "                )\n",
    "                \n",
    "                training_dataset.append(variation_example)\n",
    "    \n",
    "    return training_dataset\n",
    "\n",
    "# Example usage\n",
    "if __name__ == \"__main__\":\n",
    "    # Example original medical reports (these would be your actual original reports)\n",
    "    original_medical_reports = [\n",
    "        \"\"\"Paciente masculino de 18 años con diagnóstico molecular confirmado de Neurofibromatosis tipo 1 \n",
    "        (deleción exones 5-47 del gen NF1), que presenta antecedentes de retraso del desarrollo psicomotor \n",
    "        global diagnosticado a los 3 años, trastorno específico del lenguaje de tipo expresivo que requirió \n",
    "        intervención fonoaudiológica, y TDAH en tratamiento con metilfenidato 20mg/día con buena respuesta. \n",
    "        Hallazgos oftalmológicos incluyen nódulos de Lisch bilaterales, astigmatismo miópico compuesto y \n",
    "        euriblefaron bilateral. Motivo de consulta actual: aparición de placa eritematosa de 3cm en muslo \n",
    "        izquierdo de 12 meses de evolución y múltiples nódulos subcutáneos móviles no dolorosos en región \n",
    "        supraciliar derecha, occipital y muñeca izquierda. Examen físico revela macrocefalia (PC 59cm, >p97), \n",
    "        15 máculas café con leche >1.5cm, efélides axilares e inguinales bilaterales, y 3 máculas \n",
    "        rojo-azuladas deprimidas de 0.5-1cm en región lumbar y pectoral derecha. Estudios histopatológicos \n",
    "        confirman neurofibromas con inmunohistoquímica S100(+), SOX10(+). Ecografía de partes blandas \n",
    "        muestra lesiones hipoecoicas bien delimitadas compatibles con neurofibromas subcutáneos.\"\"\"\n",
    "    ]\n",
    "    \n",
    "    # Your readability versions data\n",
    "    readability_data = [\n",
    "        {\n",
    "            \"readability_versions\": {\n",
    "                \"easy\": {\n",
    "                    \"text\": \"Un joven de 18 años tenía una enfermedad llamada Neurofibromatosis tipo 1 desde que era bebé. Esta enfermedad produce manchas café con leche en la piel y pequeños bultos. Durante su infancia tuvo algunas dificultades para hablar y moverse bien, por lo que recibió terapias especiales. En la adolescencia le dieron medicamentos para mejorar su concentración. A los 18 años fue al dermatólogo porque le salió una nueva mancha en el muslo y algunos bultos en la piel. Le hicieron exámenes y confirmaron que eran parte de su enfermedad. Los médicos clasificaron los distintos tipos de manchas y bultos que tenía en la piel.\",\n",
    "                    \"FH_score\": 77.16\n",
    "                },\n",
    "                \"intermediate\": {\n",
    "                    \"text\": \"Un joven de 18 años con Neurofibromatosis tipo 1, diagnosticada desde el primer año de vida, había presentado dificultades motoras y del lenguaje durante la infancia, además de problemas visuales como nódulos de Lisch y astigmatismo. Fue tratado por Trastorno por Déficit Atencional con buenos resultados académicos. Consultó en Dermatología por una nueva mancha en el muslo izquierdo y la aparición de nódulos en zonas como la muñeca y el cuero cabelludo. En el examen se observaron manchas café con leche, pecas en las axilas y varios bultos pequeños bajo la piel. Se realizaron biopsias y ecografías que confirmaron que las lesiones correspondían a diferentes tipos de neurofibromas superficiales, los cuales fueron clasificados según su forma y localización.\",\n",
    "                    \"FH_score\": 62.77\n",
    "                },\n",
    "                \"hard\": {\n",
    "                    \"text\": \"Varón de 18 años con diagnóstico clínico y molecular de Neurofibromatosis tipo 1 (deleción de exones 5-47 del gen NF1), con antecedentes de retraso psicomotor global, trastorno específico del lenguaje expresivo, TDAH tratado con metilfenidato y hallazgos oftalmológicos compatibles con NF1 (nódulos de Lisch, astigmatismo y euriblefaron). Acude a Dermatología por aparición de placa rosada en muslo izquierdo de un año de evolución y nódulos subcutáneos móviles en región supraciliar derecha, occipital y muñeca. El examen físico revela macrocefalia, múltiples máculas café con leche, efélides axilares y máculas rojo-azuladas deprimidas en región lumbar y pectoral. Las biopsias cutáneas y ecografía de nódulos confirmaron neurofibromas superficiales. Según la clasificación de García-Martínez et al., se diagnosticaron simultáneamente neurofibromas subcutáneos nodulares, cutáneos pseudoatróficos y cutáneos rojo-azulados, evidenciando la heterogeneidad fenotípica de la enfermedad en un mismo paciente.\",\n",
    "                    \"FH_score\": 39.94\n",
    "                }\n",
    "            }\n",
    "        }\n",
    "    ]\n",
    "    \n",
    "    # Process the dataset with original reports\n",
    "    training_dataset = process_medical_dataset_with_original(\n",
    "        original_reports=original_medical_reports,\n",
    "        readability_versions_list=readability_data,\n",
    "        include_variations=True\n",
    "    )\n",
    "    \n",
    "    # Save the training dataset\n",
    "    with open(\"medical_report_finetuning_with_thinking.jsonl\", \"w\", encoding=\"utf-8\") as f:\n",
    "        for example in training_dataset:\n",
    "            f.write(json.dumps(example, ensure_ascii=False) + \"\\n\")\n",
    "    \n",
    "    # Print example for verification\n",
    "    print(\"Example training data with original medical report:\")\n",
    "    print(json.dumps(training_dataset[0], ensure_ascii=False, indent=2))\n",
    "    \n",
    "    # Print statistics\n",
    "    print(f\"\\n📊 Dataset Statistics:\")\n",
    "    print(f\"Total training examples: {len(training_dataset)}\")\n",
    "    print(f\"Number of messages per example: {len(training_dataset[0]['messages'])}\")\n",
    "    print(f\"All examples have thinking: {all('thinking' in msg for ex in training_dataset for msg in ex['messages'])}\")\n",
    "    \n",
    "    # Validate the structure\n",
    "    for i, example in enumerate(training_dataset):\n",
    "        assert len(example['messages']) == 3, f\"Example {i} doesn't have 3 messages\"\n",
    "        assert example['messages'][0]['role'] == 'system', f\"Example {i} first message is not system\"\n",
    "        assert example['messages'][1]['role'] == 'user', f\"Example {i} second message is not user\"\n",
    "        assert example['messages'][2]['role'] == 'assistant', f\"Example {i} third message is not assistant\"\n",
    "        assert 'thinking' in example['messages'][1], f\"Example {i} user message missing thinking\"\n",
    "        assert 'thinking' in example['messages'][2], f\"Example {i} assistant message missing thinking\"\n",
    "    \n",
    "    print(\"✅ All validation checks passed!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "123b65b3",
   "metadata": {},
   "source": [
    "Example training data with original medical report:\n",
    "{\n",
    "  \"messages\": [\n",
    "    {\n",
    "      \"content\": \"reasoning language: Spanish\\n\\nYou are an assistant that rewrites Spanish texts to make them very simple and easy to understand.\\nYour goal is to rewrite the provided input text for younger readers (Fernández Huerta 70–100; grade 5–7).\\nUse short sentences, simple words, and friendly tone. Avoid technical or complex expressions.\\nKeep all important factual details, but remove jargon.\\nReturn only the rewritten text without commentary.\",\n",
    "      \"role\": \"system\",\n",
    "      \"thinking\": null\n",
    "    },\n",
    "    {\n",
    "      \"content\": \"Please rewrite the following medical report to achieve a Fernández Huerta score of 77.2 (difficulty level: easy):\\n\\nPaciente masculino de 18 años con diagnóstico molecular confirmado de Neurofibromatosis tipo 1 \\n        (deleción exones 5-47 del gen NF1), que presenta antecedentes de retraso del desarrollo psicomotor \\n        global diagnosticado a los 3 años, trastorno específico del lenguaje de tipo expresivo que requirió \\n        intervención fonoaudiológica, y TDAH en tratamiento con metilfenidato 20mg/día con buena respuesta. \\n        Hallazgos oftalmológicos incluyen nódulos de Lisch bilaterales, astigmatismo miópico compuesto y \\n        euriblefaron bilateral. Motivo de consulta actual: aparición de placa eritematosa de 3cm en muslo \\n        izquierdo de 12 meses de evolución y múltiples nódulos subcutáneos móviles no dolorosos en región \\n        supraciliar derecha, occipital y muñeca izquierda. Examen físico revela macrocefalia (PC 59cm, >p97), \\n        15 máculas café con leche >1.5cm, efélides axilares e inguinales bilaterales, y 3 máculas \\n        rojo-azuladas deprimidas de 0.5-1cm en región lumbar y pectoral derecha. Estudios histopatológicos \\n        confirman neurofibromas con inmunohistoquímica S100(+), SOX10(+). Ecografía de partes blandas \\n        muestra lesiones hipoecoicas bien delimitadas compatibles con neurofibromas subcutáneos.\",\n",
    "      \"role\": \"user\",\n",
    "      \"thinking\": \"Estoy analizando este informe médico. Primero debo identificar:\\n1. Datos del paciente: paciente de 18 años\\n2. Diagnóstico principal: diagnóstico, trastorno\\n3. Síntomas y signos clínicos: dolor, nódulo, retraso\\n4. Pruebas realizadas: ecografía, examen\\n5. Tratamiento: tratamiento, metilfenidato\\n\\nAhora debo adaptar esta información al nivel de lectura solicitado: easy.\"\n",
    "    },\n",
    "    {\n",
    "      \"content\": \"Un joven de 18 años tenía una enfermedad llamada Neurofibromatosis tipo 1 desde que era bebé. Esta enfermedad produce manchas café con leche en la piel y pequeños bultos. Durante su infancia tuvo algunas dificultades para hablar y moverse bien, por lo que recibió terapias especiales. En la adolescencia le dieron medicamentos para mejorar su concentración. A los 18 años fue al dermatólogo porque le salió una nueva mancha en el muslo y algunos bultos en la piel. Le hicieron exámenes y confirmaron que eran parte de su enfermedad. Los médicos clasificaron los distintos tipos de manchas y bultos que tenía en la piel.\",\n",
    "      \"role\": \"assistant\",\n",
    "      \"thinking\": \"Necesito simplificar mucho este texto:\\n- Cambiar términos médicos complejos por palabras cotidianas\\n- Usar máximo 10-15 palabras por oración\\n- Explicar todo como si fuera para un niño\\n- Mantener solo la información esencial\\n- Hacer que suene amigable y no aterrador\"\n",
    "    }\n",
    "  ]\n",
    "}\n",
    "\n",
    "📊 Dataset Statistics:\n",
    "Total training examples: 5\n",
    "Number of messages per example: 3\n",
    "All examples have thinking: True\n",
    "✅ All validation checks passed!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "unsloth_latest",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}