53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
|
import jsgf
|
||
|
|
||
|
class Book_NLU: #Natural Language Understanding
|
||
|
"""
|
||
|
Moduł odpowiedzialny za analizę tekstu. W wyniku jego działania tekstowa reprezentacja wypowiedzi użytkownika zostaje zamieniona na jej reprezentację semantyczną, najczęściej w postaci ramy.
|
||
|
|
||
|
Wejście: Tekst
|
||
|
|
||
|
Wyjście: Akt użytkownika (rama)
|
||
|
"""
|
||
|
def __init__(self, acts, arguments, book_grammar):
|
||
|
self.acts = acts
|
||
|
self.arguments = arguments
|
||
|
self.book_grammar = book_grammar
|
||
|
|
||
|
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 analyze(self, text):
|
||
|
"""
|
||
|
Analiza Tekstu wprowadzonego przez użytkownika i zamiana na akt (rama)
|
||
|
"""
|
||
|
print("Analiza Tekstu: " + text)
|
||
|
act = "(greetings()&request(name))"
|
||
|
print("Akt to: " + act)
|
||
|
#przerobienie na wektor
|
||
|
act_vector = [[0],[1,0]] #1 wektor to greetings, a 2 wektor to request z argumentem "name"
|
||
|
print("Zamiana na: ")
|
||
|
print(act_vector)
|
||
|
return act_vector
|
||
|
|
||
|
def test_nlu(self, utterance):
|
||
|
matched = self.book_grammar.find_matching_rules(utterance)
|
||
|
print(matched)
|
||
|
|
||
|
if matched:
|
||
|
return self.get_dialog_act(matched[0])
|
||
|
|
||
|
else:
|
||
|
return {'act': 'null', 'slots': []}
|