from rasa_core_sdk import Action from rasa_core_sdk.events import SlotSet """ Custom Actions to get Information about Schema for Actions class ActionSearchInfo(Action): Starts Search Action for an Information, depending on found intent (Intent 'birthplace' -> 'ActionSearchBirthplace') - Obtains slot value of recognized physicist entity - Iterates over 'data.tsv' to find demanded info for given physicist - Stores value of info in its slot class ActionUtterInfo(Action): Starts Utterance Action for an Information - Obtains slot value for recognized physiscist entity and info value from Search-Action - Prints Bot utterance containing the above to the console """ # # Birthplace # class ActionSearchBirthplace(Action): def name(self): return 'action_search_birthplace' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_birthplace = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_birthplace = row['birthplace'] return [SlotSet('birthplace', actual_birthplace if actual_birthplace is not None and actual_birthplace is not "" else "not known")] class ActionUtterBirthplace(Action): def name(self): return 'action_utter_birthplace' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') birthplace = tracker.get_slot('birthplace') dispatcher.utter_message("Birthplace of {} is {}.".format(person, birthplace)) return [] # # Birthdate # class ActionUtterBirthdate(Action): def name(self): return 'action_utter_birthdate' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') birthdate = tracker.get_slot('birthdate') dispatcher.utter_message("Birthdate of {} is {}.".format(person, birthdate)) return [] class ActionSearchBirthdate(Action): def name(self): return 'action_search_birthdate' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_birthdate = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_birthdate = row['birthdate'] return [SlotSet('birthdate', actual_birthdate if actual_birthdate is not None and actual_birthdate is not "" else "not known")] # # Day of death # class ActionSearchDayOfDeath(Action): def name(self): return 'action_search_day_of_death' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_day_of_death = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_day_of_death = row['day_of_death'] return [SlotSet('day_of_death', actual_day_of_death if actual_day_of_death is not None and actual_day_of_death is not "" else "not known")] class ActionUtterDayOfDeath(Action): def name(self): return 'action_utter_day_of_death' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') day_of_death = tracker.get_slot('day_of_death') dispatcher.utter_message("The day of death of {} is {}.".format(person, day_of_death)) return [] # # Place of death # class ActionSearchPlaceOfDeath(Action): def name(self): return 'action_search_place_of_death' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_place_of_death = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_place_of_death = row['place_of_death'] return [SlotSet('place_of_death', actual_place_of_death if actual_place_of_death is not None and actual_place_of_death is not "" else "not known")] class ActionUtterPlaceOfDeath(Action): def name(self): return 'action_utter_place_of_death' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') place_of_death = tracker.get_slot('place_of_death') dispatcher.utter_message("The place of death of {} is {}.".format(person, place_of_death)) return [] # # Is alive # class ActionSearchIsAlive(Action): def name(self): return 'action_search_is_alive' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_is_alive = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_is_alive = row['is_alive'] return [SlotSet('is_alive', actual_is_alive if actual_is_alive is not None and actual_is_alive is not "" else "not known")] class ActionUtterIsAlive(Action): def name(self): return 'action_utter_is_alive' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') is_alive = tracker.get_slot('is_alive') dispatcher.utter_message("{} is {}.".format(person, is_alive)) return [] # # num spouses # class ActionSearchSpouse(Action): def name(self): return 'action_search_spouse' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_spouse= None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_spouse = row['spouse'] return [SlotSet('spouse', actual_spouse if actual_spouse is not None and actual_spouse is not "" else "not known")] class ActionUtterNumSpouses(Action): def name(self): return 'action_utter_spouse' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') spouse = tracker.get_slot('spouse') dispatcher.utter_message("The spouse of {} is {}.".format(person, spouse)) return [] # # Primary Education # class ActionSearchPrimaryEducation(Action): def name(self): return 'action_search_primary_education' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_primary_education = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_primary_education = row['primary_education'] return [SlotSet('primary_education', actual_primary_education if actual_primary_education is not None and actual_primary_education is not "" else "not known")] class ActionUtterPrimaryEducation(Action): def name(self): return 'action_utter_primary_education' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') primary_education = tracker.get_slot('primary_education') dispatcher.utter_message("The primary education of {} is {}.".format(person, primary_education)) return [] # # University # class ActionSearchUniversity(Action): def name(self): return 'action_search_university' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_university = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_university = row['university'] return [SlotSet('university', actual_university if actual_university is not None and actual_university is not "" else "not known")] class ActionUtterUniversity(Action): def name(self): return 'action_utter_university' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') university = tracker.get_slot('university') dispatcher.utter_message("The University of {} is {}.".format(person, university)) return [] # # Area of Research # class ActionSearchAreaOfResearch(Action): def name(self): return 'action_search_area_of_research' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_area_of_research = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_area_of_research = row['area_of_research'] return [SlotSet('area_of_research', actual_area_of_research if actual_area_of_research is not None and actual_area_of_research is not "" else "not known")] class ActionUtterAreaOfResearch(Action): def name(self): return 'action_utter_area_of_research' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') area_of_research = tracker.get_slot('area_of_research') dispatcher.utter_message("{} did research in {}.".format(person, area_of_research)) return [] # # Workplace # class ActionSearchWorkplace(Action): def name(self): return 'action_search_workplace' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_workplace = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_workplace = row['workplace'] return [SlotSet('workplace', actual_workplace if actual_workplace is not None and actual_workplace is not "" else "not known")] class ActionUtterWorkplace(Action): def name(self): return 'action_utter_workplace' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') workplace = tracker.get_slot('workplace') dispatcher.utter_message("The Workplace of {} is {}.".format(person, workplace)) return [] # # Awards # class ActionSearchAwards(Action): def name(self): return 'action_search_awards' def run(self, dispatcher, tracker, domain): import csv import re person = tracker.get_slot('physicist') name_regex = re.compile(person, re.IGNORECASE) actual_awards = None with open('data.tsv') as csvfile: spamreader = csv.DictReader(csvfile, delimiter='\t') for row in spamreader: if name_regex.match(row['name']): actual_awards = row['awards'] return [SlotSet('awards', actual_awards if actual_awards is not None and actual_awards is not "" else "not known")] class ActionUtterAwards(Action): def name(self): return 'action_utter_awards' def run(self, dispatcher, tracker, domain): person = tracker.get_slot('physicist') awards = tracker.get_slot('awards') dispatcher.utter_message("The Awards of {} are {}".format(person, awards)) return []