Základní negace
Uživatelé ti velmi často řeknou, co nechtějí — a to je důležité pochopit! Negace je obecně v NLP složitý problém. Tady si ukážeme velmi jednoduchý přístup, který funguje v mnoha případech.
K dispozici máš seznam testů tests. Prozkoumej ho v Shellu — každý test je n-tice obsahující:
- Řetězec se zprávou, která obsahuje entity.
- Slovník, kde jsou entity klíče a hodnota je boolean říkající, zda jsou negovány.
Tvým úkolem je definovat funkci negated_ents(), která ve zprávě hledá negované entity.
Toto cvičení je součástí kurzu
Building Chatbots in Python
Pokyny k cvičení
- Pomocí list comprehension zkontroluj, jestli se ve zprávě vyskytují slova
"south"nebo"north", a extrahuj tyto entity. - Rozděl větu na části, které končí každou entitou. Postupuj takto:
- Pomocí metody
.index()naphrasenajdi počáteční index každé entityea přičti k němu délku entity, čímž získáš index jejího konce. - Začínaje hodnotou
start=0vytvárej řezy řetězce odstartdoendpro každéendvends. Každý řez přidej do seznamuchunks. Nezapomeň při každé iteraci aktualizovat počáteční pozici.
- Pomocí metody
- Pro každou entitu: pokud se v daném řezu vyskytuje
"not"nebo"n't", považuj tuto entitu za negovanou.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
# 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])