forked from s151636/Generic_DialogSystem
Merge branch 'master' of https://git.wmi.amu.edu.pl/s151636/Generic_DialogSystem
This commit is contained in:
commit
56ce78a89e
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,2 +1,4 @@
|
||||
*.vs
|
||||
*.vs
|
||||
*.vscode
|
||||
__pychache__/
|
||||
DialogSystems/
|
0
DialogManager.ipynb
Normal file
0
DialogManager.ipynb
Normal file
BIN
__pycache__/example_nlu.cpython-310.pyc
Normal file
BIN
__pycache__/example_nlu.cpython-310.pyc
Normal file
Binary file not shown.
35
dictionary.json
Normal file
35
dictionary.json
Normal 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
45
evaluate.py
Normal 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')
|
@ -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
|
@ -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
61
grammar2.jsgf
Normal 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
92
grammar3.jsgf
Normal 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)*];
|
||||
|
Loading…
Reference in New Issue
Block a user