Merge remote-tracking branch 'origin/feature/combine_semantic_parser'
This commit is contained in:
commit
3624d1e9b1
@ -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};
|
||||
|
||||
|
@ -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;
|
||||
|
7
semantic_parser/gramatics/hello.jsgf
Normal file
7
semantic_parser/gramatics/hello.jsgf
Normal file
@ -0,0 +1,7 @@
|
||||
#JSGF V1.0 UTF-8 pl;
|
||||
|
||||
grammar hello;
|
||||
|
||||
public <hello> = <words_hello>;
|
||||
|
||||
<words_hello> = czesc | hej;
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -1,5 +0,0 @@
|
||||
hello_act = 'hello'
|
||||
name_request_act = 'request(name)'
|
||||
name_response_act = 'inform(name)'
|
||||
help_response_act = 'helpresponse'
|
||||
unknown_act = 'null'
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user