This commit is contained in:
Jakub Adamski 2022-06-15 00:02:44 +02:00
parent ca37786161
commit ac0a3417da
6 changed files with 83 additions and 83 deletions

View File

@ -2,7 +2,7 @@
grammar help; grammar help;
public <help_zapytanie> = jakie sa dostepne <functions> {functions} | w czym mozesz mi <help> {help} | co mogę się od ciebie dowiedziec; public <help_zapytanie> = jakie sa dostepne <functions> {functions} | w czym mozesz mi <help> {help} | co mogę się od ciebie dowiedziec | pomoc;
<help> = pomoc; <help> = pomoc;

View File

@ -4,4 +4,4 @@ grammar repo;
public <repo_zapytanie> = <repozytoria> {repozytoria}; public <repo_zapytanie> = <repozytoria> {repozytoria};
<repozytoria> = gra - kolko i krzyzyk | zajęcia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia; <repozytoria> = gra - kolko i krzyzyk | zajecia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia;

View File

@ -1,59 +1,78 @@
from taktyka_dialogu import Questions import difflib as dl
import random 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ść", "Cześć",
"Hello", "Hello",
"Hej", "Hej",
"Dzień dobry", "Dzień dobry",
"Hey"] "Hey"
]
unknown = ["Nie rozumiem.", unknown = [
"Ubierz to w inne słowa.", "Nie rozumiem.",
"Nie wiem co masz na myśli.", "Nie wiem co masz na myśli."
"Powiedz to innymi słowami", ]
"Powiedz co chciałbyś uzyskać"]
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 zobaczenia",
"Do widzenia", "Do widzenia",
"Miłego dnia", "Miłego dnia",
"Do widzenia i miłego dnia" "Do widzenia i miłego dnia"
"Narazie"] "Narazie"
]
help = ["Obsługuję przekazywanie informacji z systemu GitHub - repozytoria, pull requesty, issue, powiadomienia."] 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"] 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ć?"] 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_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_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, 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))
"""
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))
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: else:
#dont ask questions print(tactic)
if frame['act'] == "hello":
print(random.choice(welcome)) print()
elif frame['act'] == "bye":
print(random.choice(bye))
elif frame['act'] == "pomoc":
print(random.choice(help))
else:
print(random.choice(unknown))

View File

@ -47,13 +47,14 @@ def append_or_merge_frame(frame, dialogue_state):
def update_facts_if_needed(slot): def update_facts_if_needed(slot):
global dialogue_state global dialogue_state
if slot[1] is None or slot[1] == '': if slot != None and len(slot) > 1:
return if slot[1] is None or slot[1] == '':
return
if slot[0] == 'repo': if slot[0] == 'repo':
dialogue_state['facts']['repo'] = slot[1] dialogue_state['facts']['repo'] = slot[1]
elif slot[0] == 'time': elif slot[0] == 'time':
dialogue_state['facts']['time'] = slot[1] dialogue_state['facts']['time'] = slot[1]
def append_or_merge_slots(frame_slots, state_slots): 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: for frame_slot in frame_slots:
merged = False merged = False
for i in range(len(state_slots)): for i in range(len(state_slots)):
update_facts_if_needed(frame_slot[i]) if len(frame_slot) > i:
if state_slots[i][0] == frame_slot[0]: update_facts_if_needed(frame_slot[i])
merged = True if state_slots[i][0] == frame_slot[0]:
# Do not merge empty incomming slots merged = True
if frame_slot[1] is not None and not len(frame_slot[1]) == 0: # Do not merge empty incomming slots
state_slots[i] = frame_slot if frame_slot[1] is not None and not len(frame_slot[1]) == 0:
break state_slots[i] = frame_slot
break
if not merged: if not merged:
state_slots.append(frame_slot) state_slots.append(frame_slot)

View File

@ -1,26 +1,21 @@
from analizator_jezyka_naturalnego import analizator_jezyka_naturalnego from analizator_jezyka_naturalnego import analizator_jezyka_naturalnego
from monitor_stanu_dialogowego import monitor_stanu_dialogowego from monitor_stanu_dialogowego import monitor_stanu_dialogowego
from taktyka_dialogu import taktyka_dialogu from taktyka_dialogu import taktyka_dialogu
# from generator_jezyka_nautalnego import generator_jezyka_nautalnego from generator_jezyka_nautalnego import generator_jezyka_nautalnego
def main(): def main():
running = True running = True
state = [] 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: while running:
text = input('>>>') text = input('>>>')
frame = analizator_jezyka_naturalnego(text) frame = analizator_jezyka_naturalnego(text)
# print(frame)
#{'act': 'notifications', 'slots': [('time_when', None), ('liczba', ''), ('timeunit', None)]}
state = monitor_stanu_dialogowego(frame) state = monitor_stanu_dialogowego(frame)
# print(state) tactic = taktyka_dialogu(state, frame)
generator_jezyka_nautalnego(frame, tactic, state, text)
questions = taktyka_dialogu(state, frame) # todo dodac stan
# print(questions)
#
# generator_jezyka_nautalnego(frame, questions, state)
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@ -1,9 +1,6 @@
from apimock import * from apimock import *
gramar_slots = { gramar_slots = {
# 'act': ((slot0, 'required'),
# (slot1, 'optional')
# )
'pullrequest': (('action', 'optional'), 'pullrequest': (('action', 'optional'),
('repo', 'required') ('repo', 'required')
), ),
@ -39,7 +36,6 @@ gramar_slots = {
def taktyka_dialogu(state, frame): def taktyka_dialogu(state, frame):
if frame['act'] == 'null': if frame['act'] == 'null':
print("Nie rozumiem :/")
return 'null' return 'null'
if state['current_context'] in ['hello', 'pomoc', 'bye']: if state['current_context'] in ['hello', 'pomoc', 'bye']:
return short_thread(state) return short_thread(state)
@ -48,26 +44,18 @@ def taktyka_dialogu(state, frame):
def short_thread(state): def short_thread(state):
if state['current_context'] == 'pomoc': if state['current_context'] == 'pomoc':
print(state['current_context'])
return state['current_context'] return state['current_context']
#TODO?
else: else:
print(state['current_context'])
return state['current_context'] return state['current_context']
def validate_repo(repo): def validate_repo(repo):
if repo not in listRepositories(): if repo not in listRepositories():
print('repo not in listRepositories') return 'repo not in listRepositories'
if repo not in listPublicRepositories(): if repo not in listPublicRepositories():
print('repo not in listPublicRepositories') return 'repo not in listPublicRepositories'
#validate_date
#if zakres dat
#if test/notification/issues/pullRequest non empty
def long_thread(state): def long_thread(state):
act = state['current_context'] act = state['current_context']
print(act)
# slots = []
for topic in state['topics']: for topic in state['topics']:
if act == topic['act']: if act == topic['act']:
slots = topic['slots'] slots = topic['slots']
@ -79,7 +67,7 @@ def long_thread(state):
required_empty = check_req(req_args) required_empty = check_req(req_args)
if required_empty: if required_empty:
return "QESTION", required_empty[0] #slot do uzupełnienia 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): def check_req(req_args):
req = [] req = []
@ -112,7 +100,3 @@ def agregate(grammar, slots):
opt_args.append([item[0], value]) opt_args.append([item[0], value])
return req_args, opt_args return req_args, opt_args
#powiedz, że może dopytać o 'optional'
#gramar_slots musi mieć 100% gramatyk albo będzie pomijał sloty