systemy_dialogowe/notebooks/11-generowanie-odpowiedzi.ipynb
2023-04-21 17:42:07 +02:00

7.6 KiB

Generowanie odpowiedzi

W systemie dialogowym taktyka prowadzenia dialogu odpowiada za wyznaczanie aktów systemowych, czyli wskazanie tego co ma zostać przez system wypowiedziane i/lub wykonane. Zadaniem modułu generowania odpowiedzi jest zamiana aktów dialogowych na wypowiedzi w języku naturalnym, czyli wskazanie tego w jaki sposób ma zostać wypowiedziane to co ma zostać wypowiedziane.

Generowanie odpowiedzi przy użyciu szablonów

Podstawowe narzędzie wykorzystywane w modułach generowania odpowiedzi stanowią szablony tekstowe interpolujące zmienne. W Pythonie mechanizm ten jest dostępny za pośrednictwem f-stringów, metody format oraz zewnętrznych bibliotek takich, jak Jinja2.

O ile podejście wykorzystujące wbudowane mechanizmy języka Python sprawdza się w prostych przypadkach...

def nlg(system_act):
    domain, intent, slot, value = system_act

    if intent == 'Inform' and slot == 'Phone':
        return f'Numer telefonu to {value}'
nlg(['Hotel', 'Inform', 'Phone', '1234567890'])

... to trzeba mieć świadomość, że w toku prac nad agentem dialogowym może być konieczne uwzględnienie m.in.:

  1. szablonów zależnych od wartości slotów
def nlg(system_act):
    domain, intent, slot, value = system_act

    if domain == 'Restaurant' and intent == 'Inform' and slot == 'Count':
        if value == 0:
            return f'Nie znalazłem restauracji spełniających podane kryteria.'
        elif value == 1:
            return f'Znalazłem jedną restaurację spełniającą podane kryteria.'
        elif value <= 4:
            return f'Znalazłem {value} restauracje spełniające podane kryteria.'
        elif value <= 9:
            return f'Znalazłem {value} restauracji spełniających podane kryteria.'
        else:
            return f'Znalazłem wiele restauracji spełniających podane kryteria.'
nlg(['Restaurant', 'Inform', 'Count', 0])
nlg(['Restaurant', 'Inform', 'Count', 1])
nlg(['Restaurant', 'Inform', 'Count', 2])
nlg(['Restaurant', 'Inform', 'Count', 6])
nlg(['Restaurant', 'Inform', 'Count', 100])
  1. wielu wariantów tej samej wypowiedzi
import random

def nlg(system_act):
    domain, intent, slot, value = system_act

    if intent == 'Affirm':
        r = random.randint(1, 3)

        if r == 1:
            return 'Tak'
        elif r == 2:
            return 'Zgadza się'
        else:
            return 'Potwierdzam'

nlg(['Hotel', 'Affirm', '', ''])
  1. wielojęzycznego interfejsu użytkownika
def nlg_en(system_act):
    domain, intent, slot, value = system_act

    if domain == 'Hotel' and intent == 'Request' and slot == 'CreditCardNo':
        return 'What is your credit card number?'
nlg_en(['Hotel', 'Request', 'CreditCardNo', '?'])

Generowanie odpowiedzi z wykorzystaniem uczenia maszynowego

Obok mechanizmu szablonów do generowania odpowiedzi można również stosować techniki uczenia maszynowego. Zagadnienie to stanowiło przedmiot konkursu E2E NLG Challenge (Novikova i in., 2017). Przyjrzyjmy się danym, jakie udostępnili organizatorzy.

!mkdir -p l11
!curl -L -C - https://github.com/tuetschek/e2e-dataset/releases/download/v1.0.0/e2e-dataset.zip -o l11/e2e-dataset.zip
!unzip l11/e2e-dataset.zip -d l11
import pandas as pd

trainset = pd.read_csv('l11/e2e-dataset/trainset.csv')
trainset

Zadanie

Zaimplementować moduł generowania odpowiedzi obejmujący akty systemowe występujące w zgromadzonym korpusie.

Literatura

  1. Jekaterina Novikova, Ondřej Dušek, Verena Rieser, The E2E Dataset: New Challenges For End-to-End Generation, Proceedings of the SIGDIAL 2017 Conference, pages 201-206, Saarbrücken, Germany https://arxiv.org/pdf/1706.09254.pdf