Merge remote-tracking branch 'origin/feature/combine_semantic_parser'

This commit is contained in:
Jakub Adamski 2022-06-01 12:58:01 +02:00
commit 3624d1e9b1
15 changed files with 139 additions and 110 deletions

View File

@ -4,11 +4,11 @@ grammar brefing;
public <brefing> = <action> {action} (<git> {git} | <repo> {repo});
<repozytoria> = Gra - kółko i krzyżyk | Zajęcia AI | Projekt - sklep | super_stronka_internetowa | nazwaRepozytorium | pizza | zajecia;
<repozytoria> = gra - kolko i krzyzyk | zajęcia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia;
<git> = gicie | githubie | GitHubie | Githubie;
<git> = gicie | githubie | githubie ;
<action> = co nowego na moim | co nowego w moich | opowiedz mi co się u mnie działo na;
<action> = co nowego na moim | co nowego w moich | opowiedz mi co sie u mnie dzialo na;
<repo> = <repozytoria> {repozytoria};

View File

@ -2,6 +2,6 @@
grammar bye;
public <bey_zapytanie> = <words_bye> {words_bye};
public <bye> = <words_bye>;
<words_bye> = Do widzenia | do widzenia | cześć | na razie | hej;
<words_bye> = do widzenia;

View File

@ -0,0 +1,7 @@
#JSGF V1.0 UTF-8 pl;
grammar hello;
public <hello> = <words_hello>;
<words_hello> = czesc | hej;

View File

@ -2,23 +2,23 @@
grammar issues;
public <issue> = (pokaż mi | wyświetl | powiedz mi o) [nowe | nowych] <issues> [<time>] w <repo>;
public <issue> = (pokaz mi | wyswietl | powiedz mi o) [nowe | nowych] <issues> [<time>] w <repo>;
<repozytoria> = Gra - kółko i krzyżyk | Zajęcia AI | Projekt - sklep | super_stronka_internetowa | nazwaRepozytorium | pizza | zajecia;
<repozytoria> = gra - kolko i krzyzyk | zajęcia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia;
<time> = <time_when> {time_when} [ostatniego | ostatnich] [<liczba> {liczba}] <timeunit> {timeunit};
<time_when> = z | od | ze | w;
<timeunit> = (miesiąca | miesięcy | <miesiac>) | tygodni | miesięcy | dni;
<timeunit> = (miesiaca | miesiecy | <miesiac>) | tygodni | miesiecy | dni;
<miesiac> = (styczeń | styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecień | kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpień | sierpien | sierpnia | sierpniu) | (wrzesień | wrzesien | wrzesieniu | wrzesnia) | (październik | pazdziernik | październiku | października) | (listopad | listopada | listopadzie) | (grudzień | grudzien | grudnia | grudniu);
<miesiac> = (styczen | styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecien | kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpien | sierpien | sierpnia | sierpniu) | (wrzesien | wrzesien | wrzesieniu | wrzesnia) | (pazdziernik | pazdziernik | pazdzierniku | pazdziernika) | (listopad | listopada | listopadzie) | (grudzien | grudzien | grudnia | grudniu);
<new> = [nowe] | [nowych];
<repo> = <repozytoria> {repozytoria};
<liczba> = (dwa | dwóch | dwójki | dwojki) | (trzy | trzech | trójki ) | (cztery | czterech) | (pieć | pięciu | pieciu) | (sześć | sześciu | szesciu) | (siedem| siedmiu) | (osiem | ośmiu) | (dziewieć | dziewięciu | dziewieciu);
<liczba> = (dwa | dwoch | dwojki) | (trzy | trzech | trojki ) | (cztery | czterech) | (piec | pieciu ) | (szesc | szesciu ) | (siedem| siedmiu) | (osiem | osmiu) | (dziewiec | dziewieciu );
<issues> = issue | issues;

View File

@ -8,13 +8,13 @@ public <notifications> = pokaz mi [nowe] <powiadomienia> [<time>];
<time_when> = z | od | ze | w;
<timeunit> = (miesiąca | miesięcy | <miesiac>) | tygodni | miesięcy | dni;
<timeunit> = (miesiaca | miesiecy | <miesiac>) | tygodni | miesiecy | dni;
<liczba> = (dwa | dwóch | dwójki | dwojki) | (trzy | trzech | trójki ) | (cztery | czterech) | (pieć | pięciu | pieciu) | (sześć | sześciu | szesciu) | (siedem| siedmiu) | (osiem | ośmiu) | (dziewieć | dziewięciu | dziewieciu);
<liczba> = (dwa | dwoch | dwojki | dwojki) | (trzy | trzech | trojki ) | (cztery | czterech) | (piec | pieciu ) | (szesc | szesciu ) | (siedem | siedmiu) | (osiem | osmiu) | (dziewiec | dziewieciu );
<powiadomienia> = notif | pow | powiadomienia | notification | notifications;
<miesiac> = (styczeń | styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecień | kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpień | sierpien | sierpnia | sierpniu) | (wrzesień | wrzesien | wrzesieniu | wrzesnia) | (październik | pazdziernik | październiku | października) | (listopad | listopada | listopadzie) | (grudzień | grudzien | grudnia | grudniu);
<miesiac> = (styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpien | sierpnia | sierpniu) | (wrzesien | wrzesieniu | wrzesnia) | (pazdziernik | październiku | pazdziernika) | (listopad | listopada | listopadzie) | (grudzien | grudnia | grudniu);

View File

@ -2,8 +2,8 @@
grammar pomoc;
public <pomoc_zapytanie> = jakie są dostępne <functions> {functions} | w czym możesz mi <help> {help};
public <pomoc_zapytanie> = jakie sa dostepne <functions> {functions} | w czym mozesz mi <help> {help};
<help> = pomoc | pomóc;
<help> = pomoc ;
<functions> = komenda | komendy | funckja | funkcje | polecenie | polecenia;

View File

@ -4,12 +4,12 @@ grammar pullrequest;
public <pull_request_zapytanie> = <action> {action} <new> <pullrequest> [w <repo> {repo}];
<repozytoria> = Gra - kółko i krzyżyk | Zajęcia AI | Projekt - sklep | super_stronka_internetowa | nazwaRepozytorium | pizza | zajecia;
<repozytoria> = gra - kolko i krzyzyk | zajęcia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia;
<new> = [nowe] | [nowych];
<repo> = <repozytoria> {repozytoria};
<pullrequest> = pull requesty | pull requestów;
<pullrequest> = pull requesty | pull requestow;
<action> = ile jest | jakie są;
<action> = ile jest | jakie sa;

View File

@ -2,24 +2,24 @@
grammar tests;
public <tests> = (pokaż mi | wyświetl mi | powiedz mi o) [<new>] <test> {test} [<time>] w <repo>;
public <tests> = (pokaz mi | wyswietl mi | powiedz mi o) [<new>] <test> {test} [<time>] w <repo>;
<repozytoria> = Gra - kółko i krzyżyk | Zajęcia AI | Projekt - sklep | super_stronka_internetowa | nazwaRepozytorium | pizza | zajecia;
<repozytoria> = gra - kolko i krzyzyk | zajęcia ai | projekt - sklep | super_stronka_internetowa | nazwarepozytorium | pizza | zajecia;
<time> = <time_when> {time_when} [ostatniego | ostatnich] [<liczba> {liczba}] <timeunit> {timeunit};
<time_when> = z | od | ze | w;
<timeunit> = (miesiąca | miesięcy | <miesiac>) | tygodni | miesięcy | dni;
<timeunit> = (miesiaca | miesiecy | <miesiac>) | tygodni | miesiecy | dni;
<miesiac> = (styczeń | styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecień | kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpień | sierpien | sierpnia | sierpniu) | (wrzesień | wrzesien | wrzesieniu | wrzesnia) | (październik | pazdziernik | październiku | października) | (listopad | listopada | listopadzie) | (grudzień | grudzien | grudnia | grudniu);
<liczba> = (dwa | dwoch | dwojki | dwojki) | (trzy | trzech | trojki ) | (cztery | czterech) | (piec | pieciu ) | (szesc | szesciu ) | (siedem | siedmiu) | (osiem | osmiu) | (dziewiec | dziewieciu );
<miesiac> = (styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpien | sierpnia | sierpniu) | (wrzesien | wrzesieniu | wrzesnia) | (pazdziernik | październiku | pazdziernika) | (listopad | listopada | listopadzie) | (grudzien | grudnia | grudniu);
<new> = [nowe] | [nowych];
<repo> = <repozytoria> {repozytoria};
<liczba> = (dwa | dwóch | dwójki | dwojki) | (trzy | trzech | trójki ) | (cztery | czterech) | (pieć | pięciu | pieciu) | (sześć | sześciu | szesciu) | (siedem| siedmiu) | (osiem | ośmiu) | (dziewieć | dziewięciu | dziewieciu);
<test> = testy | testach | test;

View File

@ -6,11 +6,9 @@ public <time> = <time_when> {time_when} [ostatniego | ostatnich] [<liczba> {lic
<time_when> = z | od | ze | w;
<timeunit> = (miesiąca | miesięcy | <miesiac>) | tygodni | miesięcy | dni;
<liczba> = (dwa | dwóch | dwójki | dwojki) | (trzy | trzech | trójki ) | (cztery | czterech) | (pieć | pięciu | pieciu) | (sześć | sześciu | szesciu) | (siedem| siedmiu) | (osiem | ośmiu) | (dziewieć | dziewięciu | dziewieciu);
<miesiac> = (styczeń | styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecień | kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpień | sierpien | sierpnia | sierpniu) | (wrzesień | wrzesien | wrzesieniu | wrzesnia) | (październik | pazdziernik | październiku | października) | (listopad | listopada | listopadzie) | (grudzień | grudzien | grudnia | grudniu);
<timeunit> = (miesiaca | miesiecy | <miesiac>) | tygodni | miesiecy | dni;
<liczba> = (dwa | dwoch | dwojki | dwojki) | (trzy | trzech | trojki ) | (cztery | czterech) | (piec | pieciu ) | (szesc | szesciu ) | (siedem | siedmiu) | (osiem | osmiu) | (dziewiec | dziewieciu );
<miesiac> = (styczen | stycznia | styczniu) | (luty | lutego | lutym) | (marzec | marca | marcu) | (kwiecien | kwietniu | kwietnia) | (maj | maja | maju) | (czerwiec | czerwca | czerwcu) | (lipiec | lipca | lipcu) | (sierpien | sierpnia | sierpniu) | (wrzesien | wrzesieniu | wrzesnia) | (pazdziernik | październiku | pazdziernika) | (listopad | listopada | listopadzie) | (grudzien | grudnia | grudniu);

View File

@ -1,5 +0,0 @@
hello_act = 'hello'
name_request_act = 'request(name)'
name_response_act = 'inform(name)'
help_response_act = 'helpresponse'
unknown_act = 'null'

View File

@ -1,17 +1,47 @@
import re
import jsgf
from os import listdir
from os.path import isfile, join
from acts import hello_act, name_request_act
mypath = "../semantic_parser/gramatics/"
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
hello = ['dzien dobry', 'dobry wieczor', 'witam', 'witaj', 'siema', 'elo', 'czesc']
request_name = ['imie', 'nazywasz']
question = ['\?$']
grammars = []
acts = {hello_act: [hello],
name_request_act: [request_name, question]}
for grammarFile in onlyfiles:
grammar = jsgf.parse_grammar_file(mypath + grammarFile)
grammars.append(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 = None
for grammar in grammars:
matched = grammar.find_matching_rules(utterance)
if matched:
break
if matched:
return get_dialog_act(matched[0])
else:
return {'act': 'null', 'slots': []}
def analizator_jezyka_naturalnego(text):
text = text_preprocess(text)
frame = act_check(text)
frame = nlu(text)
return frame
def text_preprocess(text):
@ -29,18 +59,3 @@ def text_preprocess(text):
text = text.replace("\t", " ")
text = text.replace(" ", " ")
return text
def act_check(text):
frame = []
for act, requirements in acts.items():
req = [check_synonyms(synonyms, text) for synonyms in requirements]
if all(req):
frame.append(act)
return frame
def check_synonyms(synonyms, text):
for expression in synonyms:
match = re.search(expression, text)
if match:
return True
return False

View File

@ -1,18 +1,25 @@
import acts as acts
from taktyka_dialogu import Questions
welcome = 'Witaj!'
prompt = 'Zapytaj mnie o moje imię.'
resp = 'Nazywam się Dia.'
unknown = "Nie rozumiem."
end = "Żegnaj!"
help = "Obsługuję przekazywanie informacji z systemu GitHub - repozytoria, pull requesty, issue, powiadomienia."
#todo dodać więcej odpowiedzi
#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("Z jakiego czasu?")
def generator_jezyka_nautalnego(frames):
for frame in frames:
if frame == acts.hello_act:
print(welcome, end=" ")
elif frame == acts.name_response_act:
print(resp, end=" ")
elif frame == acts.help_response_act:
print(prompt, end=" ")
else:
print(unknown, end=" ")
print()
#dont ask questions
if frame['act'] == "hello":
print(welcome)
elif frame['act'] == "bye":
print(end)
elif frame['act'] == "pomoc":
print(help)
else:
print(unknown)

View File

@ -1,17 +1,24 @@
from acts import hello_act
dialogue_state = []
iterator = 1
def monitor_stanu_dialogowego(frame):
#todo uporzadkować
def monitor_stanu_dialogowego(frame, questions):
global iterator
# Some frames can reset the dialogue state, like saying hello.
reset_state_if_needed(frame)
list(map(lambda x: dialogue_state.append(x), frame))
singleState = {
"iteration": iterator,
"frame": frame,
"questions": questions
}
dialogue_state.append(singleState)
iterator += 1
return dialogue_state
def reset_state_if_needed(frame):
if hello_act in frame:
global iterator
if frame['act'] == "hello" or frame['act'] == "bye":
dialogue_state.clear()
iterator = 1

View File

@ -5,13 +5,19 @@ from generator_jezyka_nautalnego import generator_jezyka_nautalnego
def main():
running = True
state = []
while running:
text = input('>>>')
frame = analizator_jezyka_naturalnego(text)
state = monitor_stanu_dialogowego(frame)
response_frames = taktyka_dialogu(state, frame)
generator_jezyka_nautalnego(response_frames)
#{'act': 'notifications', 'slots': [('time_when', None), ('liczba', ''), ('timeunit', None)]}
questions = taktyka_dialogu(frame) # todo dodac stan
state = monitor_stanu_dialogowego(frame, questions)
generator_jezyka_nautalnego(frame, questions, state)
if __name__ == '__main__':
main()

View File

@ -1,32 +1,26 @@
from os import stat
from re import S
from acts import *
from enum import Enum
class Questions(Enum):
TIME = "time"
REPO = "repo"
NONE = "none"
#todo taktyka ma zwracać bardziej złożony obiekt
def taktyka_dialogu(frame):
return questions(frame)
#todo dodac wiecej casow
#brac pod uwage stan
def questions(frame):
for slot in frame['slots']:
if slot[0] == "time_when" and slot[1] == None:
return Questions.TIME
if slot[0] == "repo" and (slot[1] == None or slot[1] == ""):
return Questions.REPO
return Questions.NONE
def check_condition(state, conditions, type=all):
if type(i in state for i in conditions):
return True
return False
def taktyka_dialogu(state, frame):
if should_respond_gently(frame):
return [hello_act, name_response_act]
if should_prompt(frame):
return [hello_act, help_response_act]
if should_respond_cold(frame):
return [name_response_act]
return [unknown_act]
def should_respond_gently(state):
return check_condition(state, [hello_act, name_request_act])
def should_prompt(state):
return check_condition(state, [hello_act], any)
def should_respond_cold(state):
return check_condition(state, [name_request_act])
#todo dodać mock github api