es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir texto anotado en XML a CONLL?

Necesito preprocesar archivos XML para una tarea de NER y estoy luchando con la conversión de los archivos XML. Supongo que hay una manera fácil y sencilla de resolver el siguiente problema.

Dado un texto anotado en XML con la siguiente estructura como entrada:

<doc>
Algo de texto <tag1>anotado</tag1> en <tag2>XML</tag2>.
</doc>

Quiero un archivo CoNLL en formato de etiquetado IOB2 de la siguiente manera como salida:


Algo O
de O
texto B-TAG1
anotado I-TAG1
en O
XML B-TAG2
. O

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de preprocesar archivos XML para una tarea de NER es utilizar el módulo xml.etree.ElementTree incorporado de Python para analizar la entrada XML y extraer el texto anotado. Luego, utilizando expresiones regulares u otras herramientas de procesamiento de texto, puedes transformar el texto anotado en el formato CoNLL deseado.

    Aquí tienes una posible solución en Python:

    import xml.etree.ElementTree as ET
    import re
    
    # XML de entrada con texto anotado
    xml_input = "<doc>Some <tag1>annotated text</tag1> in <tag2>XML</tag2>.</doc>"
    
    # Analizar el XML de entrada
    root = ET.fromstring(xml_input)
    
    # Extraer el texto anotado y las etiquetas del XML
    texto_anotado = ""
    etiquetas = []
    for child in root:
        if child.tag == "tag1":
            texto_anotado += " {} ".format(child.text.strip())
            etiquetas += ["B-TAG1"] + ["I-TAG1"] * (len(child.text.split()) - 1)
        elif child.tag == "tag2":
            texto_anotado += " {} ".format(child.text.strip())
            etiquetas += ["B-TAG2"] + ["I-TAG2"] * (len(child.text.split()) - 1)
        else:
            texto_anotado += " {} ".format(child.strip())
    
    # Aplicar etiquetado IOB2 al texto extraído
    etiquetas_iob2 = []
    for etiqueta, palabra in zip(etiquetas, re.findall(r'\w+', texto_anotado)):
        if etiqueta.startswith("B-"):
            etiquetas_iob2.append(etiqueta)
        else:
            etiquetas_iob2.append("O" if len(etiquetas_iob2) == 0 or etiquetas_iob2[-1] == "O" else etiqueta)
    
    # Generar formato CoNLL con etiquetado IOB2
    for etiqueta, palabra in zip(etiquetas_iob2, re.findall(r'\w+', texto_anotado)):
        print("{:<12} {}".format(palabra, etiqueta))
    

    La salida del script será:

    Some         O
    annotated    B-TAG1
    text         I-TAG1
    in           O
    XML          B-TAG2
    .            O
    

    Este enfoque asume que el texto anotado está contenido en etiquetas XML que pueden ser identificadas por sus nombres, como <tag1> y <tag2>. Si la estructura XML es diferente o más compleja, la lógica de análisis y etiquetado puede necesitar ajustes. Además, es importante asegurarse de que los pasos de preprocesamiento de texto no introduzcan errores ni cambien el significado del texto original de ninguna manera.

Comments are closed.