def __init__(self, data_folder): self.data_folder = data_folder self.greetings = [] self.goodbyes = [] self.insteadof_rules = [] self.after_rules = [] # правила, срабатывающие после основной обработки реплики, например - активация дополнительного сценария self.comprehension_rules = None self.forms = [] # список экземпляров VerbalForm self.scenarios = [] # список экземпляров Scenario self.smalltalk_rules = SmalltalkRules() self.story_rules = StoryRules() self.continuation_rules = ContinuationRules()
def load_yaml(yaml_node, global_bot_scripting, smalltalk_rule2grammar, constants, text_utils): scenario = Scenario() scenario.name = yaml_node['name'] if 'priority' in yaml_node: scenario.priority = int(yaml_node['priority']) else: scenario.priority = 10 # дефолтный уровень приоритета if 'steps_policy' in yaml_node: scenario.steps_policy = yaml_node[ 'steps_policy'] # TODO - сделать проверку значения else: scenario.steps_policy = 'sequential' if 'chitchat_questions_per_step_rate' in yaml_node: scenario.chitchat_questions_per_step_rate = yaml_node[ 'chitchat_questions_per_step_rate'] else: scenario.chitchat_questions_per_step_rate = 0 if 'steps' in yaml_node: for step_node in yaml_node['steps']: step = ActorBase.from_yaml(step_node, constants, text_utils) scenario.steps.append(step) if 'on_start' in yaml_node: scenario.on_start = ActorBase.from_yaml(yaml_node['on_start'], constants, text_utils) if 'termination_policy' in yaml_node: scenario.termination_policy.load_yaml( yaml_node['termination_policy'], constants, text_utils) if 'on_finish' in yaml_node: scenario.on_finish = ActorBase.from_yaml(yaml_node['on_finish'], constants, text_utils) if 'smalltalk_rules' in yaml_node: scenario.smalltalk_rules = SmalltalkRules() scenario.smalltalk_rules.load_yaml(yaml_node['smalltalk_rules'], smalltalk_rule2grammar, constants, text_utils) scenario.insteadof_rules = [] if 'rules' in yaml_node: for rule in yaml_node['rules']: rule = ScriptingRule.from_yaml(rule['rule'], constants, text_utils) scenario.insteadof_rules.append(rule) if 'insteadof_rule_import' in yaml_node: insteadof_rule_import = yaml_node['insteadof_rule_import'] if insteadof_rule_import == 'from_global': # добавляем в список глобальные insteadof-правила scenario.insteadof_rules.extend( global_bot_scripting.insteadof_rules) return scenario
def load_rules(self, yaml_path, compiled_grammars_path, text_utils): with io.open(yaml_path, 'r', encoding='utf-8') as f: data = yaml.safe_load(f) if 'greeting' in data: self.greetings = data['greeting'] if 'goodbye' in data: self.goodbyes = data['goodbye'] if 'forms' in data: for form_node in data['forms']: form = VerbalForm.from_yaml(form_node['form']) self.forms.append(form) # Для smalltalk-правил нужны скомпилированные генеративные грамматики. smalltalk_rule2grammar = dict() with open(compiled_grammars_path, 'rb') as f: n_rules = pickle.load(f) for _ in range(n_rules): key = pickle.load(f) grammar = GenerativeGrammarEngine.unpickle_from(f) grammar.set_dictionaries(text_utils.gg_dictionaries) smalltalk_rule2grammar[key] = grammar if 'scenarios' in data: for scenario_node in data['scenarios']: self.scenarios.append(Scenario.load_yaml(scenario_node['scenario'], smalltalk_rule2grammar, text_utils)) # INSTEAD-OF правила for rule in data['rules']: try: rule = ScriptingRule.from_yaml(rule['rule']) self.insteadof_rules.append(rule) except Exception as ex: logging.error(ex) raise ex self.smalltalk_rules = SmalltalkRules() self.smalltalk_rules.load_yaml(data['smalltalk_rules'], smalltalk_rule2grammar, text_utils) self.comprehension_rules = ComprehensionTable() self.comprehension_rules.load_yaml_data(data) self.common_phrases = [] for common_phrase in data['common_phrases']: self.common_phrases.append(common_phrase)
def __init__(self, data_folder): self.data_folder = data_folder self.greetings = [] self.goodbyes = [] self.confirmations = [] self.negations = [] self.first_reply_rules = [ ] # правила, отрабатывающие на первой реплике собеседника в сессии self.insteadof_rules = [] self.after_rules = [ ] # правила, срабатывающие после основной обработки реплики, например - активация дополнительного сценария self.forms = [] # список экземпляров VerbalForm self.scenarios = [] # список экземпляров Scenario self.smalltalk_rules = SmalltalkRules() self.story_rules = StoryRules() self.continuation_rules = ContinuationRules() self.rule_paths = [] self.comprehension_rules = ComprehensionTable() self.common_phrases = []
class BotScripting(object): def __init__(self, data_folder): self.data_folder = data_folder self.greetings = [] self.goodbyes = [] self.insteadof_rules = [] self.smalltalk_rules = [] self.comprehension_rules = None self.forms = [] # список экземпляров VerbalForm self.scenarios = [] # список экземпляров Scenario @staticmethod def __get_node_list(node): if isinstance(node, list): return node else: return [node] def load_rules(self, yaml_path, compiled_grammars_path, text_utils): with io.open(yaml_path, 'r', encoding='utf-8') as f: data = yaml.safe_load(f) if 'greeting' in data: self.greetings = data['greeting'] if 'goodbye' in data: self.goodbyes = data['goodbye'] if 'forms' in data: for form_node in data['forms']: form = VerbalForm.from_yaml(form_node['form']) self.forms.append(form) # Для smalltalk-правил нужны скомпилированные генеративные грамматики. smalltalk_rule2grammar = dict() with open(compiled_grammars_path, 'rb') as f: n_rules = pickle.load(f) for _ in range(n_rules): key = pickle.load(f) grammar = GenerativeGrammarEngine.unpickle_from(f) grammar.set_dictionaries(text_utils.gg_dictionaries) smalltalk_rule2grammar[key] = grammar if 'scenarios' in data: for scenario_node in data['scenarios']: self.scenarios.append(Scenario.load_yaml(scenario_node['scenario'], smalltalk_rule2grammar, text_utils)) # INSTEAD-OF правила for rule in data['rules']: try: rule = ScriptingRule.from_yaml(rule['rule']) self.insteadof_rules.append(rule) except Exception as ex: logging.error(ex) raise ex self.smalltalk_rules = SmalltalkRules() self.smalltalk_rules.load_yaml(data['smalltalk_rules'], smalltalk_rule2grammar, text_utils) self.comprehension_rules = ComprehensionTable() self.comprehension_rules.load_yaml_data(data) self.common_phrases = [] for common_phrase in data['common_phrases']: self.common_phrases.append(common_phrase) def get_smalltalk_rules(self): return self.smalltalk_rules def start_conversation(self, chatbot, session): # Начало общения с пользователем, для которого загружена сессия session # со всей необходимой информацией - история прежних бесед и т.д # Выберем одну из типовых фраз в файле smalltalk_opening.txt, вернем ее. logging.info(u'BotScripting::start_conversation') if len(self.greetings) > 0: return random.choice(self.greetings) return None def generate_after_answer(self, bot, answering_machine, interlocutor, interpreted_phrase, answer): # todo: потом вынести реализацию в производный класс, чтобы тут осталась только # пустая заглушка метода. # language_resources = answering_machine.text_utils.language_resources # probe_query_str = language_resources[u'как тебя зовут'] # probe_query = InterpretedPhrase(probe_query_str) # answers, answer_confidenses = answering_machine.build_answers0(bot, interlocutor, probe_query) # ask_name = False # if len(answers) > 0: # if answer_confidenses[0] < 0.70: # ask_name = True # else: # ask_name = True # # if ask_name: # # имя собеседника неизвестно. # q = language_resources[u'А как тебя зовут?'] # nq = answering_machine.get_session(bot, interlocutor).count_bot_phrase(q) # if nq < 3: # Не будем спрашивать более 2х раз. # return q return None def get_insteadof_rules(self): return self.insteadof_rules