parser.add_argument('--models_folder', type=str, default='../../../tmp', help='path to folder with pretrained models') parser.add_argument('--ip', help='listen to specified IP address', type=str, default=listen_ip) parser.add_argument('--port', type=str, default=listen_port) parser.add_argument('--preload', type=bool, default=True, help='Load all models and dictionary before service start-up') args = parser.parse_args() profile_path = os.path.expanduser(args.profile) models_folder = os.path.expanduser(args.models_folder) data_folder = os.path.expanduser(args.data_folder) w2v_folder = os.path.expanduser(args.w2v_folder) tmp_folder = os.path.expanduser(args.tmp_folder) listen_ip = args.ip listen_port = args.port # настраиваем логирование в файл init_trainer_logging(os.path.join(tmp_folder, 'flask_service_bot.log'), debugging=True) if args.preload: init_chatbot() logging.info('Going to run flask_app listening %s:%d profile_path="%s" models_folder="%s" data_folder="%s" w2v_folder="%s"', listen_ip, listen_port, profile_path, models_folder, data_folder, w2v_folder) flask_app.run(debug=False, host=listen_ip, port=listen_port) # https://stackoverflow.com/questions/8495367/using-additional-command-line-arguments-with-gunicorn?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa # Gunicorn entry point generator def start_extractor(*args, **kwargs): global profile_path, models_folder, data_folder, w2v_folder, tmp_folder # Gunicorn CLI args are useless. # https://stackoverflow.com/questions/8495367/
parser.add_argument('--profile', type=str, default='../../data/profile_1.json', help='path to profile file') parser.add_argument('--data_folder', type=str, default='../../data') parser.add_argument('--w2v_folder', type=str, default='../../tmp') parser.add_argument('--models_folder', type=str, default='../../tmp', help='path to folder with pretrained models') parser.add_argument('--tmp_folder', type=str, default='../../tmp', help='path to folder for logfile etc') args = parser.parse_args() profile_path = os.path.expanduser(args.profile) models_folder = os.path.expanduser(args.models_folder) data_folder = os.path.expanduser(args.data_folder) w2v_folder = os.path.expanduser(args.w2v_folder) tmp_folder = os.path.expanduser(args.tmp_folder) #logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) init_trainer_logging(os.path.join(tmp_folder, 'telegram_bot.log'), True) telegram_token = args.token if len(telegram_token) == 0: telegram_token = input('Enter Telegram token:> ').strip() tg_bot = telegram.Bot(token=telegram_token) logging.info('Telegram bot: %s', tg_bot.getMe()) logging.debug('Bot loading...') chatbot = create_chatbot(profile_path, models_folder, w2v_folder, data_folder, True, bot_id='telegram_bot') updater = Updater(token=telegram_token) dispatcher = updater.dispatcher start_handler = CommandHandler('start', start)
def main(): user_id = 'test' parser = argparse.ArgumentParser(description='Question answering machine') parser.add_argument('--data_folder', type=str, default='../../data') parser.add_argument('--w2v_folder', type=str, default='../../tmp') parser.add_argument('--profile', type=str, default='../../data/profile_1.json', help='path to profile file') parser.add_argument('--models_folder', type=str, default='../../tmp', help='path to folder with pretrained models') parser.add_argument('--tmp_folder', type=str, default='../../tmp', help='path to folder for logfile etc') parser.add_argument('--debugging', action='store_true') args = parser.parse_args() profile_path = os.path.expanduser(args.profile) models_folder = os.path.expanduser(args.models_folder) data_folder = os.path.expanduser(args.data_folder) w2v_folder = os.path.expanduser(args.w2v_folder) tmp_folder = os.path.expanduser(args.tmp_folder) init_trainer_logging(os.path.join(tmp_folder, 'console_chatbot.log'), args.debugging) logging.debug('Bot loading...') # Создаем необходимое окружение для бота. # NLP pileline: содержит инструменты для работы с текстом, включая морфологию и таблицы словоформ, # part-of-speech tagger, NP chunker и прочее. text_utils = TextUtils() text_utils.load_embeddings(w2v_dir=w2v_folder, wc2v_dir=models_folder) text_utils.load_dictionaries(data_folder, models_folder) # Настроечные параметры аватара собраны в профиле - файле в json формате. profile = BotProfile() profile.load(profile_path, data_folder, models_folder) # Инициализируем движок вопросно-ответной системы. Он может обслуживать несколько # ботов с разными провилями (базами фактов и правил), хотя тут у нас будет работать только один. machine = SimpleAnsweringMachine(text_utils=text_utils) machine.load_models(data_folder, models_folder, profile.constants) machine.trace_enabled = args.debugging # Контейнер для правил scripting = BotScripting(data_folder) scripting.load_rules(profile.rules_path, profile.smalltalk_generative_rules, profile.constants, text_utils) # Конкретная реализация хранилища фактов - плоские файлы в utf-8, с минимальным форматированием profile_facts = ProfileFactsReader(text_utils=text_utils, profile_path=profile.premises_path, constants=profile.constants) # Подключем простое файловое хранилище с FAQ-правилами бота. # Движок бота сопоставляет вопрос пользователя с опорными вопросами в FAQ базе, # и если нашел хорошее соответствие (синонимичность выше порога), то # выдает ответную часть найденной записи. faq_storage = PlainFileFaqStorage(profile.faq_path, constants=profile.constants, text_utils=text_utils) # Инициализируем аватара bot = BotPersonality(bot_id='test_bot', engine=machine, facts=profile_facts, faq=faq_storage, scripting=scripting, profile=profile) bot.on_process_order = on_order # Выполняем привязку обработчиков bot.add_event_handler(u'weather_forecast', on_weather_forecast) bot.add_event_handler(u'check_emails', on_check_emails) bot.add_event_handler(u'alarm_clock', on_alarm_clock) bot.add_event_handler(u'buy_pizza', on_buy_pizza) bot.start_conversation(user_id) flush_logging() print_tech_banner() while True: print('\n') # В самом начале диалога, когда еще не было ни одной реплики, # бот может сгенерировать некое приветствие или вопрос для # завязывания беседы. Поэтому сразу извлечем сгенерированные фразы из # буфера и покажем их. while True: answer = bot.pop_phrase(user_id) if len(answer) == 0: break print_answer(u'B:>', answer) question = input_kbd('H:>') if len(question) > 0: if question.lower() in ('r\exit', r'\q', r'\quit', '/stop'): break bot.push_phrase(user_id, question)
def main(): user_id = 'test' parser = argparse.ArgumentParser(description='Question answering machine') parser.add_argument('--data_folder', type=str, default='../../data') parser.add_argument('--w2v_folder', type=str, default='../../tmp') parser.add_argument('--profile', type=str, default='../../data/profile_1.json', help='path to profile file') parser.add_argument('--models_folder', type=str, default='../../tmp', help='path to folder with pretrained models') parser.add_argument('--tmp_folder', type=str, default='../../tmp', help='path to folder for logfile etc') parser.add_argument('--debugging', action='store_true') parser.add_argument('--input', type=str, help='Input file with phrases') parser.add_argument('--output', type=str, help='Output file with bot replicas') args = parser.parse_args() profile_path = os.path.expanduser(args.profile) models_folder = os.path.expanduser(args.models_folder) data_folder = os.path.expanduser(args.data_folder) w2v_folder = os.path.expanduser(args.w2v_folder) tmp_folder = os.path.expanduser(args.tmp_folder) init_trainer_logging(os.path.join(tmp_folder, 'console_chatbot.log'), args.debugging) logging.debug('Bot loading...') # Создаем необходимое окружение для бота. # NLP pileline: содержит инструменты для работы с текстом, включая морфологию и таблицы словоформ, # part-of-speech tagger, NP chunker и прочее. text_utils = TextUtils() text_utils.load_embeddings(w2v_dir=w2v_folder, wc2v_dir=models_folder) text_utils.load_dictionaries(data_folder, models_folder) # Настроечные параметры аватара собраны в профиле - файле в json формате. profile = BotProfile() profile.load(profile_path, data_folder, models_folder) # Инициализируем движок вопросно-ответной системы. Он может обслуживать несколько # ботов с разными провилями (базами фактов и правил), хотя тут у нас будет работать только один. machine = SimpleAnsweringMachine(text_utils=text_utils) machine.load_models(data_folder, models_folder, profile.constants) machine.trace_enabled = args.debugging # Контейнер для правил scripting = BotScripting(data_folder) scripting.load_rules(profile.rules_path, profile.smalltalk_generative_rules, profile.constants, text_utils) # Добавляем скрипты на питоне scripting.add_scenario(Scenario_WhoAmI()) # Конкретная реализация хранилища фактов - плоские файлы в utf-8, с минимальным форматированием profile_facts = ProfileFactsReader(text_utils=text_utils, profile_path=profile.premises_path, constants=profile.constants) # Подключем простое файловое хранилище с FAQ-правилами бота. # Движок бота сопоставляет вопрос пользователя с опорными вопросами в FAQ базе, # и если нашел хорошее соответствие (синонимичность выше порога), то # выдает ответную часть найденной записи. faq_storage = PlainFileFaqStorage(profile.faq_path, constants=profile.constants, text_utils=text_utils) # Инициализируем аватара bot = BotPersonality(bot_id='test_bot', engine=machine, facts=profile_facts, faq=faq_storage, scripting=scripting, profile=profile) bot.on_process_order = on_order # Выполняем привязку обработчиков bot.add_event_handler(u'weather_forecast', on_weather_forecast) bot.add_event_handler(u'check_emails', on_check_emails) bot.add_event_handler(u'alarm_clock', on_alarm_clock) bot.add_event_handler(u'buy_pizza', on_buy_pizza) bot.start_conversation(user_id) flush_logging() print_tech_banner() if args.input: # Пакетный режим - читаем фразы собеседника из указанного текстового файла, прогоняем # через бота, сохраняем ответные фразы бота в выходной файл. with io.open(args.input, 'r', encoding='utf-8') as rdr,\ io.open(args.output, 'w', encoding='utf-8') as wrt: # Получим стартовые реплики бота (обычно он здоровается) while True: answer = bot.pop_phrase(user_id) if len(answer) == 0: break wrt.write('B: {}\n'.format(answer)) # Теперь читаем фразы из тестового набора и даем их боту на обработку for line in rdr: inline = line.strip() if inline.startswith('#'): # Может быть спец. команда s = inline[1:].strip() if s.startswith('!'): cmd = s[1:] if cmd == 'reset_running': bot.cancel_all_running_items(user_id) else: # комментарии просто сохраняем в выходном файле для # удобства визуальной организации wrt.write('\n{}\n'.format(inline)) continue if inline: wrt.write('\nH: {}\n'.format(inline)) bot.push_phrase(user_id, line.strip()) while True: answer = bot.pop_phrase(user_id) if len(answer) == 0: break wrt.write('B: {}\n'.format(answer)) else: # Консольный интерактивный режим while True: print('\n') # В самом начале диалога, когда еще не было ни одной реплики, # бот может сгенерировать некое приветствие или вопрос для # завязывания беседы. Поэтому сразу извлечем сгенерированные фразы из # буфера и покажем их. while True: answer = bot.pop_phrase(user_id) if len(answer) == 0: break print_answer(u'B:>', answer) question = input_kbd('H:>') if len(question) > 0: if question.lower() in ('r\exit', r'\q', r'\quit', '/stop'): break bot.push_phrase(user_id, question)
parser.add_argument('--w2v_folder', type=str, default='../../tmp') parser.add_argument('--profile', type=str, default='../../data/profile_1.json', help='path to profile file') parser.add_argument('--models_folder', type=str, default='../../tmp', help='path to folder with pretrained models') parser.add_argument('--tmp_folder', type=str, default='../../tmp', help='path to folder for logfile etc') parser.add_argument('--debugging', action='store_true') parser.add_argument('--greeting', type=int, default=1) parser.add_argument('--chitchat_url', type=str, help='chit-chat service endpoint') args = parser.parse_args() profile_path = os.path.expanduser(args.profile) models_folder = os.path.expanduser(args.models_folder) data_folder = os.path.expanduser(args.data_folder) w2v_folder = os.path.expanduser(args.w2v_folder) tmp_folder = os.path.expanduser(args.tmp_folder) init_trainer_logging(os.path.join(tmp_folder, 'console_chatbot.log'), args.debugging) if args.chitchat_url: rugpt_chitchat_config = ChitchatConfig() rugpt_chitchat_config.service_endpoint = args.chitchat_url # rugpt_chitchat_config.temperature = 0.9 rugpt_chitchat_config.num_return_sequences = 2 logging.info('Chit-chat service to use: %s', str(rugpt_chitchat_config)) else: rugpt_chitchat_config = None logging.info('No chit-chat service!') logging.debug('Bot loading...') bot = create_chatbot(profile_path, models_folder, w2v_folder, data_folder, args.debugging, chitchat_config=rugpt_chitchat_config) # Выполняем привязку обработчиков
if __name__ == '__main__': parser = argparse.ArgumentParser( description='Classifier trainer for intent detection') parser.add_argument('--run_mode', choices='gridsearch train query'.split(), default='train') parser.add_argument('--tmp_dir', default='../tmp') parser.add_argument('--datasets', default='../tmp') args = parser.parse_args() tmp_dir = args.tmp_dir dataset_path = os.path.join(args.datasets, 'intents_dataset.csv') run_mode = args.run_mode init_trainer_logging(os.path.join(tmp_dir, 'train_intent_classifier.log'), logging.DEBUG) logging.info('Start "%s" using dataset_path="%s"', run_mode, dataset_path) # файл в формате json с найденными оптимальными параметрами классификатора, # создается в ходе gridsearch, используется для train best_params_path = os.path.join( tmp_dir, 'train_intent_classifier.best_params.json') model_names = ['intent', 'abusive', 'sentiment', 'direction'] if run_mode == 'gridsearch': logging.info('=== GRIDSEARCH ===') df = pd.read_csv(dataset_path, encoding='utf-8',