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.

Análisis de texto: extracción de nombre de persona y cita: cómo crear un patrón

Necesito extraer un nombre y una cita de un texto dado como este:

Homero Simpson dijo: “Bueno, allá vamos…”

Los valores devueltos son:

  • extractedpersonname – El nombre de la persona extraído, tal como aparece en los patrones explicados anteriormente.
  • extracted_quotation – El texto citado extraído (sin las comillas que lo rodean).

  • Nota importante: si el patrón no se encuentra, devuelve valores “None” tanto para el nombre de la persona extraída como para el texto extraído.

Podrías esperar que el texto de entrada sea similar al siguiente patrón:

Nombre de la persona dijo: “texto citado”

Variaciones del patrón anterior:

El signo de puntuación dos puntos (:) es opcional y puede no aparecer en la oración de entrada. En lugar de la palabra “dijo”, también podrías esperar las palabras:

respondió, contestó, replicó

Esto es lo que tengo hasta ahora:

def person_quotation_pattern_extraction(raw_text):

name_pattern = "\w+\s\w+"
quote_pattern = "\"\w+\""

quote = re.search(quote_pattern, raw_text)
name = re.search(name_pattern, raw_text)

if re.search(quote_pattern, raw_text):
    extracted_quotation = quote.group(0)
else:
    extracted_quotation = None

if re.search(name_pattern, raw_text):
    extracted_person_name = name.group(0)
else:
    extracted_person_name = None

return extracted_person_name, extracted_quotation

El problema es que devuelve “Null”. Supongo que los patrones son incorrectos, ¿puedes decirme qué está mal con ellos?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Los patrones no tienen en cuenta las variaciones mencionadas en la indicación. Podrías intentar usar un patrón más flexible que permita diferentes palabras después del nombre de la persona, como “dijo”, “respondió”, “contestó”, “replicó”, y también que el signo de puntuación de dos puntos sea opcional. Un posible patrón que cubre estas variaciones podría ser:

    def person_quotation_pattern_extraction(raw_text):
    
        pattern = r'(\w+\s\w+)(?:[:,]?\s+)(?:dijo|respondió|contestó|replicó)?\s+[\"“”](.+?)[\"“”]'
        match = re.search(pattern, raw_text)
    
        if match:
            extracted_person_name = match.group(1)
            extracted_quotation = match.group(2)
        else:
            extracted_person_name = None
            extracted_quotation = None
    
        return extracted_person_name, extracted_quotation
    

    Este patrón captura el nombre de la persona en un grupo, seguido de un signo de puntuación opcional (dos puntos o coma) y las palabras “dijo”, “respondió”, “contestó” o “replicó”. Luego coincide con la comilla de apertura (que puede ser una comilla doble recta o diferentes tipos de comillas curvadas) y captura el texto citado en otro grupo. El +? hace que sea una coincidencia no ávida para que se detenga en la primera comilla de cierre que encuentre.

Comments are closed.