From 6eb2ecfeedd7c1e9a046d84f67f742e664d311f0 Mon Sep 17 00:00:00 2001 From: Bartosz Date: Sat, 29 May 2021 10:43:39 +0200 Subject: [PATCH] nlu update --- .gitignore | 1 + JSGFs/confirm.jsgf | 6 +++--- JSGFs/request.jsgf | 10 +++++----- Modules.py | 30 +++++++++++++++--------------- evaluate.py | 11 +++++------ 5 files changed, 29 insertions(+), 29 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed8ebf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ \ No newline at end of file diff --git a/JSGFs/confirm.jsgf b/JSGFs/confirm.jsgf index 4b58fe9..d26d114 100644 --- a/JSGFs/confirm.jsgf +++ b/JSGFs/confirm.jsgf @@ -17,19 +17,19 @@ public = Książka została zarezerwowana; Mieszkaj boho | Potęga checklisty | Sen o okapi | ON | Przygody matematyka | Dwanaście Stacji | Krew | Milczenie owiec | Duma i uprzedzenie | Władca Pierścieni | Jane Eyre | Harry Potter i kamień filozoficzny | Zabić drozda | Wichrowe Wzgórza | - Rok 1984 | Mroczne materie | Wielkie nadzieje | Małe kobietki | Tessa D’Urberville | + Rok 1984 | Mroczne materie | Wielkie nadzieje | Małe kobietki | Tessa D Urberville | Paragraf 22 | Rebeka | Birdsong | Buszujący w zbożu | Żona podróżnika w czasie | Miasteczko Middlemarch | Przeminęło z wiatrem | Wielki Gatsby | Samotnia | Wojna i pokój | Autostopem przez Galaktykę | Znowu w Brideshead | Grona gniewu | Alicja w Krainie Czarów | O czym szumią wierzby | Anna Karenina | David Copperfield | - Opowieści z Narnii | Emma | Perswazje | Lew, Czarwnica i Stara Szafa; + Opowieści z Narnii | Emma | Perswazje | Lew Czarwnica i Stara Szafa; = Marcin Bruczkowski | Harari Yuval Noah | Haruki Murakami | Fiodor Dostojewski | Robert Anthony Salvatore | Dimitri Głuchowski | Dan Brown | Anna Rice | Wojciech Chmielarz | Remigiusz Mróz | Leigh Bardugo | Carlos Ruiz Zafon | Tomasz Budzyński | Weronika Łodyga | Andrzej Sapkowski | J R R Tolkien | Katarzyna Marciniak | Richard Taylor | Megan Rosenbloom | Piotr Zychowicz | - Ewelina Podrez-Siama | Marzena Rogalska | Bill Gates | Justina Blakeney | + Ewelina Podrez Siama | Marzena Rogalska | Bill Gates | Justina Blakeney | Atul Gawande | Mariana Leky | Diana Brzezińska | Stanisław Ulam | Tomasz Różycki | Max Czornyj | Thomas Harris | Jane Austen | J R R Tolkien | Charlotte Bronte | J K Rowling | Harper Lee | Emily Bronte | George Orwell | Philip Pullman | Charles Dickens | diff --git a/JSGFs/request.jsgf b/JSGFs/request.jsgf index d0f9010..0d02ddf 100644 --- a/JSGFs/request.jsgf +++ b/JSGFs/request.jsgf @@ -59,19 +59,19 @@ public = Chciałabym dokonać rezerwacji ksiązki {books}* Mieszkaj boho | Potęga checklisty | Sen o okapi | ON | Przygody matematyka | Dwanaście Stacji | Krew | Milczenie owiec | Duma i uprzedzenie | Władca Pierścieni | Jane Eyre | Harry Potter i kamień filozoficzny | Zabić drozda | Wichrowe Wzgórza | - Rok 1984 | Mroczne materie | Wielkie nadzieje | Małe kobietki | Tessa D’Urberville | + Rok 1984 | Mroczne materie | Wielkie nadzieje | Małe kobietki | Tessa D Urberville | Paragraf 22 | Rebeka | Birdsong | Buszujący w zbożu | Żona podróżnika w czasie | Miasteczko Middlemarch | Przeminęło z wiatrem | Wielki Gatsby | Samotnia | Wojna i pokój | Autostopem przez Galaktykę | Znowu w Brideshead | Grona gniewu | Alicja w Krainie Czarów | O czym szumią wierzby | Anna Karenina | David Copperfield | - Opowieści z Narnii | Emma | Perswazje | Lew, Czarwnica i Stara Szafa; + Opowieści z Narnii | Emma | Perswazje | Lew Czarwnica i Stara Szafa; = Marcin Bruczkowski | Harari Yuval Noah | Haruki Murakami | Fiodor Dostojewski | Robert Anthony Salvatore | Dimitri Głuchowski | Dan Brown | Anna Rice | Wojciech Chmielarz | Remigiusz Mróz | Leigh Bardugo | Carlos Ruiz Zafon | Tomasz Budzyński | Weronika Łodyga | Andrzej Sapkowski | J R R Tolkien | Katarzyna Marciniak | Richard Taylor | Megan Rosenbloom | Piotr Zychowicz | - Ewelina Podrez-Siama | Marzena Rogalska | Bill Gates | Justina Blakeney | + Ewelina Podrez Siama | Marzena Rogalska | Bill Gates | Justina Blakeney | Atul Gawande | Mariana Leky | Diana Brzezińska | Stanisław Ulam | Tomasz Różycki | Max Czornyj | Thomas Harris | Jane Austen | J R R Tolkien | Charlotte Bronte | J K Rowling | Harper Lee | Emily Bronte | George Orwell | Philip Pullman | Charles Dickens | @@ -82,10 +82,10 @@ public = Chciałabym dokonać rezerwacji ksiązki {books}* = otwarta | zamknięta | otwarta w czasie pandemii | zamknięta do odwołania; - = romans | thriller | ksiazka fantasy | horror | biografia | science-fiction | dramat | + = romans | thriller | ksiazka fantasy | horror | biografia | science fiction | dramat | powiesc | basn | satyra | legenda | liryka | opowiadanie | komedia | epika | poezja | literatura piekna; = 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 |2003 | - 2004 | 2005 | 2000 + 2004 | 2005 | 2000; diff --git a/Modules.py b/Modules.py index b789334..47f0b4d 100644 --- a/Modules.py +++ b/Modules.py @@ -7,19 +7,15 @@ class NLU: def __init__(self): self.grammars = [jsgf.parse_grammar_file(f'JSGFs/{file_name}') for file_name in os.listdir('JSGFs')] - def get_dialog_act(self, sentence): - acts = [] - for sentence in sentence.split(','): - for grammar in self.grammars: - match = grammar.find_matching_rules(sentence) - if match: - acts.append(grammar.name) - return acts + def get_dialog_act(self, rule): + slots = [] + self.get_slots(rule.expansion, slots) + return {'act': rule.grammar.name, 'slots': slots} - def match_slots(self, expansion, slots): + def get_slots(self, expansion, slots): if expansion.tag != '': slots.append((expansion.tag, expansion.current_match)) - return slots + return for child in expansion.children: self.get_slots(child, slots) @@ -27,14 +23,18 @@ class NLU: if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef): self.get_slots(expansion.referenced_rule.expansion, slots) - def get_slots(self, utterance): - slots = [] + def match(self, utterance): + list_of_illegal_character = [',', '.', "'", '?', '!', ':', '-', '/'] + for illegal_character in list_of_illegal_character[:-2]: + utterance = utterance.replace(f'{illegal_character}','') + for illegal_character in list_of_illegal_character[-2:]: + utterance = utterance.replace(f'{illegal_character}',' ') + for grammar in self.grammars: matched = grammar.find_matching_rules(utterance) if matched: - return self.match_slots(matched[0], slots) - return [] - + return self.get_dialog_act(matched[0]) + return {'act': 'null', 'slots': []} #Dialogue policy class DP: diff --git a/evaluate.py b/evaluate.py index d67a03f..10f8709 100644 --- a/evaluate.py +++ b/evaluate.py @@ -22,11 +22,10 @@ for file_name in os.listdir('data'): rows += 1 sentence = row[1] user_acts = row[2].split('&') - nlu_acts = nlu.get_dialog_act(sentence) - for nlu_act in nlu_acts: - for user_act in user_acts: - user_act = re.search(PATTERN, user_act).group() - if user_act == nlu_act: - hits += 1 + nlu_match = nlu.match(sentence) + if nlu_match['act'] in user_acts: + hits += 1 + + print(f"Accuracy: {(hits / rows)*100}") # Dokładność 38.5% \ No newline at end of file