¿Puede LangExtract convertir las notas clínicas desordenadas en datos estructurados?

Langextract es un desarrolladores de Google Eso hace que sea fácil convertir el texto desordenado y no estructurado en datos limpios y estructurados al aprovechar los LLM. Los usuarios pueden proporcionar algunos ejemplos de pocos disparos junto con un esquema personalizado y obtener resultados basados en eso. Funciona tanto con LLMS como propietarios como locales (a través de Ollama).

Una cantidad significativa de datos en la atención médica no está estructurada, lo que lo convierte en un área ideal donde una herramienta como esta puede ser beneficiosa. Las notas clínicas son largas y llenas de abreviaturas e inconsistencias. Los detalles importantes, como los nombres de drogas, las dosis y especialmente las reacciones adversas a los medicamentos (ADR), se enterran en el texto. Por lo tanto, para este artículo, quería ver si LangExtract podía manejar la detección de reacción de fármacos adversos (ADR) en notas clínicas. Más importante aún, ¿es efectivo? Averigamos en este artículo. Tenga en cuenta que, si bien Langexact es un proyecto de código abierto de desarrolladores de Google, no es un producto de Google compatible oficialmente.

Solo una nota rápida: solo estoy mostrando cómo funciona LanExtract. No soy médico, y este no es un consejo médico.

▶ ️ Aquí hay un detallado Cuaderno de kaggle seguir

Por qué es importante la extracción ADR

Un Reacción de drogas adversas (ADR) es un resultado dañino e involuntario causado por tomar un medicamento. Estos pueden variar desde efectos secundarios leves como náuseas o mareos hasta resultados severos que pueden requerir atención médica.

El paciente toma medicina para el dolor de cabeza pero desarrolla dolor de estómago; Una reacción típica de fármaco adverso (ADR) | Imagen creada por el autor usando chatgpt

Detectarlos rápidamente es fundamental para la seguridad del paciente y farmacovigilancia. El desafío es que en las notas clínicas, los ADR están enterrados junto con condiciones pasadas, resultados de laboratorio y otro contexto. Como resultado, detectarlos es complicado. El uso de LLM para detectar ADR es un área continua de investigación. Alguno obras recientes han demostrado que los LLM son buenos para elevar las banderas rojas pero no confiables. Por lo tanto, la extracción de ADR es una buena prueba de estrés para langextract, ya que el objetivo aquí es ver si esta biblioteca puede detectar las reacciones adversas entre otras entidades en notas clínicas como medicamentos, dosis, gravedad, etc.

Cómo funciona Langextract

Antes de saltar al uso, desglosemos el flujo de trabajo de Langextract. Es un proceso simple de tres pasos:

  1. Defina su tarea de extracción Al escribir un mensaje claro que especifica exactamente lo que desea extraer.
  2. Proporcionar algunos ejemplos de alta calidad Para guiar el modelo hacia el formato y el nivel de detalle que espera.
  3. Envíe su texto de entrada, elija el modelo y deje que LangExtract lo procese. Los usuarios pueden Luego revise los resultados, visualícelos o póngalos directamente en su tubería aguas abajo.

El funcionario Repositorio de Github de la herramienta tiene ejemplos detallados que abarcan múltiples dominios, desde la extracción de entidades en Romeo y Julieta de Shakespeare hasta la identificación de medicamentos en notas clínicas y la estructuración de informes de radiología. Échales un vistazo.

Instalación

Primero necesitamos instalar el LangExtract biblioteca. Siempre es una buena idea hacer esto dentro de un entorno virtual Para mantener aisladas las dependencias de su proyecto.

pip install langextract

Identificación de reacciones adversas de fármacos en notas clínicas con Langextract & Gemini

Ahora vamos a nuestro caso de uso. Para este tutorial, usaré Google Géminis 2.5 Flash modelo. También podrías usar Géminis Pro para tareas de razonamiento más complejas. Primero deberá configurar su clave API:

export LANGEXTRACT_API_KEY="your-api-key-here"

▶ ️ Aquí hay un detallado Cuaderno de kaggle seguir

Paso 1: Defina la tarea de extracción

Creemos nuestro aviso para extraer medicamentos, dosis, reacciones adversas y acciones tomadas. También podemos pedir severidad donde se menciona.

prompt = textwrap.dedent("""\
Extract medication, dosage, adverse reaction, and action taken from the text.
For each adverse reaction, include its severity as an attribute if mentioned.
Use exact text spans from the original text. Do not paraphrase.
Return entities in the order they appear.""")
La nota resalta el ibuprofeno (400 mg), la reacción adversa (dolor de estómago leve) y la acción tomada (deteniendo el medicamento). Así es como se ve la extracción ADR en la práctica. | Imagen del autor

A continuación, proporcionemos un ejemplo para guiar el modelo hacia el formato correcto:

# 1) Define the prompt
prompt = textwrap.dedent("""\
Extract condition, medication, dosage, adverse reaction, and action taken from the text.
For each adverse reaction, include its severity as an attribute if mentioned.
Use exact text spans from the original text. Do not paraphrase.
Return entities in the order they appear.""")

# 2) Example 
examples = [
    lx.data.ExampleData(
        text=(
            "After taking ibuprofen 400 mg for a headache, "
            "the patient developed mild stomach pain. "
            "They stopped taking the medicine."
        ),
        extractions=[
            
            lx.data.Extraction(
                extraction_class="condition",
                extraction_text="headache"
            ),
        
            lx.data.Extraction(
                extraction_class="medication",
                extraction_text="ibuprofen"
            ),
            lx.data.Extraction(
                extraction_class="dosage",
                extraction_text="400 mg"
            ),
            lx.data.Extraction(
                extraction_class="adverse_reaction",
                extraction_text="mild stomach pain",
                attributes={"severity": "mild"}
            ),
            lx.data.Extraction(
                extraction_class="action_taken",
                extraction_text="They stopped taking the medicine"
            )
        ]
    )
]

Paso 2: proporcionar la entrada y ejecutar la extracción

Para la entrada, estoy usando una oración clínica real del Ade Corpus V2 conjunto de datos en la cara abrazada.

input_text = (
    "A 27-year-old man who had a history of bronchial asthma, "
    "eosinophilic enteritis, and eosinophilic pneumonia presented with "
    "fever, skin eruptions, cervical lymphadenopathy, hepatosplenomegaly, "
    "atypical lymphocytosis, and eosinophilia two weeks after receiving "
    "trimethoprim (TMP)-sulfamethoxazole (SMX) treatment."
)

A continuación, ejecutemos LangExtract con el modelo Gemini-2.5-Flash.

result = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",
    api_key=LANGEXTRACT_API_KEY 
)

Paso 3: Ver los resultados

Puede mostrar las entidades extraídas con posiciones

print(f"Input: {input_text}\n")
print("Extracted entities:")
for entity in result.extractions:
    position_info = ""
    if entity.char_interval:
        start, end = entity.char_interval.start_pos, entity.char_interval.end_pos
        position_info = f" (pos: {start}-{end})"
    print(f"• {entity.extraction_class.capitalize()}: {entity.extraction_text}{position_info}")

Langextract identifica correctamente el reacción de drogas adversas Sin confundirlo con las condiciones preexistentes del paciente, que es un desafío clave en este tipo de tarea.

Si quieres visualizarlo, va a crear esto .jsonl archivo. Puedes cargar eso .jsonl Archivo llamando a la función de visualización, y creará un archivo HTML para usted.

lx.io.save_annotated_documents(
    [result],
    output_name="adr_extraction.jsonl",
    output_dir="."
)

html_content = lx.visualize("adr_extraction.jsonl")

# Display the HTML content directly
display((html_content))

Trabajando con notas clínicas más largas

Las notas clínicas reales a menudo son mucho más largas que el ejemplo que se muestra arriba. Por ejemplo, aquí hay una nota real del ADE-Corpus-V2 conjunto de datos liberado bajo el Licencia de MIT. Puedes acceder a él Cara abrazada o Zenodo.

Extracto de una nota clínica de la ADE-Corpus-V2 conjunto de datos liberado bajo el Licencia de MIT | Imagen del autor

Para procesar textos más largos con LangExtract, mantiene el mismo flujo de trabajo pero agregue tres parámetros:

extracción_passes ejecuta múltiples pases sobre el texto para detectar más detalles y mejorar el retiro.

Max_Workers Controles El procesamiento paralelo para que los documentos más grandes se puedan manejar más rápido.

max_char_buffer Divida el texto en trozos más pequeños, lo que ayuda al modelo a mantenerse preciso incluso cuando la entrada es muy larga.

result = lx.extract(
    text_or_documents=input_text,
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",
    extraction_passes=3,    
    max_workers=20,         
    max_char_buffer=1000   
)

Aquí está la salida. Para la brevedad, solo estoy mostrando una parte de la salida aquí.


Si lo desea, también puede pasar la URL de un documento directamente al text_or_documents parámetro.


Uso de Langextract con modelos locales a través de Ollama

Langextract no se limita a las API patentadas. También puede ejecutarlo con modelos locales a través de Ollama. Esto es especialmente útil cuando se trabaja con datos clínicos sensibles a la privacidad que no pueden abandonar su entorno seguro. Puede configurar Ollama localmente, tirar de su modelo preferido y señalar con él. Las instrucciones completas están disponibles en el documentos oficiales.

Conclusión

Si está creando un sistema de recuperación de información o cualquier aplicación que involucre la extracción de metadatos, LangExtract puede ahorrarle una cantidad significativa de esfuerzo de preprocesamiento. En mis experimentos de ADR, LangExtract se desempeñó bien, identificando correctamente medicamentos, dosis y reacciones. Lo que noté es que la salida depende directamente de la calidad de los ejemplos de pocos disparos proporcionados por el usuario, lo que significa que mientras LLMS hace el trabajo pesado, los humanos siguen siendo una parte importante del bucle. Los resultados fueron alentadores, pero dado que los datos clínicos son pruebas de alto riesgo, más amplias y más rigurosas en diversos conjuntos de datos todavía se necesitan antes de avanzar hacia el uso de la producción.