grammars-jsfg #2
42
chatbot/modules/nlu.py
Normal file
42
chatbot/modules/nlu.py
Normal 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
26
evaluate.py
Normal 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}")
|
@ -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>;
|
||||||
|
|
||||||
|
@ -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};
|
1
main.py
1
main.py
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user