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.
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 aget_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: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: