This commit is contained in:
eugene 2023-05-25 12:16:45 +02:00
commit 56ce78a89e
9 changed files with 307 additions and 83 deletions

4
.gitignore vendored
View File

@ -1,2 +1,4 @@
*.vs
*.vs
*.vscode
__pychache__/
DialogSystems/

0
DialogManager.ipynb Normal file
View File

Binary file not shown.

35
dictionary.json Normal file
View File

@ -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":[
]
}

45
evaluate.py Normal file
View File

@ -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')

View File

@ -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])
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

View File

@ -1,59 +1,39 @@
#JSGF V1.0 UTF-8 pl;
grammar online_shopping;
grammar shopping;
public <command> = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | zakończ);
public <products> = (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);
<products> = (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 <all_products> = (<products>);
<all_products> = (<products>);
public <meat_types> = (mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe);
<meat_types> = (mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe);
public <units> = (kg | dag | g | sztuki);
<units> = (kg | dag | g | sztuki);
public <cart_command> = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | pusty_koszyk);
<cart_command> = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | pusty_koszyk);
public <question> = (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);
<question> = (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 <welcome> = (Witaj użytkowniku <number> w systemie zakupów sieci sklepów spożywczych "Galaktyczny Skład".);
<greeting> = (dzień dobry | cześć | witaj);
public <greeting> = (Dzień dobry | Cześć | Witaj);
<list> = (<products> | <meat_types> | <units>);
public <all_questions> = (<question>)+;
<all_questions> = (<question>);
public <all_cart_commands> = (<cart_command>)+;
<all_cart_commands> = (<cart_command>);
public <dialog> = <welcome> <greeting> <command> (<products> | <meat_types> | <units> | koszyk | żadne | <all_cart_commands> | <all_questions>)+;
public <dialog> = <greeting> <command> (<products> | <meat_types> | <units> | koszyk | żadne | <all_cart_commands> | <all_questions>);
public <request> = (dla jakiego rodzaju sklepów działa system |
chcę kupić |
zamówienie |
potrzebuję zakupów |
jakie sklepy oferuje system);
<request> = dla jakiego rodzaju sklepów działa system | chcę kupić | zamówienie | potrzebuję zakupów | jakie sklepy oferuje system ;
public <list> = {(<products> | <meat_types> | <units>)+};
<inform> = w naszej ofercie znajdują się produkty spożywcze | dodano <list> 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 <inform> = (w naszej ofercie znajdują się produkty spożywcze |
dodano <list> 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 {<shopname>});
<deny> = nie | nie ten | zmień | nie chcę | nie teraz | nie tak | cofnij | usuń <productname> <brandname> z listy;
public <deny> = (nie |
nie ten |
zmień |
nie chcę |
nie teraz |
nie tak |
cofnij |
usuń <productname> <brandname> z listy);
<reqalts> = ale może coś innego | czy jest jakaś inna opcja ;
public <add_to_list> = (dodaj do listy zakupów <brandname>);
<affirm> = tak | zgoda | oczywiście | dokładnie | pewnie | jasne | dobrze | właśnie tak | ok | rozumiem ;
public <reqalts> = (ale może coś innego |
czy jest jakaś inna opcja);
public <affirm> = (tak |
zgoda |
oczywiście);
<bye> = do widzenia | dziękuję | miłego dnia | do zobaczenia ;

61
grammar2.jsgf Normal file
View File

@ -0,0 +1,61 @@
#JSGF V1.0;
grammar generalStore;
public <command> = <buyCommand> | <cartCommand> | <filterCommand> | <searchCommand> | <helpCommand> | <accountCommand> | <paymentCommand> | <shippingCommand> | <returnCommand> | <promoCommand> | <storeCommand> | <serviceCommand>;
<buyCommand> = (buy | purchase) <quantity> <product>;
<cartCommand> = (add | remove | edit | update | view | cancel | confirm) <itemAction> <item> in my cart;
<itemAction> = (item | items);
<item> = <quantity> <product>;
<quantity> = (a | an | two | three | four | five | six | seven | eight | nine);
<product> = <grocery> | <beverage> | <personalCare> | <cleaning> | <homeGoods> | <electronics>;
<grocery> = (bread | cereal | pasta | rice | beans | soup | canned food | snacks | cookies | candy | chocolate | condiments | spices);
<beverage> = (water | soda | juice | coffee | tea | energy drink | sports drink | beer | wine);
<personalCare> = (toothbrush | toothpaste | floss | mouthwash | soap | shampoo | conditioner | body wash | lotion | deodorant | razor | shaving cream | feminine hygiene | diapers | baby wipes);
<cleaning> = (laundry detergent | dish soap | all-purpose cleaner | glass cleaner | disinfectant | bleach | cleaning wipes | scrub brush | mop | broom | dustpan);
<homeGoods> = (towels | bedding | curtains | rugs | storage | hangers | trash bags | batteries | light bulbs | candles | pet food | cat litter);
<electronics> = (cell phone | tablet | laptop | headphones | speaker | charging cable | batteries | memory card);
<filterCommand> = filter by <filterType>;
<filterType> = (price low | price high | brand <brandName> | color <colorName> | size <sizeType> | rating <ratingType> | available);
<brandName> = (Coca-Cola | Pepsi | Tide | Kellogg's | Nestle | L'Oreal | Procter & Gamble | Samsung | Apple | Sony);
<colorName> = (red | blue | green | yellow | black | white | pink | purple | gray);
<sizeType> = (small | medium | large | extra large | XXL);
<ratingType> = (one star | two stars | three stars | four stars | five stars);
<searchCommand> = (search | find) <product>;
<helpCommand> = help me with <helpType>;
<helpType> = (my payment information | my order status | my account | my shipping information | my returns);
<accountCommand> = (manage my account | login to my account | sign in to my account | create an account);
<paymentCommand> = (manage my payment information | update my credit card information);
<shippingCommand> = (manage my shipping information | track my shipment | update my shipping address);
<returnCommand> = (check my return status | return an item);
<promoCommand> = (apply a promotion | redeem a gift card | use a coupon code);
<storeCommand> = (find a store near me | check store hours)
<serviceCommand> = (get customer service support | ask for help | report an issue | provide feedback | request a refund | contact us);

92
grammar3.jsgf Normal file
View File

@ -0,0 +1,92 @@
#JSGF V1.0 UTF-8 pl;
grammar zakupyOnline;
public <command> = [<greeting> {hello}] [<dwarfGreeting> {rocknstone}] [<polite>] [<commandType>{commandType}] [<item>{product}] [<rest> {rest}] [<bye> {bye}];
<commandType> = (<buyCommand> | <cartCommand> | <filterCommand> | <questionCommand> | <searchCommand> | <helpCommand> | <accountCommand> | <paymentCommand> | <shippingCommand> | <returnCommand> | <promoCommand> | <storeCommand> | <serviceCommand> | <affOrNegCommand>);
<buyCommand> = (kup | zakup | kupić | kupic | zakupić | zamówić | zamów | podać);
<affOrNegCommand> = (nie | tak) [<polite>] [posiadam];
<more> = jeszcze | do tego | dodatkowo;
<productCategoryInfoRequest> = [<affOrNegCommand>] [<polite>] [<any>] <quality> <product>;
<approveNoun> = bardzo | jaknajbardziej | chętnie | z chęcią;
<any> = jakiś | jakieś | jakąś;
<produktQualityGood> = dobre | dobry | dobrego | dobrą | dobrych | fajny | fajną | fajne | fajnych;
<polite> = (proszę | poproszę | chcę | chciałbym | chcialbym | dziękuję | dziekuje | dziękuje | dziekuję | dzięki | dzieki | super | wspaniale);
<greeting> = (dzień dobry | cześć | witaj);
<dwarfGreeting> = (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);
<bye> = (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))*;
<cartCommand> = (dodaj | usuń | edytuj | zaktualizuj | zobacz | anuluj | potwierdź | zapłacę | zapłacić | usunąć | edytować | zaktualizować | zobaczyć | anulować | dodać | potwierdzić | potwierdziłem);
<itemAction> = (artykuł | artykuły | składnik | składników | cena | ceny | cenę);
<item> = ([i | oraz] [<quantity>] [<itemAction>] [tych | do [zamówienia | koszyka] | jakiś | jakieś | te] [<quality>] [<quantityN>] <product>)*;
<quantity> = [(jeden | dwa | trzy | cztery | pięć | sześć | siedem | osiem | dziewięć | dziesięć)] [<quantityN>] [(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ę)];
<quality> = [(dobre | smaczne | pyszne | ładne | piękne | świeże | wyśmienite | niesamowite | epickie | wspaniałe)];
<product> = (<grocery> | <beverage> | <personalCare> | <cleaning> | <homeGoods> | <electronics> | <filterType>) [w promocji];
<grocery> = (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);
<beverage> = ((woda | wody) | (napoje gazowane) | sok | kawa | herbata | napoje energetyczne | napoje izotoniczne | piwo | wino | cola | polo cola | pepsi);
<personalCare> = (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] );
<cleaning> = (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);
<homeGoods> = (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);
<electronics> = (telefon komórkowy | tablet | laptop | słuchawki | głośniki | ładowarki | baterie | karty pamięci);
<filterCommand> = filtruj według <filterType>;
<filterType> = (ceny rosnąco | ceny malejąco | (marka | marek) [<brandName>] | kolor <colorName> | rozmiar <sizeType> | ranking <ratingType> | dostępność | produkt | produktów);
<colorName> = (czerwony | niebieski | zielony | żółty | czarny | biały | różowy | fioletowy | szary);
<brandName> = (Samsung | Apple | Sony);
<sizeType> = (mały | średni | duży | bardzo duży | XXL);
<ratingType> = (jedna gwiazdka | dwie gwiazdki | trzy gwiazdki | cztery gwiazdki | pięć gwiazdek);
<searchCommand> = (szukaj | szukam | znajdź);
<questionCommand> = (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)];
<rest> = (swojej ofercie | są dostępne | [to] [będzie] wszystko | bardzo chętnie | <quantityN> | potwierdzone | potwierdzam [intensywnie] | (<quantityN>-<quantityN>));
<helpCommand> = (pomóż mi z | pomóż mi) <helpType>;
<helpType> = (informacje o płatości | mój stan zamówienia | moje konto | informacje o dostawie | moje zwroty);
<accountCommand> = (ustawienia konta | zaloguj | zarejestruj się | załóż konto);
<paymentCommand> = [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);
<shippingCommand> = (edytuj informacje o dostawie | śledź moje zamówienie | aktualizuj mój adres);
<returnCommand> = (sprawdź stan zwrotu | zwróć artykuł);
<promoCommand> = [<affOrNegCommand>] [<polite>] [użyć | skorzystać] [ze|z] (zniżki | karty podarunkowej | kuponu | ([a] co jest) | (jakie produkty są) w promocji);
<storeCommand> = (znajdź sklep obok mnie | sprawdź godziny otwarcia sklepu);
<serviceCommand> = (obsługa klienta | zapytać pomoc | zgłosić problem | podzielić się opinią | żądać zwrotu | skontaktować się);
<quantityN> = [(1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)*];