diff --git a/.gitignore b/.gitignore index 292dcb8..0f7e3af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ -*.vs +*.vs +*.vscode +__pychache__/ DialogSystems/ \ No newline at end of file diff --git a/DialogManager.ipynb b/DialogManager.ipynb new file mode 100644 index 0000000..e69de29 diff --git a/__pycache__/example_nlu.cpython-310.pyc b/__pycache__/example_nlu.cpython-310.pyc new file mode 100644 index 0000000..612df6c Binary files /dev/null and b/__pycache__/example_nlu.cpython-310.pyc differ diff --git a/dictionary.json b/dictionary.json new file mode 100644 index 0000000..0189f20 --- /dev/null +++ b/dictionary.json @@ -0,0 +1,35 @@ +{ + "user_act":[ + + ], + "system_act":[ + + ], + "belief_state":{ + "payment":{ + "type":"", + "amount":"", + "loyalty_card":"" + }, + "delivery":{ + "type":"", + "address":"", + "time":"" + }, + "product":{ + "name":"", + "type":"", + "brand":"", + "price":"", + "quantity":"", + "quality":"" + } + }, + "request_state":{ + + }, + "terminated":false, + "history":[ + + ] +} \ No newline at end of file diff --git a/evaluate.py b/evaluate.py new file mode 100644 index 0000000..1f2f62d --- /dev/null +++ b/evaluate.py @@ -0,0 +1,45 @@ +import csv +import example_nlu as en + +rows = [] + + +def readData(): + ii = [5, 6, 7, 8] + jj = [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] + kk = [1, 2] + + for i in ii: + for j in jj: + for k in kk: + try: + if j < 10: + with open(f'./data/dialog-0{i}-0{j}-0{k}.tsv', 'r') as read_obj: + csv_reader = csv.reader(read_obj, delimiter='\t') + for row in csv_reader: + if 'user' in row[0]: + rows.append(row[1]) + else: + with open(f'./data/dialog-0{i}-{j}-0{k}.tsv', 'r') as read_obj: + csv_reader = csv.reader(read_obj, delimiter='\t') + for row in csv_reader: + if 'user' in row[0]: + rows.append(row[1]) + except: + pass + +if __name__ == "__main__": + readData() + #l = en.predict('Kup cztery wody') + #print(l) + + good = 0 + + for r in rows: + l = en.predict(str(r)) + if l != []: + good += 1 + + print(f'Accuracy: {good/len(rows)*100}%') + +en.predict('rock and stone') \ No newline at end of file diff --git a/example_nlu.py b/example_nlu.py index 4212277..04d273b 100644 --- a/example_nlu.py +++ b/example_nlu.py @@ -1,44 +1,53 @@ -import jsgf -from pathlib import Path -import os - -__location__ = Path().resolve() - -book_grammar = jsgf.parse_grammar_file(os.path.join(__location__, "grammar1.jsgf")) -book_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 = book_grammar.find_matching_rules(utterance) - - if matched: - return get_dialog_act(matched[0]) - else: - return {'act': 'null', 'slots': []} - - - - -utterance = 'dzień dobry chcę kupić mięso wołowe' -matched = book_grammar.find_matching_rules(utterance) -matched - -nlu('dzień dobry chcę kupić mięso wołowe') - -get_dialog_act(matched[0]) \ No newline at end of file +import jsgf +from pathlib import Path +import os + +__location__ = Path().resolve() + +book_grammar = jsgf.parse_grammar_file(os.path.join(__location__, "grammar3.jsgf")) +book_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 = book_grammar.find_matching_rules(utterance) + + if matched: + return get_dialog_act(matched[0]) + else: + return {'act': 'null', 'slots': []} + + +def predict(utterance): + utterance = utterance.lower() + punctuation = '''!;:/?,.*''' + + for i in utterance: + if i in punctuation: + utterance = utterance.replace(i, "") + + + matched = book_grammar.find_matching_rules(utterance) + nlu(utterance) + + try: + print(get_dialog_act(matched[0])) + except: + pass + + return matched \ No newline at end of file diff --git a/grammar1.jsgf b/grammar1.jsgf index 33b8411..464698e 100644 --- a/grammar1.jsgf +++ b/grammar1.jsgf @@ -1,59 +1,39 @@ #JSGF V1.0 UTF-8 pl; -grammar online_shopping; +grammar shopping; public = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | zakończ); -public = (jajka | chleb | mleko | ser | woda | cukier | sól | mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe | bułka_tarta | kajzerka); + = (jajka | chleb | mleko | ser | woda | cukier | sól | mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe | bułka_tarta | kajzerka); -public = (); + = (); -public = (mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe); + = (mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe); -public = (kg | dag | g | sztuki); + = (kg | dag | g | sztuki); -public = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | pusty_koszyk); + = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | pusty_koszyk); -public = (jaka_jest_cena | kiedy_mogę_odebrać | jakie_są_dostępne_produkty | jakie_jest_cena | jaki_jest_stan_magazynowy | czy_chcę_zapłacić_online | jakie_są_opłaty | jakie_są_promocje | jakie_są_godziny_otwarcia); + = (jaka_jest_cena | kiedy_mogę_odebrać | jakie_są_dostępne_produkty | jaki_jest_stan_magazynowy | czy_chcę_zapłacić_online | jakie_są_opłaty | jakie_są_promocje | jakie_są_godziny_otwarcia); -public = (Witaj użytkowniku w systemie zakupów sieci sklepów spożywczych "Galaktyczny Skład".); + = (dzień dobry | cześć | witaj); -public = (Dzień dobry | Cześć | Witaj); + = ( | | ); -public = ()+; + = (); -public = ()+; + = (); -public = ( | | | koszyk | żadne | | )+; +public = ( | | | koszyk | żadne | | ); -public = (dla jakiego rodzaju sklepów działa system | -chcę kupić | -zamówienie | -potrzebuję zakupów | -jakie sklepy oferuje system); + = dla jakiego rodzaju sklepów działa system | chcę kupić | zamówienie | potrzebuję zakupów | jakie sklepy oferuje system ; -public = {( | | )+}; + = w naszej ofercie znajdują się produkty spożywcze | dodano do koszyka | karta lojalnościowa założona pomyślnie | na numer telefonu zostanie wysłany sms z informacją gdy zakupy będą gotowe do odbioru | dziękujemy za skorzystanie ze sklepu Surykatka ; -public = (w naszej ofercie znajdują się produkty spożywcze | -dodano do koszyka | -karta lojalnościowa założona pomyślnie | -na numer telefonu zostanie wysłany sms z informacją gdy zakupy będą gotowe do odbioru | -dziękujemy za skorzystanie ze sklepu {}); + = nie | nie ten | zmień | nie chcę | nie teraz | nie tak | cofnij | usuń z listy; -public = (nie | -nie ten | -zmień | -nie chcę | -nie teraz | -nie tak | -cofnij | -usuń z listy); + = ale może coś innego | czy jest jakaś inna opcja ; -public = (dodaj do listy zakupów ); + = tak | zgoda | oczywiście | dokładnie | pewnie | jasne | dobrze | właśnie tak | ok | rozumiem ; -public = (ale może coś innego | -czy jest jakaś inna opcja); - -public = (tak | -zgoda | -oczywiście); \ No newline at end of file + = do widzenia | dziękuję | miłego dnia | do zobaczenia ; \ No newline at end of file diff --git a/grammar2.jsgf b/grammar2.jsgf new file mode 100644 index 0000000..b9e722e --- /dev/null +++ b/grammar2.jsgf @@ -0,0 +1,61 @@ +#JSGF V1.0; + +grammar generalStore; + +public = | | | | | | | | | | | ; + + = (buy | purchase) ; + + = (add | remove | edit | update | view | cancel | confirm) in my cart; + + = (item | items); + + = ; + + = (a | an | two | three | four | five | six | seven | eight | nine); + + = | | | | | ; + + = (bread | cereal | pasta | rice | beans | soup | canned food | snacks | cookies | candy | chocolate | condiments | spices); + + = (water | soda | juice | coffee | tea | energy drink | sports drink | beer | wine); + + = (toothbrush | toothpaste | floss | mouthwash | soap | shampoo | conditioner | body wash | lotion | deodorant | razor | shaving cream | feminine hygiene | diapers | baby wipes); + + = (laundry detergent | dish soap | all-purpose cleaner | glass cleaner | disinfectant | bleach | cleaning wipes | scrub brush | mop | broom | dustpan); + + = (towels | bedding | curtains | rugs | storage | hangers | trash bags | batteries | light bulbs | candles | pet food | cat litter); + + = (cell phone | tablet | laptop | headphones | speaker | charging cable | batteries | memory card); + + = filter by ; + + = (price low | price high | brand | color | size | rating | available); + + = (Coca-Cola | Pepsi | Tide | Kellogg's | Nestle | L'Oreal | Procter & Gamble | Samsung | Apple | Sony); + + = (red | blue | green | yellow | black | white | pink | purple | gray); + + = (small | medium | large | extra large | XXL); + + = (one star | two stars | three stars | four stars | five stars); + + = (search | find) ; + + = help me with ; + + = (my payment information | my order status | my account | my shipping information | my returns); + + = (manage my account | login to my account | sign in to my account | create an account); + + = (manage my payment information | update my credit card information); + + = (manage my shipping information | track my shipment | update my shipping address); + + = (check my return status | return an item); + + = (apply a promotion | redeem a gift card | use a coupon code); + + = (find a store near me | check store hours) + + = (get customer service support | ask for help | report an issue | provide feedback | request a refund | contact us); diff --git a/grammar3.jsgf b/grammar3.jsgf new file mode 100644 index 0000000..19015cc --- /dev/null +++ b/grammar3.jsgf @@ -0,0 +1,92 @@ +#JSGF V1.0 UTF-8 pl; + +grammar zakupyOnline; + +public = [ {hello}] [ {rocknstone}] [] [{commandType}] [{product}] [ {rest}] [ {bye}]; + + = ( | | | | | | | | | | | | | ); + + = (kup | zakup | kupić | kupic | zakupić | zamówić | zamów | podać); + + = (nie | tak) [] [posiadam]; + + = jeszcze | do tego | dodatkowo; + + = [] [] [] ; + + = bardzo | jaknajbardziej | chętnie | z chęcią; + + = jakiś | jakieś | jakąś; + + = dobre | dobry | dobrego | dobrą | dobrych | fajny | fajną | fajne | fajnych; + + = (proszę | poproszę | chcę | chciałbym | chcialbym | dziękuję | dziekuje | dziękuje | dziekuję | dzięki | dzieki | super | wspaniale); + + = (dzień dobry | cześć | witaj); + + = (rock and stone | rock and stone to the bone | rockity rock and stone | for karl | by the beard | yeah yeah rock and stone | if you dont rock and stone you aint coming home | stone and rock oh wait | did i hear a rock and stone); + + = (do widzenia | cześć | pa | dziękuję | dziekuje | dziękuje | dziekuję | dzięki | dzieki | czesc | cześc| czesć | oki | okej | do zobaczenia | (to [byłoby] wszystko) | (to będzie wszystko))*; + + = (dodaj | usuń | edytuj | zaktualizuj | zobacz | anuluj | potwierdź | zapłacę | zapłacić | usunąć | edytować | zaktualizować | zobaczyć | anulować | dodać | potwierdzić | potwierdziłem); + + = (artykuł | artykuły | składnik | składników | cena | ceny | cenę); + + = ([i | oraz] [] [] [tych | do [zamówienia | koszyka] | jakiś | jakieś | te] [] [] )*; + + = [(jeden | dwa | trzy | cztery | pięć | sześć | siedem | osiem | dziewięć | dziesięć)] [] [(2x | 3x | 4x | 5x | 6x)] [(kilka | kilo | kilogramów | kg | deko | dag | dekagramów | l | litrów | litry | litr | sztuk | pojemnik | pojemniki | opakowanie | opakowania | paczki | paczkę)]; + + = [(dobre | smaczne | pyszne | ładne | piękne | świeże | wyśmienite | niesamowite | epickie | wspaniałe)]; + + = ( | | | | | | ) [w promocji]; + + = (ogórki [gruntowe] | ogórek [gruntowe] | ziemniaki [myte] | pomidor | warzywa | warzyw | masło [wyborowe] | owoce | owoców | (chleb [żytni] | chleba) | ((płatki | płatków) [śniadaniowe | śniadaniowych]) | makaron | ryż | fasola | (zupa | zupy) | konserwy | mąkę tortową | przekąski | ciastka | cukierki | czekolada | lajonki | przyprawy | (mleka | mleko [zagęszczone słodzone | zwykłe]) | [na] messer wat | jajka | (parówki | parówek) | ser | chipsy | zielona cebulka | chipsy lays zielona cebulka); + + = ((woda | wody) | (napoje gazowane) | sok | kawa | herbata | napoje energetyczne | napoje izotoniczne | piwo | wino | cola | polo cola | pepsi); + + = (szczoteczka do zebow | pasta do zębów | nitki dentystyczne | płyny do płukania ust | mydło | szampon | odżywka | żel do kąpieli | balsam do ciała | dezodorant | maszynka do golenia | krem do golenia | podpaski | pieluchy | (perfumy | perfum) | cygaro | karme [dla kota] ); + + = (proszek do prania | płyny do mycia naczyn | uniwersalny środek czyszczący | płyny do czyszczenia szyb | środek dezynfekujący | wybielacz | chusteczki czyszczące | szczotka do czyszczenia | mop | miotła | szufelka); + + = (ręczniki | pościel | zasłony | dywany | pojemniki na przechowywanie | wieszaki | worki na śmieci | baterie | żarówki | świece | jedzenie dla zwierzat | zagęszczacz kociego piasku); + + = (telefon komórkowy | tablet | laptop | słuchawki | głośniki | ładowarki | baterie | karty pamięci); + + = filtruj według ; + + = (ceny rosnąco | ceny malejąco | (marka | marek) [] | kolor | rozmiar | ranking | dostępność | produkt | produktów); + + = (czerwony | niebieski | zielony | żółty | czarny | biały | różowy | fioletowy | szary); + + = (Samsung | Apple | Sony); + + = (mały | średni | duży | bardzo duży | XXL); + + = (jedna gwiazdka | dwie gwiazdki | trzy gwiazdki | cztery gwiazdki | pięć gwiazdek); + + = (szukaj | szukam | znajdź); + + = (jakiego | jakie | jaki | czy | są | (w czym)) [(macie [dostępne] | mamy | masz | to | możesz | mógłbyś)] [podać | w | mi] [(nazwa | nazwy | pomóc | pomoc)]; + + = (swojej ofercie | są dostępne | [to] [będzie] wszystko | bardzo chętnie | | potwierdzone | potwierdzam [intensywnie] | (-)); + + = (pomóż mi z | pomóż mi) ; + + = (informacje o płatości | mój stan zamówienia | moje konto | informacje o dostawie | moje zwroty); + + = (ustawienia konta | zaloguj | zarejestruj się | załóż konto); + + = [w takim razie | będzie] (metody płatności | edytuj kartę kredytową | przejść [do] [płatności] | przejdź [do] [płatności] | zapłacę [online] [kartą] | online [przelewem] | [gotówka] [przy odbiorze] | [to zapłacę] gotówką [przy odbiorze] | blik | blikiem | (odbiór | odbiorę) (osobisty | osobiście) | dostawa do paczkomatu); + + = (edytuj informacje o dostawie | śledź moje zamówienie | aktualizuj mój adres); + + = (sprawdź stan zwrotu | zwróć artykuł); + + = [] [] [użyć | skorzystać] [ze|z] (zniżki | karty podarunkowej | kuponu | ([a] co jest) | (jakie produkty są) w promocji); + + = (znajdź sklep obok mnie | sprawdź godziny otwarcia sklepu); + + = (obsługa klienta | zapytać pomoc | zgłosić problem | podzielić się opinią | żądać zwrotu | skontaktować się); + + = [(1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)*]; +