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 obtener entidades de un texto y vincularlas con el ID del archivo fuente?

Tengo un archivo CSV con algunas columnas, incluyendo una columna de identificación y una columna de texto.

Archivo de origen de ejemplo:
source_file

Me gustaría extraer el texto y la etiqueta de la entidad utilizando spaCy. Luego, escribir el texto de la entidad y la etiqueta en un dataframe con la identificación correspondiente de origen. Es muy posible que una oración contenga más de una entidad. Esas entidades deberían tener la misma identificación.

desired_output

Pensé que usar la función “pd apply” es la mejor opción para hacer esto, pero obtengo un error. ¿Alguien puede decirme qué estoy haciendo mal?

df = pd.read_csv(r'data/test_data.csv')
nlp = spacy.load("nl_core_news_lg")
ner_entities = []

def get_entities(row):
    entity_id = row['id']
    text = row['text']
    doc = nlp(text)
    for ent in doc.ents:
        ner_entities.append([entity_id, ent.text, ent.label_])

df.apply(lambda row: get_entities(row))
ner_df = pd.DataFrame(ner_entities, columns=['id', 'ent', 'label'])
merged_df = pd.merge(df, ner_df, on='id', how='outer')

Recibo el siguiente mensaje de error:
error message

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Hay algunos problemas en el código proporcionado:

    1. Text debe ser text en la línea 8 (doc = nlp(text)).
    2. La función get_entities necesita devolver la lista de entidades extraídas.
    3. En lugar de usar df.apply con una función lambda, simplemente podemos recorrer las filas del dataframe utilizando df.iterrows().

    Aquí está el código corregido:

    import pandas as pd
    import spacy
    
    df = pd.read_csv('data/test_data.csv')
    nlp = spacy.load('nl_core_news_lg')
    ner_entities = []
    
    def get_entities(row):
        entity_id = row['id']
        text = row['text']
        doc = nlp(text)
        entities = [[entity_id, ent.text, ent.label_] for ent in doc.ents]
        return entities
    
    for _, row in df.iterrows():
        ner_entities.extend(get_entities(row))
    
    ner_df = pd.DataFrame(ner_entities, columns=['id', 'ent', 'label'])
    merged_df = pd.merge(df, ner_df, on='id', how='outer')
    

    Este código debería extraer correctamente las entidades del texto y crear un nuevo dataframe que incluya las entidades con sus respectivos ids.

Comments are closed.