diff --git a/semantic_parser/gramatics/pomoc.jsgf b/semantic_parser/gramatics/pomoc.jsgf index c691b20..e96b4d2 100644 --- a/semantic_parser/gramatics/pomoc.jsgf +++ b/semantic_parser/gramatics/pomoc.jsgf @@ -2,7 +2,7 @@ grammar help; -public = jakie sa dostepne {functions} | w czym mozesz mi {help} | co mogę się od ciebie dowiedziec; +public = jakie sa dostepne {functions} | w czym mozesz mi {help} | co mogę się od ciebie dowiedziec | pomoc; = pomoc; diff --git a/semantic_parser/gramatics/repo.jsgf b/semantic_parser/gramatics/repo.jsgf index d2853f7..e10a719 100644 --- a/semantic_parser/gramatics/repo.jsgf +++ b/semantic_parser/gramatics/repo.jsgf @@ -4,4 +4,4 @@ grammar repo; public = {repozytoria}; - = gra - kolko i krzyzyk | zajęcia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia; \ No newline at end of file + = gra - kolko i krzyzyk | zajecia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia; \ No newline at end of file diff --git a/system/generator_jezyka_nautalnego.py b/system/generator_jezyka_nautalnego.py index 4995ef4..02c7bcb 100644 --- a/system/generator_jezyka_nautalnego.py +++ b/system/generator_jezyka_nautalnego.py @@ -1,59 +1,78 @@ -from taktyka_dialogu import Questions +import difflib as dl import random +import sys -welcome = ['Witaj!', +commands = [ + 'pomoc', + 'powiedz co nowego na moim gicie', + 'do widzenia', + 'pokaz issue w', + 'pokaz mi powiadomienia', + 'jakie sa pull requesty', + 'pokaz mi testy w' +] + +welcome = [ + 'Witaj!', "Cześć", "Hello", "Hej", "Dzień dobry", - "Hey"] + "Hey" +] -unknown = ["Nie rozumiem.", - "Ubierz to w inne słowa.", - "Nie wiem co masz na myśli.", - "Powiedz to innymi słowami", - "Powiedz co chciałbyś uzyskać"] +unknown = [ + "Nie rozumiem.", + "Nie wiem co masz na myśli." +] -bye = ["Żegnaj!", +other = [ + "Podobne komendy: ", + "Może chodziło Ci o te komendy: ", + "Spróbuj wybrać jedną z tych komend: " +] + +bye = [ + "Żegnaj!", "Do zobaczenia", "Do widzenia", "Miłego dnia", "Do widzenia i miłego dnia" - "Narazie"] + "Narazie" +] help = ["Obsługuję przekazywanie informacji z systemu GitHub - repozytoria, pull requesty, issue, powiadomienia."] -#todo dodać więcej odpowiedzi - time = ["Z jakiego czasu?", "Z jakiego okresu?", "Podaj z jakiego przedziału czasowego"] -repo = ["Z jakiego repozytorium", "Wskaż repozytorium", "Podaj z jakiego repozytorium chciałbyć otrzymać informacje", "Określ repozytorium"] + +repo = [ + "Z jakiego repozytorium", + "Wskaż repozytorium", + "Podaj z jakiego repozytorium chciałbyć otrzymać informacje", + "Określ repozytorium" +] + howmany = ["Ile ostatnich elemntów chcesz zobaczyć?", "Ile ostatnich elmentów wyświetlić?", "Ile ostatnich elemnetów pokazać?"] +error_time = ["Podano nie prawidłowy czas, popraw ramy czasowe", "Czas jest nie prawidłowy, podaj ponownie", "Podaj przedział czasowy jeszcze raz"] +error_repo = ["Podano nieprawidłową nazwę repozytorium", "Podaj ponownie nazwę repozytorium, ponieważ podania nie prawidłową"] -#error_time = ["Podano nie prawidłowy czas, popraw ramy czasowe", "Czas jest nie prawidłowy, podaj ponownie", "Podaj przedział czasowy jeszcze raz"] -#error_repo = ["Podano nieprawidłową nazwę repozytorium", "Podaj ponownie nazwę repozytorium, ponieważ podania nie prawidłową"] -#todo generator powinien przyjmować zwrotkę z taktyki dialogu +def generator_jezyka_nautalnego(frame, tactic, state, text): + if tactic == 'null': + beastMatch = dl.get_close_matches(text, commands) + print(random.choice(unknown)) + if len(beastMatch) > 0: + print(random.choice(other) + ', '.join(beastMatch)) -def generator_jezyka_nautalnego(frame, question, state): - if question != Questions.NONE: - #ask additional questions - if question == Questions.TIME: - print(random.choice(time)) - if question == Questions.REPO: - print(random.choice(repo)) - """ - if question == Questions.HOWMANY: - print(random.choice(howmany)) - """ - - + elif tactic[1] == 'help': + print(random.choice(help)) + print("Dostępne komendy: \n - " + '\n - '.join(commands)) + + elif tactic == 'bye': + print(random.choice(bye)) + print() + sys.exit(0) else: - #dont ask questions - if frame['act'] == "hello": - print(random.choice(welcome)) - elif frame['act'] == "bye": - print(random.choice(bye)) - elif frame['act'] == "pomoc": - print(random.choice(help)) - else: - print(random.choice(unknown)) + print(tactic) + + print() diff --git a/system/monitor_stanu_dialogowego.py b/system/monitor_stanu_dialogowego.py index c62ec52..886ec98 100644 --- a/system/monitor_stanu_dialogowego.py +++ b/system/monitor_stanu_dialogowego.py @@ -47,13 +47,14 @@ def append_or_merge_frame(frame, dialogue_state): def update_facts_if_needed(slot): global dialogue_state - if slot[1] is None or slot[1] == '': - return + if slot != None and len(slot) > 1: + if slot[1] is None or slot[1] == '': + return - if slot[0] == 'repo': - dialogue_state['facts']['repo'] = slot[1] - elif slot[0] == 'time': - dialogue_state['facts']['time'] = slot[1] + if slot[0] == 'repo': + dialogue_state['facts']['repo'] = slot[1] + elif slot[0] == 'time': + dialogue_state['facts']['time'] = slot[1] def append_or_merge_slots(frame_slots, state_slots): @@ -65,13 +66,14 @@ def append_or_merge_slots(frame_slots, state_slots): for frame_slot in frame_slots: merged = False for i in range(len(state_slots)): - update_facts_if_needed(frame_slot[i]) - if state_slots[i][0] == frame_slot[0]: - merged = True - # Do not merge empty incomming slots - if frame_slot[1] is not None and not len(frame_slot[1]) == 0: - state_slots[i] = frame_slot - break + if len(frame_slot) > i: + update_facts_if_needed(frame_slot[i]) + if state_slots[i][0] == frame_slot[0]: + merged = True + # Do not merge empty incomming slots + if frame_slot[1] is not None and not len(frame_slot[1]) == 0: + state_slots[i] = frame_slot + break if not merged: state_slots.append(frame_slot) diff --git a/system/system_dialogowy.py b/system/system_dialogowy.py index e48059a..e1f6e02 100644 --- a/system/system_dialogowy.py +++ b/system/system_dialogowy.py @@ -1,26 +1,21 @@ from analizator_jezyka_naturalnego import analizator_jezyka_naturalnego from monitor_stanu_dialogowego import monitor_stanu_dialogowego from taktyka_dialogu import taktyka_dialogu -# from generator_jezyka_nautalnego import generator_jezyka_nautalnego +from generator_jezyka_nautalnego import generator_jezyka_nautalnego def main(): running = True state = [] + print() + print("Dostępne repozytoria: \n - gra - kolko i krzyzyk, \n - zajecia ai, \n - projekt - sklep, \n - super_stronka_internetowa, \n - nazwarepozytorium, \n - pizza, \n - zajecia") + print("Aby poznać komendy, wpisz 'pomoc' \n") while running: text = input('>>>') - frame = analizator_jezyka_naturalnego(text) - # print(frame) - #{'act': 'notifications', 'slots': [('time_when', None), ('liczba', ''), ('timeunit', None)]} - state = monitor_stanu_dialogowego(frame) - # print(state) - - questions = taktyka_dialogu(state, frame) # todo dodac stan - # print(questions) - # - # generator_jezyka_nautalnego(frame, questions, state) + tactic = taktyka_dialogu(state, frame) + generator_jezyka_nautalnego(frame, tactic, state, text) if __name__ == '__main__': main() diff --git a/system/taktyka_dialogu.py b/system/taktyka_dialogu.py index 4a90cc7..62cd300 100644 --- a/system/taktyka_dialogu.py +++ b/system/taktyka_dialogu.py @@ -1,9 +1,6 @@ from apimock import * gramar_slots = { - # 'act': ((slot0, 'required'), - # (slot1, 'optional') - # ) 'pullrequest': (('action', 'optional'), ('repo', 'required') ), @@ -39,7 +36,6 @@ gramar_slots = { def taktyka_dialogu(state, frame): if frame['act'] == 'null': - print("Nie rozumiem :/") return 'null' if state['current_context'] in ['hello', 'pomoc', 'bye']: return short_thread(state) @@ -48,26 +44,18 @@ def taktyka_dialogu(state, frame): def short_thread(state): if state['current_context'] == 'pomoc': - print(state['current_context']) return state['current_context'] - #TODO? else: - print(state['current_context']) return state['current_context'] def validate_repo(repo): if repo not in listRepositories(): - print('repo not in listRepositories') + return 'repo not in listRepositories' if repo not in listPublicRepositories(): - print('repo not in listPublicRepositories') - #validate_date - #if zakres dat - #if test/notification/issues/pullRequest non empty + return 'repo not in listPublicRepositories' def long_thread(state): act = state['current_context'] - print(act) - # slots = [] for topic in state['topics']: if act == topic['act']: slots = topic['slots'] @@ -79,7 +67,7 @@ def long_thread(state): required_empty = check_req(req_args) if required_empty: return "QESTION", required_empty[0] #slot do uzupełnienia - return "ANSWER", req_args, opt_args #wyświetl użytkownikowi + return "ANSWER", act, req_args, opt_args #wyświetl użytkownikowi def check_req(req_args): req = [] @@ -112,7 +100,3 @@ def agregate(grammar, slots): opt_args.append([item[0], value]) return req_args, opt_args - - -#powiedz, że może dopytać o 'optional' -#gramar_slots musi mieć 100% gramatyk albo będzie pomijał sloty