18 KiB
18 KiB
%%writefile ./grammar/hello.jsgf
#JSGF V1.0 UTF-8 pl;
grammar hello;
public <hello> = <words_hello>;
<words_hello> = czesc | hej | witaj | hey | hello | dzień dobry | siema | siemanko;
%%writefile ./grammar/repertuar.jsgf
#JSGF V1.0 UTF-8 pl;
grammar repertuar;
public <repertuar> = <prosba> [aktualny | obecny | aktualnie | obecnie | teraz] [repertuar];
<prosba> = prosze podac | podaj | jaki jest | co [teraz] gracie | co leci | jakie sa filmy | jakie filmy gracie;
Overwriting ./grammar/repertuar.jsgf
%%writefile ./grammar/cancel.jsgf
#JSGF V1.0 UTF-8 pl;
grammar cancel;
public <odwolaj> = <prosba> <anulacja>;
<prosba> = chce | chcialbym | chcialabym | prosze;
<anulacja> = odwolac | zrezygnowac | anulowac ([bilety]|[bilet]|[z biletow]|[rezerwacje]|[z rezerwacji]);
%%writefile ./grammar/book.jsgf
#JSGF V1.0 UTF-8 pl;
grammar book;
public <rezerwuj> = <prosba> [<ilosc_biletow>] [<tytul_filmu>] [<dzien_rezerwacji>] [<godzina_rezerwacji>];
<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];
<ilosc_biletow> = <liczba> {ilosc} (bilety | biletow | bilet);
<liczba> = jeden | dwa | trzy | cztery | piec | szesc | siedem | osiem | dziewiec | dziesiec |1|2|3|4|5|6|7|8|9|10;
<tytul_filmu> = na [film] <tytul> {tytul};
<tytul> = Batman | Batmana | Uncharted | Pitbull | Ambulans | Bunkier strachu | Corka | Corke | Inni ludzie | Śmierć na Nilu | Skarb Mikołajka;
<dzien_rezerwacji> = na <dzien> {dzien};
<dzien> = (dzisiaj | jutro | poniedziałek | wtorek | srode | czwartek | piatek | sobotę | niedziele) | <data>;
<data> = (8|9|10|11|12|13|14|15) [czerwca];
<godzina_rezerwacji> = na [godzinę] <godzina_z_minutami> {godzina};
<godzina_z_minutami> = <godzina> [<minuty>];
<godzina> = 10|11|12|13|14|15|16|17|18|19|20|21|22|23 | dziesiata | jedenasta | dwunasta | trzynasta | czternasta | pietnasta | szesnasta | siedemnasta | osiemnasta | dziewietnasta | dwudziesta;
<minuty> = pietnaście | trzydzieści | czterdziesci piec| 15 | 30 | 45;
Overwriting ./grammar/book.jsgf
%%writefile ./grammar/ilosc_bil.jsgf
#JSGF V1.0 UTF-8 pl;
grammar ilosc_bil;
public <ilosc_bil> = [<prosba>] [<ilosc_biletow>];
<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];
<ilosc_biletow> = <liczba> {ilosc} [(bilety | biletow | bilet)];
<liczba> = jeden | dwa | trzy | cztery | piec | szesc | siedem | osiem | dziewiec | dziesiec |1|2|3|4|5|6|7|8|9|10;
Overwriting ./grammar/ilosc_bil.jsgf
%%writefile ./grammar/tyt_filmu.jsgf
#JSGF V1.0 UTF-8 pl;
grammar tyt_filmu;
public <tyt_filmu> = [<prosba>] [<tytul_filmu>];
<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];
<tytul_filmu> = [na] [film] <tytul> {tytul};
<tytul> = Batman | Batmana | Uncharted | Pitbull | Ambulans | Bunkier strachu | Corka | Corke | Inni ludzie | Śmierć na Nilu | Skarb Mikołajka;
Overwriting ./grammar/tyt_filmu.jsgf
%%writefile ./grammar/dni.jsgf
#JSGF V1.0 UTF-8 pl;
grammar dni;
public <dni> = [<prosba>] [<dzien_rezerwacji>];
<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];
<dzien_rezerwacji> = na <dzien> {dzien};
<dzien> = (dzisiaj | jutro | poniedziałek | wtorek | srode | czwartek | piatek | sobotę | niedziele) | <data>;
<data> = (8|9|10|11|12|13|14|15) [czerwca];
Overwriting ./grammar/dni.jsgf
%%writefile ./grammar/godziny.jsgf
#JSGF V1.0 UTF-8 pl;
grammar godziny;
public <godziny> = [<prosba>] [<godzina_rezerwacji>];
<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];
<godzina_rezerwacji> = na [godzinę] <godzina_z_minutami> {godzina};
<godzina_z_minutami> = <godzina> [<minuty>];
<godzina> = 10|11|12|13|14|15|16|17|18|19|20|21|22|23 | dziesiata | jedenasta | dwunasta | trzynasta | czternasta | pietnasta | szesnasta | siedemnasta | osiemnasta | dziewietnasta | dwudziesta;
<minuty> = pietnaście | trzydzieści | czterdziesci piec| 15 | 30 | 45;
Overwriting ./grammar/godziny.jsgf
%%writefile ./grammar/miejsca.jsgf
#JSGF V1.0 UTF-8 pl;
grammar miejsca;
public <miejsca> = [z | na | w] <miejsce> {miejsce};
<miejsce> = dole | gorze | srodku | tylu | blizej | przodu;
Overwriting ./grammar/miejsca.jsgf
%%writefile ./grammar/nr_tel.jsgf
#JSGF V1.0 UTF-8 pl;
grammar numer;
public <numer> = <nr> {numer};
<nr> = 123456789 | 123123123 | 123456123;
Overwriting ./grammar/nr_tel.jsgf
import jsgf
from os import listdir
from os.path import isfile, join
mypath = "./grammar/"
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
grammars = []
for grammarFile in onlyfiles:
grammar = jsgf.parse_grammar_file(mypath + grammarFile)
grammars.append(grammar)
def get_dialog_act(rule):
slots = []
get_slots(rule.expansion, slots)
return {'act': rule.grammar.name, 'slots': slots}
def get_slots(expansion, slots):
if expansion.tag != '':
slots.append((expansion.tag, expansion.current_match))
return
for child in expansion.children:
get_slots(child, slots)
if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef):
get_slots(expansion.referenced_rule.expansion, slots)
def nlu(utterance):
matched = None
for grammar in grammars:
matched = grammar.find_matching_rules(utterance)
if matched:
break
if matched:
return get_dialog_act(matched[0])
else:
return {'act': 'null', 'slots': []}
def ajn(text):
frame = nlu(text)
return frame
ajn = Ajn()
ajn.nlu
<bound method Ajn.nlu of <__main__.Ajn object at 0x7f2ffa712630>>
result = ajn.nlu('Chcialabym zarezerwowac 10 biletow na film corke na 16 45')
result
[0;31m---------------------------------------------------------------------------[0m [0;31mTypeError[0m Traceback (most recent call last) [0;32m<ipython-input-7-8ae578ffe68d>[0m in [0;36m<module>[0;34m[0m [0;32m----> 1[0;31m [0mresult[0m [0;34m=[0m [0majn[0m[0;34m.[0m[0mnlu[0m[0;34m([0m[0;34m'Chcialabym zarezerwowac 10 biletow na film corke na 16 45'[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 2[0m [0mresult[0m[0;34m[0m[0;34m[0m[0m [0;31mTypeError[0m: nlu() takes 1 positional argument but 2 were given
!jupyter nbconvert --to script MST.ipynb
!jupyter nbconvert --to script AJN_final.ipynb
import jsgf
from os import listdir
from os.path import isfile, join
mypath = "./grammar/"
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
grammars = []
for grammarFile in onlyfiles:
grammar = jsgf.parse_grammar_file(mypath + grammarFile)
grammars.append(grammar)
def get_dialog_act(rule):
slots = []
get_slots(rule.expansion, slots)
return {'act': rule.grammar.name, 'slots': slots}
def get_slots(expansion, slots):
if expansion.tag != '':
slots.append((expansion.tag, expansion.current_match))
return
for child in expansion.children:
get_slots(child, slots)
if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef):
get_slots(expansion.referenced_rule.expansion, slots)
def nlu(utterance):
matched = None
for grammar in grammars:
matched = grammar.find_matching_rules(utterance)
if matched:
break
if matched:
return get_dialog_act(matched[0])
else:
return {'act': 'null', 'slots': []}
res = nlu('chcialbym zarezerwowac 2 bilety na corke na 16')
ajn = Ajn()
res
{'act': 'book', 'slots': [('ilosc', '2'), ('tytul', 'Corke'), ('dzien', None), ('godzina', '16')]}
class Dst:
def __init__(self):
self.messages = []
self.checklist = {
"ilosc": None,
"tytul": None,
"dzien": None,
"godzina": None
}
self.history = []
def store(self, message):
self.messages.append(message)
def get_messages(self):
return self.messages
def get_next_question(self):
for key, value in self.checklist.items():
if value == None:
return key
def save_answer(self, slots):
for slot in slots:
self.checklist[slot[0]] = slot[1]
self.messages.append(slots)
def update(self, user_act=None):
for intent, domain, slot, value in user_act:
domain = domain.lower()
intent = intent.lower()
slot = slot.lower()
print(domain,intent,slot)
dst = Dst()
dst.save_answer(res['slots'])
res['slots']
[('ilosc', '2'), ('tytul', 'Corke'), ('dzien', None), ('godzina', '16')]
next_question = dst.get_next_question()
print(dst.checklist)
{'ilosc': '2', 'tytul': 'Corke', 'dzien': None, 'godzina': '16'}
user_act
next_question = dst.get_next_question()
while (next_question):
print(next_question)
response = input()
res = nlu(response)
dst.save_answer(res['slots'])
next_question = dst.get_next_question()
dzien