diff --git a/data/dialog-08-13-01.tsv b/data/dialog-08-13-01.tsv index 0148859..358fa1b 100644 --- a/data/dialog-08-13-01.tsv +++ b/data/dialog-08-13-01.tsv @@ -10,5 +10,5 @@ user Jestem wysoce niepocieszony z powodu braku trunków siarczystych, ale jako system Tak oczywiśćie nasza restauracja serwuje doskonałe tiramisu. Czy to wszystko? inform(dessert=tiramisu),reqmore() user Jeszcze pytanie czy w waszym obiekcie znajduje się toaleta, pytam ponieważ na google można znaleźć opinie, że trzeba korzystać z latryny? request(restroom) system Tak w naszym obiekcie znaduje się darmowa toaleta. Opinie na platformie goolge są w błędzie. inform(restroom=available) -user Dobrze w takim razie dziękuję za informację i będę o tej 19. thankyou,inform(time=19:00) +user Dobrze w takim razie dziękuję za informację i będę o tej 19. thankyou&inform(time=19:00) system Doskonale, w takim razie potwierdzam Pana rezerwację stolika na dziś wieczorem o godzinie 19:00. Życzę Panu miłego wieczoru w naszej restauracji. Do zobaczenia o 19:00! affirm(),bye() diff --git a/data/dialog-09-04-01.tsv b/data/dialog-09-04-01.tsv index 3901b3c..94cb09e 100644 --- a/data/dialog-09-04-01.tsv +++ b/data/dialog-09-04-01.tsv @@ -74,7 +74,7 @@ system Przykro mi, ale nie wspieramy tej opcji płatności canthelp user Czy opakowanie na wynos są dodatkowo płatne? request(topic=”packaging”, value=”price”) system Nie, opakowania są wliczone w cenę potrawy. inform user Super to zatem wszystko ack&bye -system W celu realizacji zamówienia proszę o podanie adresu dostawy oraz formy płatności. canthelp:missingslotvalue(type=”delivery”)&canthelp:missingslotvalue(type=”payment”) +system W celu realizacji zamówienia proszę o podanie adresu dostawy oraz formy płatności. canthelp()&canthelp() user "Uniwersytetu Poznańskiego 4, 61-614 Poznań Sala D-3, płatność za pomocą kryptowalut" inform(delivery=”Uniwersytetu Poznańskiego 4, 61-614 Poznań Sala D-3”)&inform(payment=”kryptowalut”) diff --git a/data/dialog-09-12-01.tsv b/data/dialog-09-12-01.tsv index 8f3ceb2..3e73d72 100644 --- a/data/dialog-09-12-01.tsv +++ b/data/dialog-09-12-01.tsv @@ -11,7 +11,7 @@ system Sałatka warzywna zawiera następujące składniki: ziemniaki, marchew, p system Jeśli chcesz, mogę zamówić wersję potrawy bez danego składnika. inform(topic=”alternative”) user chciałbym sałatke, która nie ma majonezy i jest swieza reqalts(include=”sałatka warzywna”, exclude=”majonez”, exclude=“nieświeża”) system Nasze potrawy zawsze są świeże, nasza restauracja i jej pracownicy spełniają wszystkie normy sanepidu. Dodałem do zamówienia sałatkę warzywną (bez majonezu). inform(topic=”świeżość”) -user chciałbym bez sałatki jednak, a w miejscu tego kiszonke. Czy maci kiszonki w restauracji reqaltsinclude=”kiszonka”) +user chciałbym bez sałatki jednak, a w miejscu tego kiszonke. Czy maci kiszonki w restauracji reqalts(include=”kiszonka”) system Usunąłem potrawę Sałatka warzywna z zamówienia. Przykro mi, w ofercie nie posiadamy potrawy kiszonka. canthelp user chodziło mi o kiszonki czyli ogorek kiszony, kimchi, kapusta kiszona itd reqalts(include=”ogorek kiszony, kimchi, kapusta kiszona”) system Mamy w ofercie kimchi. Czy dodać je do zamówienia? offer(value=”kimchi”)&expl-conf diff --git a/data/dialog-11-02-01.tsv b/data/dialog-11-02-01.tsv index 1b1aa4d..cd4c122 100644 --- a/data/dialog-11-02-01.tsv +++ b/data/dialog-11-02-01.tsv @@ -1,5 +1,5 @@ user Dzień dobry hello() system Czesc, jestem agentem dialogowym przyjmujacym zamowienia w restauracji. Moge doradzic ci w wyborze odpowiedniej pozycji z menu. W czym moge ci pomoc? welcomemsg() -user Chciałbym zjeść 3-daniowy obiad z kuchni włoskiej. inform() +user Chciałbym zjeść 3-daniowy obiad z kuchni włoskiej. inform(value="3-daniowy obiad z kuchni włoskiej") system Proponuję "Sałatka caprese", "Lasagne", "Tiramisu" select() user Mógłbyś mi napisać z jakich składników składa się sałatka? reqmore() \ No newline at end of file diff --git a/data/dialog-11-04-01.tsv b/data/dialog-11-04-01.tsv index eae230e..d35ee3e 100644 --- a/data/dialog-11-04-01.tsv +++ b/data/dialog-11-04-01.tsv @@ -4,7 +4,7 @@ user Moge doradzic ci w wyborze odpowiedniej pozycji z menu. help() user W czym moge ci pomoc? help() user Jakie macie menu na dzisiaj? help() system "przystawki":"Tatar wołowy", "Carpaccio z buraka","Sałatka caprese","zupy":"Krem z dyni","Rosół z makaronem","Zupa grzybowa","dania_glowne":"Stek z polędwicy wołowej","Pieczona kaczka z jabłkami","Lasagne","Ryba z grilla","Risotto z kurczakiem i grzybami","Pierogi ruskie","Placki ziemniaczane","desery":"Tiramisu""Szarlotka","Lody waniliowe" offer() -user Jestem na diecie keto, jakie posiłi moge zjeść z tego menu? reqmore() +user Jestem na diecie keto, jakie posiłi moge zjeść z tego menu? reqmore(value="dieta keto") system Co to znaczy dieta keto? repeat() user spożywanie tłuszczy i wyeliminowanie węglowodanów, a ponadto znaczne ograniczenie posiłków zawierających cukier, a więc owoców i warzyw null() system "Tatar wołowy" "Zupa grzybowa", Stek z polędwicy wołowej offer() @@ -12,7 +12,7 @@ user Dobrze a czy po takich potrawach nie będzie mi śmierdziało z buzi na ran system Kwestia tego co lubi dziewczyna reqmore() user Zaszło nieporozumienie, ide na randke z moim chłopakiem, czy mógłbyś nie opierać się na stereotypach? Było to dla mnie bardzo krzywdzące reqmore() system Przepraszam, moje dane uczące pochodzą ze stereotypowego źródła. W takim razie to zależy od tego, czy twój chłopak lubi smak mięsa wołowego i grzybów reqmore() -user Okej a macie coś dopicia? request() +user Okej a macie coś dopicia? request(value="napoje") system colę, wodę i lemoniadę offer() user a jest piwo? reqmore() system tak, żubr i kuflowe mocne offer() @@ -22,14 +22,14 @@ user Tak ack() system gratuluję. Czy w takim razie chcesz zamówić piwo? offer() user Tak ack() system jakie? reqmore() -user kuflowe mocne inform() +user kuflowe mocne inform(value="kuflowe mocne") system czy w takim razie twoje zmówienie to:"Tatar wołowy" "Zupa grzybowaStek z polędwicy wołowej mocne inform() user Tak, ale jeszcze to nie koniec null() -user Czy macie w ofercie wódkę? request() +user Czy macie w ofercie wódkę? request(value="wódka") system Niestety nie negate() -user a czy możecie zapakować dania na wynoc? help() +user a czy możecie zapakować dania na wynoc? help(value="pakowanie na wynos") system Tak affirm() -user a ile wyjdzie za wszystko? request() +user a ile wyjdzie za wszystko? request(value="cena") system 103zł inform() user podaj cene za poszczególne składniki zamowienia reqmore() system 22 28 zupa 45zł stek kuflowe inform() diff --git a/data/dialog-11-06-01.tsv b/data/dialog-11-06-01.tsv index f969019..05ff015 100644 --- a/data/dialog-11-06-01.tsv +++ b/data/dialog-11-06-01.tsv @@ -1,13 +1,13 @@ user Dzień dobry hello() system Czesc, jestem agentem dialogowym przyjmujacym zamowienia w restauracji. Moge doradzic ci w wyborze odpowiedniej pozycji z menu. W czym moge ci pomoc? welcomemsg() -user Czy oferujecie burgery? request() +user Czy oferujecie burgery? request(value="burger") system Nie, z dan głównych oferujemy: "Stek z polędwicy wołowej", "Pieczona kaczka z jabłkami", "Lasagne", "Ryba z grilla", "Risotto z kurczakiem i grzybami", "Pierogi ruskie", "Placki ziemniaczane" select() -user czy do pierogow ruskich dodajecie skwarki? reqmore() +user czy do pierogow ruskich dodajecie skwarki? reqmore(value="Pierogi ruskie") system tak affirm() -user Czy moglibyscie przygotowac 20 porcji na okreslona godzine na wynos? request() +user Czy moglibyscie przygotowac 20 porcji na okreslona godzine na wynos? request(value="Pierogi ruskie", value="20", value="15:00", value="pojutrze") system jak najbardziej affirm() user to poprosze affirm() system Pierogi ruskie 20 razy, tak? Na którą godzinę? inform()&request() -user na 15:00 na pojutrze select() +user na 15:00 na pojutrze select(value="15:00", value="pojutrze") system przyjmujemy tylko zamówienia na ten sam dzień. Wróc do nas pojutrze negate() user ok, dziekuje za pomoc bye() \ No newline at end of file diff --git a/data/dialog-11-08-01.tsv b/data/dialog-11-08-01.tsv index 34ccc6d..a73f5df 100644 --- a/data/dialog-11-08-01.tsv +++ b/data/dialog-11-08-01.tsv @@ -1,24 +1,24 @@ user Siema, w czym możesz mi pomóc? hello()&help() system Czesc, jestem agentem dialogowym przyjmujacym zamowienia w restauracji.Moge doradzic ci w wyborze odpowiedniej pozycji z menu.W czym moge ci pomoc? welcomemsg() -user Chciałbym zamówić coś dietetycznego na obiad, co polecasz? help() +user Chciałbym zamówić coś dietetycznego na obiad, co polecasz? help(value="dietetyczne", category="obiad") system "Sałatka caprese" z przystawek i "Ryba z grilla" na danie główne offer() -user A jaka to ryba? reqmore() +user A jaka to ryba? reqmore(value="ryba") system Łosoś offer() -user Czy dało by się ją zamienić na inną, skoro nie lubię łososia? reqalts() +user Czy dało by się ją zamienić na inną, skoro nie lubię łososia? reqalts(value="ryba") system Nie negate() -user Dobrze w takim razie zaproponuj coś innego. reqalts() +user Dobrze w takim razie zaproponuj coś innego. reqalts(value="cokolwiek") system "Pierogi ruskie", offer() -user Okej brzmi dobrze. Chciałbym jeszcze zamówić cos do picia. affirm()&help() +user Okej brzmi dobrze. Chciałbym jeszcze zamówić cos do picia. affirm()&help(value="napoje") system Polecam colę albo wodę offer() -user Wezmę colę, ile wynosi całkowity koszt zamówienia? inform()&help() +user Wezmę colę, ile wynosi całkowity koszt zamówienia? inform(value="cola")&help(value="cena") system 51zł offer() -user Trochę drogo, nie ma zniżki dla studentów? reqmore() +user Trochę drogo, nie ma zniżki dla studentów? reqmore(value="zniżka") system nie ma, przepraszam negate() user Okej, w takim razie dziekuję za pomoc, pójdę do innej restauracji. bye() system Na pewno nie będzie tam tak smacznie jak u nas negate() -user Skąd to wiesz jako system? reqmore() -system Bo nikt nie jest od nas lepszy inform() -user No dobrze przekonałeś mnie, złożę u was zamówienie, czy przyjmujecie płatność kartą? request() +user Skąd to wiesz jako system? reqmore(value="wiadomość") +system Nikt nie jest od nas lepszy inform() +user No dobrze przekonałeś mnie, złożę u was zamówienie, czy przyjmujecie płatność kartą? request(value="płatność") system Tak! affirm() user Świetnie, dziękuję za pomoc. thankyou() system Pierogi ruskie i cola, płatność kartą. Czy to wszystko? inform() diff --git a/data/dialog-11-10-01.tsv b/data/dialog-11-10-01.tsv index 758a39b..1c4f7ec 100644 --- a/data/dialog-11-10-01.tsv +++ b/data/dialog-11-10-01.tsv @@ -1,9 +1,9 @@ user Hej, czym się zajmujesz? hello()&help() system Czesc, jestem agentem dialogowym przyjmujacym zamowienia w restauracji. Moge doradzic ci w wyborze odpowiedniej pozycji z menu. W czym moge ci pomoc? offer() -user Pokaż menu help() +user Pokaż menu help(value="menu") system "przystawki": "Tatar wołowy", "Carpaccio z buraka", "Sałatka caprese", "zupy": "Krem z dyni", "Rosół z makaronem", "Zupa grzybowa","dania_glowne": "Stek z polędwicy wołowej", "Pieczona kaczka z jabłkami", "Lasagne", "Ryba z grilla", "Risotto z kurczakiem i grzybami", "Pierogi ruskie", "Placki ziemniaczane","desery": "Tiramisu" "Szarlotka", "Lody waniliowe", offer() -user Chciałbym zjeść tatara, zupe grzybowa, stek i tiramisu inform() -user Czy mogę zjeść tatara bez cebuli? reqmore() +user Chciałbym zjeść tatara, zupe grzybowa, stek i tiramisu inform(value="Tatar wołowy", value="Zupa grzybowa", value="Stek z polędwicy wołowej", value="Tiramisu") +user Czy mogę zjeść tatara bez cebuli? reqmore(value="Tatar wołowy bez cebuli") system Tak, możemy przygotować tatara bez cebuli. affirm() user Pełen profesjonalizm null() user To będzie moje całe zamówienie thankyou() diff --git a/data/dialog-11-12-01.tsv b/data/dialog-11-12-01.tsv deleted file mode 100644 index 6409ed3..0000000 --- a/data/dialog-11-12-01.tsv +++ /dev/null @@ -1,14 +0,0 @@ -user czy macie jeszcze jakies ciasta dostepne ? -system tak, tiramisu i szarlotke -user prosiłbym szarlatke z lodami wanilowymi -system zrozumiałem -user Podsumowanie zamówienia: dwie porcje plackow ziemniaczanych z sosem smietanowym. szarlatka z lodami wanilowymi user: potwierdzam czy jeszcze musze coś wykonac system: nie. proszę czekać, zamówienie będzie gotowe do odbioru za 35min -user dziekuje -user witam -system Znowu? -system Czesc znowu w takim wypadku, jestem agentem dialogowym przyjmujacym zamowienia w restauracji. Moge doradzic ci w wyborze odpowiedniej pozycji z menu. W czym moge ci pomoc? user: chciałbym zjesc ramen. Czy u panstwa moge go zamowic system: Nie. Oto całe manu "przystawki": "Tatar wołowy", "Carpaccio z buraka", "Sałatka caprese", "zupy": "Krem z dyni", "Rosół z makaronem", "Zupa grzybowa", "dania_glowne": "Stek z polędwicy wołowej", "Pieczona kaczka z jabłkami", "Lasagne", "Ryba z grilla", "Risotto z kurczakiem i grzybami", "Pierogi ruskie", "Placki ziemniaczane", "desery": "Tiramisu" "Szarlotka", "Lody waniliowe" -user a co klienci najczesciej zamawiaja ? -system "Tatar wołowy", "Krem z dyni", "Stek z polędwicy wołowej", "Tiramisu" -user chciałbym to razy 8 jaka to bedzie cena -system 860zł -user okej w takim razie dziekuje \ No newline at end of file diff --git a/evaluate.py b/evaluate.py index 664df8f..a14898a 100644 --- a/evaluate.py +++ b/evaluate.py @@ -14,16 +14,17 @@ recognized = 0 unrecognized = 0 for df in data_files: - if len(df.columns)==3: + if len(df.columns) == 3: df.columns = ["agent", "message", "act"] - elif len(df.columns)==2: + elif len(df.columns) == 2: df.columns = ["agent", "message"] else: continue user_speech_rows = df[df['agent'] == "user"] user_speeches = user_speech_rows["message"] entries_count = len(user_speeches) - parsed = user_speeches.apply(lambda x: bool(grammar.find_matching_rules(x))) + parsed = user_speeches.apply( + lambda x: bool(grammar.find_matching_rules(x))) true_count = parsed.sum() false_count = len(parsed) - true_count recognized += true_count @@ -31,4 +32,4 @@ for df in data_files: print(f"Recognized user utterances: {recognized}") print(f"Unrecognized user utterances: {unrecognized}") -print(f"Accuracy: {recognized/(recognized+unrecognized)}") \ No newline at end of file +print(f"Accuracy: {recognized/(recognized+unrecognized)}") diff --git a/get_acts.py b/get_acts.py new file mode 100644 index 0000000..c27ec36 --- /dev/null +++ b/get_acts.py @@ -0,0 +1,52 @@ +import os +import pandas as pd +from collections import defaultdict + + +def get_act_name_and_slots(act="request(cuisine)"): + acts = [act] + if "&" in act: + acts = act.split("&") + for act in acts: + if "(" not in act: + return act, [] + act_name = act.split("(")[0] + try: + slots = act.split("(")[1].split(")")[0].split(",") + except IndexError: + slots = [] + print(f"Error parsing act: {act}") + return act_name, slots + + +data_files = [] + +for filename in os.listdir("data"): + f = os.path.join("data", filename) + if os.path.isfile(f): + data_files.append(pd.read_csv(f, sep='\t', header=None)) + +acts = defaultdict(lambda: {"msg": [], "slots": []}) + +for df in data_files: + if len(df.columns) == 3: + df.columns = ["agent", "message", "act"] + else: + continue + current_acts = df['act'] + user_speech_rows = df[df['agent'] == "user"]["message"] + for act, speech in zip(current_acts, user_speech_rows): + act_name, slots = get_act_name_and_slots(act) + acts[act_name]["slots"] += slots + acts[act_name]["msg"].append(speech) + +print("Acts:") +for act in acts: + if act in ["hello", "welcomemsg", "ack", "rezerwuj"]: + continue + print(f"{act}: {len(acts[act]['msg'])} examples") + for sentence in acts[act]["msg"]: + print(f"\t{sentence}") + + print("\n\n") + print() diff --git a/out.spacy b/out.spacy new file mode 100644 index 0000000..e69de29