SystemyDialogowe-ProjektMag.../lab/05-struktura-dialogu.ipynb
2022-04-10 11:55:42 +02:00

18 KiB
Raw Permalink Blame History

Logo 1

Systemy Dialogowe

5. Struktura dialogu [laboratoria]

Marek Kubis (2021)

Logo 2

Struktura dialogu

Dialog można podzielić na _tury będące naprzemiennymi wypowiedziami poszczególnych uczestników konwersacji.

Akty mowy

Akcje podejmowane przez mówców za pomocą wypowiedzi nazywamy _aktami mowy.

Aspekty aktów mowy według Austina (za Zdunkiewicz 1993)

Aspekt Opis
lokucyjny dotyczy samego procesu tworzenia określonego wyrażenia (bez uwzględnienia kontekstu)
illokucyjny dotyczy tego co mówca chce osiągnąć za pośrednictwem danej wypowiedzi (np. prośba, ostrzeżenie, obietnica, żądanie)
perlokucyjny dotyczy ubocznych celów i rezeltatów osiągniętych za pośrednictwem danej wypowiedzi (np. zlekceważenie, obraza, rozbawienie)

Klasyfikacja aktów mowy według Searla (za Zdunkiewicz 1993)

Typ Cel Przykłady
asercja (assertive) przedstawienie sądu o stanie rzeczy wątpienie
dyrektywa (directive) wywieranie nacisku na odbiorcę rozkaz, prośba
komisywa (commisive) podjecie zobowiązania obietnica, zobowiązanie
ekspresywa (expressive) wyrażenie stanu emocjonalnego gratulacje, kondolencje
deklaratywa (declarative) wywołanie określonego stanu rzeczy w stosunkach społecznych mianowanie

Akty dialogowe

Budując system dialogowy zwykle przyjmuje się węższa i jednocześnie bardziej szczegółową klasyfikację. Tzw. _akty dialogowe stanowią reprezentację znaczenia wypowiedzi użytkownika i/lub systemu.

Przyjrzyjmy się teraz klasyfikacji aktów dialogowych, które Henderson i in. (2013), wzorując się na Youngu i in. (2010), przyjęli na potrzeby ewaluacji systemów rekomendujących restauracje.

!mkdir -p l04
%cd l04
!wget -c https://github.com/matthen/dstc/releases/download/v1/dstc2_test.tar.gz
!tar xzvf dstc2_test.tar.gz
%cd ..

Akty użytkownika

Typ Opis
ack potwierdzenie
affirm zatwierdzenie
bye zakończenie rozmowy
hello przywitanie
help prośba o pomoc (bez szczegółów)
negate zaprzeczenie
null akt niezrozumiały dla systemu
repeat prośba o powtórzenie
reqalts prośba o alternatywną rekomendację
reqmore prośba o uszczegółowienie
restart żądanie restartu
silence cisza
thankyou podziękowanie
confirm potwierdzenie wartości slotu
deny odrzucenie wartości slotu
inform przekazanie wartości slotu
request prośba o podanie wartości slotu

Zilustrujmy powyższe zestawienie przykładami bezpośrednio ze zbioru testowego konkursu _Dialog State Tracking Challenge 2.

import glob
import json
import tabulate
import itertools

def acts2desc(acts):
    descs = []

    for intent, iacts in itertools.groupby(sorted(acts, key=lambda x: x['act']), key=lambda x: x['act']):
        slots = ','.join(f'{slot[0]}={slot[1]}' if slot[0] != 'slot' else slot[1] for act in iacts for slot in act['slots'])
        descs.append(f'{intent}({slots})')

    return '&'.join(descs) if descs else 'null()'

examples = set()

for path in sorted(glob.glob('l04/data/**/label.json', recursive=True)):
    if len(examples) > 30:
        break

    with open(path) as f:
        for turn in json.load(f)['turns']:
            examples.add((acts2desc(turn['semantics']['json']), turn['transcription']))
            # examples.add(((turn['semantics']['cam']), turn['transcription']))

tabulate.tabulate(examples, tablefmt='html', headers=['act', 'utterance'])
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
c:\Develop\wmi\AITECH\sem1\Systemy dialogowe\lab\05-struktura-dialogu.ipynb Cell 7' in <cell line: 3>()
      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=0'>1</a> import glob
      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=1'>2</a> import json
----> <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=2'>3</a> import tabulate
      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=3'>4</a> import itertools
      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=5'>6</a> def acts2desc(acts):

ModuleNotFoundError: No module named 'tabulate'

Powyższe przykłady pokazują, że tury nie zawsze są pełnymi zdaniami. Komunikacja przy użyciu mowy ma spontaniczny charakter, stąd w toku konwersacji mogą pojawić się poprawki, wtręty czy żądania restartu.

Akty systemu

Typ Opis
affirm potwierdzenie
bye zakończenie rozmowy
canthear „nic nie słyszę”
confirm-domain prośba o potwierdzenie dziedziny
negate zaprzeczenie
repeat prośba o powtórzenie
reqmore sprawdzenie czy użytkownik chce dodatkowych informacji
welcomemsg przywitanie
canthelp „nie mogę pomóc”
canthelp.missing_slot_value „potrzebuję poznać wartość slotu, żeby pomóc”
expl-conf potwierdzenie (wprost), że slot ma daną wartość
impl-conf potwierdzenie (nie wprost), że slot ma daną wartość
inform poinformowanie użytkownika, o przyjętej wartości slotu
offer rekomendacja (restauracji)
request pytanie użytkownika o wartość slotu
select prośba o dokonanie wyboru spośród przedstawionych opcji

Przyjrzyjmy się również przykładom aktów systemowych.

import glob
import json
import tabulate

examples = set()

for path in sorted(glob.glob('l04/data/**/log.json', recursive=True)):
    if len(examples) > 30:
        break

    with open(path) as f:
        for turn in json.load(f)['turns']:
            output = turn['output']
            examples.add((acts2desc(output['dialog-acts']), output['transcript']))

tabulate.tabulate(examples, tablefmt='html', headers=['act', 'utterance'])

Jak widać w powyższym ujęciu akty dialogowe takie jak inform, request czy expl-conf mogą przyjmować pewne parametry.

Ramy

Strukturą danych powszechnie wykorzystywaną w systemach dialogowych do reprezentacji wiedzy jest _rama (ang. frame). Ramy są wykorzystywane zarówno do reprezentowania poszczególnych aktów mowy jak i do modelowania bieżącego stanu dialogu oraz celów użytkownika. Rama ma nazwę oraz pewną liczbę _slotów. Każdy slot ma określoną nazwę oraz wartość.

Ramy przedstawione poniżej stanowią reprezentacje aktów dialogowych.

import json

samples = ['voip-00d76b791d-20130327_005342',
           'voip-00d76b791d-20130327_012544',
           'voip-0f41c16f2f-20130402_004710']

for sample in samples:
    with open(f'l04/data/Mar13_S2A0/{sample}/label.json') as f:
        print(json.dumps(json.load(f)['turns'][3]['semantics']['json'], indent=2))

Zadanie

Opisać wypowiedzi użytkownika i odpowiedzi systemu zgromadzone w Państwa korpusie eksperymentalnym (tj. plikach *.tsv w katalogu data) aktami dialogowymi.

Uwagi

  • Akty reprezentujące znaczenie poszczególnych wypowiedzi należy umieszczać w trzeciej kolumnie plików *.tsv.

  • Do zapisu aktów proszę stosować notację wykorzystywaną w przykładach (inform(phone=01223 244277)&offer(name=the lucky star)).

  • Klasyfikacja aktów dialogowych przedstawiona przez Hendersona i in. (2013) może stanowić dobry punkt wyjścia, ale nie trzeba się jej kurczowo trzymać.

Przykładowe narzędzia do oznaczania tekstu

Literatura

  1. Austin, John Langshaw, How to Do Things with Words, Oxford, 1962.

  2. John Searle, Speech Acts, Cambridge University Press, 1969, ISBN 0-521-09626-X.

  3. Dorota Zdunkiewicz, Akty mowy, Współczesny język polski, Wrocław, 1993, pp. 259-270.

  4. Matthew Henderson, Blaise Thomson, Jason D. Williams, The Second Dialog State Tracking Challenge, SIGDIAL 2014, 263-272.