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
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()dephrasepara encontrar el índice inicial de cada entidadey suma la longitud de la entidad para obtener el índice del final de la entidad. - Empezando con
start=0, toma porciones de la cadena desdestarthastaendpara cadaendenends. Añade cada porción de la frase a la listachunks. Asegúrate de actualizar tu posición inicial en cada iteración.
- Usa el método
- 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])