ComenzarEmpieza gratis

Negación básica

Muy a menudo, tus usuarios te dirán lo que no quieren, ¡y eso también es importante entenderlo! En general, la negación es un problema difícil en PLN. Aquí usaremos un enfoque muy sencillo que funciona en muchos casos.

Se ha definido para ti una lista de pruebas llamada tests. Explórala en la Shell: verás que cada prueba es una tupla que consta de:

  • Una cadena con un mensaje que contiene entidades.
  • Un diccionario que contiene las entidades como claves y un valor booleano que indica si están negadas como valor.

Tu tarea es definir una función llamada negated_ents() que busque entidades negadas en un mensaje.

Este ejercicio forma parte del curso

Creación de chatbots en Python

Ver curso

Instrucciones del ejercicio

  • Usando una lista por comprensión, comprueba si las palabras "south" o "north" aparecen en el mensaje y extrae esas entidades.
  • Divide la frase en fragmentos que terminen con cada entidad. Para hacerlo:
    • Usa el método .index() de phrase para encontrar el índice inicial de cada entidad e y suma la longitud de la entidad para obtener el índice del final de la entidad.
    • Empezando con start=0, toma porciones de la cadena desde start hasta end para cada end en ends. Añade cada porción de la frase a la lista chunks. Asegúrate de actualizar tu posición inicial en cada iteración.
  • Para cada entidad, si "not" o "n't" aparece en el fragmento, considera esa entidad como negada.

Ejercicio interactivo práctico

Prueba este ejercicio y completa el código de muestra.

# Define negated_ents()
def negated_ents(phrase):
    # Extract the entities using keyword matching
    ents = [e for e in ["____", "____"] if e in phrase]
    # Find the index of the final character of each entity
    ends = sorted([____ + ____ for e in ents])
    # Initialise a list to store sentence chunks
    chunks = []
    # Take slices of the sentence up to and including each entitiy
    start = 0
    for end in ends:
        chunks.____(phrase[____:____])
        start = end
    result = {}
    # Iterate over the chunks and look for entities
    for chunk in chunks:
        for ent in ents:
            if ent in chunk:
                # If the entity contains a negation, assign the key to be False
                if "not" in chunk or "n't" in chunk:
                    result[ent] = ____
                else:
                    result[ent] = ____
    return result  

# Check that the entities are correctly assigned as True or False
for test in tests:
    print(negated_ents(test[0]) == test[1])
Editar y ejecutar código