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.

Unificar las formas de nombre para la misma persona encontradas mediante NER con Spacy.

Tengo un documento de texto y quiero averiguar de qué persona se trata “principalmente”, mi aproximación de “principalmente” se definirá como la persona mencionada con más frecuencia.

Utilizo el Reconocimiento de Entidades Nombradas (NER) de Spacy para obtener una lista de todas las NER y luego filtro por el tipo == ‘PERSON’. Luego obtengo una distribución de frecuencia para cada persona. Esto funciona bien, pero Spacy trata cada token de entidad nombrada literal como diferente, es decir, “John Smith” no es “John” o “Smith”.

  1. ¿Existe un enfoque mejor para encontrar a la persona de la que se trata el texto “principalmente”?
  2. ¿Cómo puedo obtener un recuento combinado en el que se combinen diferentes formas de los mismos nombres?
  3. Puedo idear formas de hacer esto por mí mismo, pero ¿existe un nombre específico para este concepto, para poder investigar más?
  4. ¿Alguna biblioteca de procesamiento del lenguaje natural (como Spacy o NLTK, por ejemplo) tiene la capacidad de hacer esto?

Aquí está mi código actual y la salida:

import spacy
import nltk

# Cargar el tokenizador, etiquetador, analizador y NER en inglés
nlp = spacy.load("en_core_web_sm")

def get_frequency(word_list):
    """
    Obtener la frecuencia de cada palabra
    """
    freqs = nltk.FreqDist(word_list)
    freq_list = [(k, v) for k, v in freqs.items()]
    print(freq_list)
    print()

def get_ner_frequency(text):
    """
    Extraer Referencias de Entidades Nombradas (NER) de tipo 'PERSON' del texto
    """
    # Analizar con Spacy
    sp_doc = nlp(text)

    # Obtener entidades nombradas de personas
    people = [ent.text for ent in sp_doc.ents if ent.label_ == "PERSON"]

    return get_frequency(people)

text = """
Mr John Smith is a person.
Smith likes to ride horses.
Mike told John to be careful. J. Smith was very careful.
A man called Smithy told me to get a horse. John Smith fell off one day. John got hurt badly.
"""

get_ner_frequency(text)

Salida actual:

[('John Smith', 2), ('Smith', 1), ('Mike', 1), ('John', 2), ('J. Smith', 1), ('Smithy', 1)]

Idealmente, me gustaría que la salida se vea así:

[('John Smith', 7), ('Mike', 1)]

Como ocurre con la mayoría de los problemas de PLN, soy consciente de que esto no se puede hacer perfectamente en todos los casos, solo busco una aproximación decente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai
    1. ¿Existe un enfoque mejor para encontrar a la persona sobre la que trata más el texto?

    Un enfoque alternativo podría ser utilizar la resolución de correferencias, que consiste en encontrar todas las expresiones en un texto que se refieren a la misma entidad. Esto podría ayudar a combinar diferentes formas del mismo nombre (por ejemplo, “John Smith” y “John”). Spacy tiene algunas capacidades limitadas de resolución de correferencias, pero para obtener resultados más robustos, podría utilizarse un sistema de resolución de correferencias dedicado, como el proporcionado por la herramienta Stanford CoreNLP.

    1. ¿Cómo puedo obtener un recuento combinado en el que se combinen las diferentes formas de los mismos nombres?

    Una forma de lograr esto sería preprocesar el texto y reemplazar todas las menciones de la misma persona por una forma estándar, como el nombre completo o un identificador único. Esto se podría hacer utilizando la resolución de correferencias o aplicando algunas técnicas de procesamiento del lenguaje natural, como coincidencia basada en reglas o aprendizaje automático.

    1. Puedo encontrar formas de hacer esto por mí mismo, pero ¿hay algún nombre específico para este concepto para que pueda investigar más?

    El concepto de combinar diferentes formas del mismo nombre está relacionado con la resolución de entidades, que es la tarea de identificar todas las menciones en un texto que se refieren a la misma entidad del mundo real. En el contexto del procesamiento del lenguaje natural, esto generalmente implica procesar el texto para identificar entidades nombradas y luego emparejarlas en función de su similitud semántica o contexto.

    1. ¿Alguna biblioteca de procesamiento del lenguaje natural (Spacy o NLTK, por ejemplo) tiene la capacidad de hacer esto?

    Spacy tiene algunas capacidades limitadas de resolución de correferencias, pero para obtener resultados más robustos, podría utilizarse un sistema de resolución de correferencias dedicado, como el proporcionado por la herramienta Stanford CoreNLP. NLTK también tiene algunas herramientas para la resolución de correferencias, como el módulo de detección de menciones, pero podría requerir algún procesamiento y análisis adicional para combinar las diferentes formas del mismo nombre. Otras bibliotecas o frameworks de procesamiento del lenguaje natural también podrían tener capacidades similares, como Gensim o AllenNLP.

Comments are closed.