Exemplo n.º 1
0
    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/
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
    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)

    # Выполняем привязку обработчиков
Exemplo n.º 6
0
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',