18 KiB
Systemy Dialogowe
5. Struktura dialogu [laboratoria]
Marek Kubis (2021)
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'])
[1;31m---------------------------------------------------------------------------[0m [1;31mModuleNotFoundError[0m Traceback (most recent call last) [1;32mc:\Develop\wmi\AITECH\sem1\Systemy dialogowe\lab\05-struktura-dialogu.ipynb Cell 7'[0m in [0;36m<cell line: 3>[1;34m()[0m [0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=0'>1</a>[0m [39mimport[39;00m [39mglob[39;00m [0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=1'>2</a>[0m [39mimport[39;00m [39mjson[39;00m [1;32m----> <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=2'>3</a>[0m [39mimport[39;00m [39mtabulate[39;00m [0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=3'>4</a>[0m [39mimport[39;00m [39mitertools[39;00m [0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=5'>6</a>[0m [39mdef[39;00m [39macts2desc[39m(acts): [1;31mModuleNotFoundError[0m: 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
Microsoft Excel, Office 365 itp.
Literatura
Austin, John Langshaw, How to Do Things with Words, Oxford, 1962.
John Searle, Speech Acts, Cambridge University Press, 1969, ISBN 0-521-09626-X.
Dorota Zdunkiewicz, Akty mowy, Współczesny język polski, Wrocław, 1993, pp. 259-270.
Matthew Henderson, Blaise Thomson, Jason D. Williams, The Second Dialog State Tracking Challenge, SIGDIAL 2014, 263-272.