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.

Spacy extrae las relaciones de entidades y parsea el árbol de dependencias.

Estoy tratando de extraer entidades y sus relaciones del texto. Estoy intentando analizar el árbol de dependencias con la extracción de entidades para realizar esa acción. Algo debe estar mal con la lógica de la función recursiva que me impide poder analizar esa información, pero no veo lo que es. Quería usar el árbol de dependencias + entidades para formar una extracción de (persona, acción, ubicación).

Resultado deseado: Persona: Lou Pinella, acción: salió, Ubicación: Estadio

Ejemplo de código:

import spacy
from spacy import displacy

nlp = spacy.load('en_core_web_lg')
doc = nlp("Lou Pinella salió desde el lado izquierdo del Estadio.")

def obtener_entidades_hijas(cabeza):
    if cabeza.children:
        for hijo in cabeza.children:
            if hijo.ent_type_ == "LOC":
                print(f'Ubicación encontrada: {hijo}') # está llegando a esta rama
                return hijo
            else:
                return obtener_entidades_hijas(hijo)
    else:
        return "No hay hijos"

for ent in doc.ents:
    print(ent.text, ent.label_)
    if ent.label_ == "PERSON":
        persona = ent.text
        cabeza = ent.root.head
        ubicacion = obtener_entidades_hijas(cabeza)
        print(f'Persona: {persona}')
        print(f'Cabeza: {cabeza}')
        print(f'Persona: {persona}, acción:{cabeza}, Ubicación:{ubicacion}')


displacy.render(doc, options={"fine_grained": True})

Declaraciones de impresión – Se puede ver que está llegando a la lógica de ubicación e imprimiendo eso, pero el retorno sigue siendo None en la función recursiva.

Lou Pinella PERSON
Ubicación encontrada: Estadio
Persona: Lou Pinella
Cabeza: salió
Persona: Lou Pinella, acción:salió, Ubicación:None
Estadio LOC

EDITADO: se agregó el retorno de obtenerhijo(hijo) en el else.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado se encuentra en la función get_children_ent. Específicamente, cuando el primer hijo no es de tipo entidad LOC, la función retorna sin realizar una nueva recursión. En cambio, el código debería intentar llamar a get_children_ent de forma recursiva para todos los hijos, y devolver el primer resultado que no esté vacío. Aquí está el ejemplo de código corregido:

    import spacy
    from spacy import displacy
    
    nlp = spacy.load('en_core_web_lg')
    doc = nlp("Lou Pinella salió del lado izquierdo del estadio.")
    
    def get_children_ent(head):
        for child in head.children:
            if child.ent_type_ == "LOC":
                print(f'Se encontró Loc: {child}') # se está ejecutando esta rama
                return child
            else:
                result = get_children_ent(child)
                if result:
                    return result
        return None
    
    for ent in doc.ents:
        print(ent.text, ent.label_)
        if ent.label_ == "PERSON":
            person = ent.text
            head = ent.root.head
            loc = get_children_ent(head)
            print(f'Persona: {person}, acción:{head}, Lugar:{loc}')
    
    displacy.render(doc, options={"fine_grained": True})
    

    Cabe destacar que en el código corregido, get_children_ent intenta llamarse a sí misma de forma recursiva para todos los hijos que no sean de tipo entidad LOC, y solo retorna si se encuentra un resultado no vacío. De esta manera, la función debería ser capaz de recorrer correctamente el árbol y devolver la entidad de ubicación apropiada.

    Con el código anterior, la salida debería ser:

    Lou Pinella PERSON
    Se encontró Loc: Estadio
    Persona: Lou Pinella, acción:salió, Lugar:Estadio
    

Comments are closed.