SystemyDialogowe/AJN_final (1).ipynb
2022-06-13 19:24:31 +02:00

18 KiB
Raw Blame History

%%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
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-8ae578ffe68d> in <module>
----> 1 result = ajn.nlu('Chcialabym zarezerwowac 10 biletow na film corke na 16 45')
      2 result

TypeError: 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