grammars-jsfg #2

Merged
s464961 merged 4 commits from grammars-jsfg into master 2024-05-07 19:25:56 +02:00
5 changed files with 71 additions and 2 deletions
Showing only changes of commit 6acdea3310 - Show all commits

42
chatbot/modules/nlu.py Normal file
View File

@ -0,0 +1,42 @@
import copy
from copy import deepcopy
import json
import os
import jsgf
class NLU:
def __init__(self):
self.grammars = [
jsgf.parse_grammar_file(f"grammars/{file_name}")
for file_name in os.listdir("grammars")
]
def get_dialog_act(self, rule):
slots = []
self.get_slots(rule.expansion, slots)
return {"act": rule.grammar.name, "slots": slots}
def get_slots(self, expansion, slots):
if expansion.tag != "":
slots.append((expansion.tag, expansion.current_match))
return
for child in expansion.children:
self.get_slots(child, slots)
if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef):
self.get_slots(expansion.referenced_rule.expansion, 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.lower())
if matched:
return self.get_dialog_act(matched[0])
return {"act": "null", "slots": []}

26
evaluate.py Normal file
View File

@ -0,0 +1,26 @@
import os
import re
import pandas as pd
import numpy as np
from chatbot.modules.nlu import NLU
rows = 0
hits = 0
nlu = NLU()
for file_name in os.listdir("data"):
df = pd.read_csv(f"data/{file_name}", sep="\t", names=["user", "sentence", "acts"])
df = df[df.user == "user"]
data = np.array(df)
for row in data:
rows += 1
sentence = row[1]
cleaned_text = re.sub(r'\([^)]*\)', '', row[2])
user_acts = cleaned_text.split("&")
nlu_match = nlu.match(sentence)
if nlu_match["act"] in user_acts:
hits += 1
print(f"Accuracy: {(hits / rows) * 100}")

View File

@ -16,7 +16,7 @@ public <cena> = <liczba> zł;
public <liczba> = jeden | dwie | trzy | cztery | pięć | sześć | siedem | osiem | dziewięć | dziesięć; public <liczba> = jeden | dwie | trzy | cztery | pięć | sześć | siedem | osiem | dziewięć | dziesięć;
public <adres> = ulica <ulica> miasto <miasto> kod pocztowy <kod_pocztowy>; public <adres> = ulica <ulica> miasto <miasto> kod pocztowy <kod_pocztowy>;
public <ulica> = ul. <nazwa_ulicy>; public <ulica> = ul <nazwa_ulicy>;
public <miasto> = <nazwa_miasta>; public <miasto> = <nazwa_miasta>;
public <kod_pocztowy> = <cyfra><cyfra>-<cyfra><cyfra><cyfra>; public <kod_pocztowy> = <cyfra><cyfra>-<cyfra><cyfra><cyfra>;

View File

@ -3,4 +3,4 @@
grammar welcomemsg; grammar welcomemsg;
public <welcomemsg> = <welcomemsgs>; public <welcomemsg> = <welcomemsgs>;
<welcomemsgs> = Witamy w sklepie internetowym XYZ W czym mogę pomóc | Witaj! W czym mogę Ci dzisiaj pomóc| Witamy w sklepie internetowym XYZ W swojej ofercie mamy artykuły ogrodowe meblowe oraz kosmetyki | Witam tutaj sklep wielobranzowy w czym moge pomoc; <welcomemsgs> = Witamy w sklepie internetowym XYZ W czym mogę pomóc | Witaj W czym mogę Ci dzisiaj pomóc | Witamy w sklepie internetowym XYZ W swojej ofercie mamy artykuły ogrodowe meblowe oraz kosmetyki | Witam tutaj sklep wielobranzowy w czym moge pomoc | cześć chciałbym kupić {product};

View File

@ -2,6 +2,7 @@ import jsgf
request_grammar = jsgf.parse_grammar_file('./grammars/request.jsgf') request_grammar = jsgf.parse_grammar_file('./grammars/request.jsgf')
def main(): def main():
utterance = 'Czy macie w ofercie balsam do ciała' utterance = 'Czy macie w ofercie balsam do ciała'
matched = request_grammar.find_matching_rules(utterance) matched = request_grammar.find_matching_rules(utterance)