COVID-19 рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдмреЙрдЯ // рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ

рдХреЛрд░реЛрдирд╛рд╡рд╛рдпрд░рд╕ рдкрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдЪрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЙрдкрдпреЛрдЧреА (рд▓реЗрдХрд┐рди рдХреЛрдИ рдХрдо рдкреНрд░рдЪрд╛рд░) рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ COVID-19 рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП 2.5 рдШрдВрдЯреЗ рдореЗрдВ рдирд┐рдпрдо рдЖрдзрд╛рд░рд┐рдд NLP рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ред

рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдкрд╛рдпрдерди, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдкреАрдЖрдИ, рдорд╛рдирдХ рдПрдирдПрд▓рдкреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдбреЙрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред



рдпреВрдПрдлрдУ рдХреЗрдпрд░ рдорд┐рдирдЯ


рдорд╣рд╛рдорд╛рд░реА COVID-19, SARS-CoV-2 рдХреЛрд░реЛрдирд╛рд╡рд╛рдпрд░рд╕ (2019-nCoV) рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрдВрднреАрд░ рддреАрд╡реНрд░ рд╢реНрд╡рд╕рди рд╕рдВрдХреНрд░рдордг рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ Habr├й рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ - рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп / рдЙрдкрдпреЛрдЧреА рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╣рдо рдЖрдкрд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХрд╛ рдЖрдЧреНрд░рд╣ рдХрд░рддреЗ рд╣реИрдВред


рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд░реЛрдд

, .

рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдзреЛрдПрдВ, рдЕрдкрдиреЗ рдкреНрд░рд┐рдпрдЬрдиреЛрдВ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦреЗрдВ, рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рдШрд░ рдкрд░ рд░рд╣реЗрдВ рдФрд░ рджреВрд░ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди рдкрдврд╝реЗрдВ: рдХреЛрд░реЛрдирд╛рд╡рд╛рдпрд░рд╕ | рджреВрд░рджрд░рд╛рдЬ рдХреЗ рдХрд╛рдо

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдпрд╣ рд▓реЗрдЦ COVID-19 рдкрд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рддрдХрдиреАрдХ рдмреЗрд╣рдж рд╕рд░рд▓ рдФрд░ рдмрд╣реБрдореБрдЦреА рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕реНрдЯреЗрдЯ рдСрдл рдж рдЖрд░реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкрд╛рдардХ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреБрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рдпрдерди 3.X рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг (PyCharm, VS рдХреЛрдб), рдЖрдк BotFather рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ рдмреЙрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

1. API рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рдкрд╣рд▓реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдкреАрдЖрдИ " рдкрд╛рдпрдерди-рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдмреЙрдЯ " рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЖрджреЗрд╢ рд╣реИ:

pip install python-telegram-bot --upgrade

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреАрдУрдЯреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП "рд╣реИрдВрдбрд▓рд░" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ:

  • рд╕реНрдЯрд╛рд░реНрдЯ - рдмреЙрдЯ рдХрд╛ рд▓реЙрдиреНрдЪ рдХрдорд╛рдВрдб;
  • help - рд╣реЗрд▓реНрдк рдХрдорд╛рдВрдб (рдорджрдж);
  • рд╕рдВрджреЗрд╢ - рдкрд╛рда рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг;
  • рддреНрд░реБрдЯрд┐ - рдПрдХ рддреНрд░реБрдЯрд┐ред

рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:

def start(update, context):
    #   
    pass


def help(update, context):
    #  
    pass


def message(update, context):
    #  
    pass


def error(update, context):
    # 
    pass

рдЕрдЧрд▓рд╛, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рд╣рдо рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрди рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмреЙрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

def get_answer():
    """Start the bot."""
    # Create the Updater and pass it your bot's token.
    # Make sure to set use_context=True to use the new context based callbacks
    # Post version 12 this will no longer be necessary
    updater = Updater("Token", use_context=True)

    # Get the dispatcher to register handlers
    dp = updater.dispatcher

    # on different commands - answer in Telegram
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help))

    # on noncommand i.e message - echo the message on Telegram
    dp.add_handler(MessageHandler(Filters.text, message))

    # log all errors
    dp.add_error_handler(error)

    # Start the Bot
    updater.start_polling()

    # Run the bot until you press Ctrl-C or the process receives SIGINT,
    # SIGTERM or SIGABRT. This should be used most of the time, since
    # start_polling() is non-blocking and will stop the bot gracefully.
    updater.idle()


if __name__ == "__main__":
    get_answer()

рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдмреЙрдЯ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ 2 рддрдВрддреНрд░ рд╣реИрдВ:

  • рдорд╛рдирдХ рдорддрджрд╛рди - рдирдИ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдкреАрдЖрдИ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреАрдУрдЯреА рдХрд╛ рдЖрд╡рдзрд┐рдХ рдорддрджрд╛рди updater.start_polling();
  • Webhook - рд╣рдо рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдмреЙрдЯ рд╕реЗ рдШрдЯрдирд╛рдПрдБ рдЖрддреА рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП HTTPS рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╣рдо рдорд╛рдирдХ рдорддрджрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

2. рд╣рдо рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рд╣реИрдВрдбрд▓рд░ рднрд░рддреЗ рд╣реИрдВ


рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ, рд╢реБрд░реБрдЖрдд рднрд░реЗрдВ рдФрд░ рдорд╛рдирдХ рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде рд╣реИрдВрдбрд▓рд░ рдХреА рдорджрдж рдХрд░реЗрдВ, рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИ:

def start(update, context):
    """Send a message when the command /start is issued."""
    update.message.reply_text("""
!
        COVID-19.
:
- *  ?*
- *  ?*
- *   ?*
 ..
 !
    """, parse_mode=telegram.ParseMode.MARKDOWN)


def help(update, context):
    """Send a message when the command /help is issued."""
    update.message.reply_text("""
     (  COVID-19).
:
- *  ?*
- *  ?*
- *   ?*
 ..
 !
    """, parse_mode=telegram.ParseMode.MARKDOWN)

рдЕрдм, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдорд╛рдВрдб рднреЗрдЬрддрд╛ / рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ / рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╛рда рдХреЛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

parse_mode=telegram.ParseMode.MARKDOWN

рдЕрдЧрд▓рд╛, рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВ:

def error(update, context):
    """Log Errors caused by Updates."""
    logger.warning('Update "%s" caused error "%s"', update, context.error)

рдЕрдм, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдмреЙрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдПрдХ рдПрдХрд▓ рдлрд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╕рдВрдкреВрд░реНрдг рдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП app.py ред рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рдд рдЬреЛрдбрд╝реЗрдВ ред

рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдкрд░ рдЬрд╛рдПрдВ ( рдЕрдкрдиреЗ рдЯреЛрдХрди рдХреЛ рдХреЛрдб рдореЗрдВ рдбрд╛рд▓рдирд╛ рди рднреВрд▓реЗрдВ )ред рд╣рдо рдХрдорд╛рдВрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ / рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ / рд╕рд╣рд╛рдпрддрд╛ рдФрд░ рдЖрдирдиреНрдж рдХрд░рддреЗ рд╣реИрдВ:



3. рд╣рдо рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ


рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЬрд░реВрд░рдд рд╣реИ рдЬреНрдЮрд╛рдирдХреЛрд╖ред рдЖрдк рдЬреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рдХрд┐ рдХреА-рд╡реИрд▓реНрдпреВ рд╡реИрд▓реНрдпреВрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг json рдлрд╛рдЗрд▓ рдмрдирд╛рдирд╛, рдЬрд╣рд╛рдБ Key рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рд╢реНрди рдХрд╛ рдкрд╛рда рд╣реИ, рдФрд░ рд╡реИрд▓реНрдпреВ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╣реИред рдЬреНрдЮрд╛рди рдХрд╛ рдЖрдзрд╛рд░ рдЙрджрд╛рд╣рд░рдг:

{
  "      ?": "  тАФ  .     -     ,     ,     ,        .    ,      ,   .        ,     .",
  "   ?": "  :\n     \n    \n    \n     \n\n         ,    .",
  "  ?": " :\n- (    , , )\n- (  )",
  }

рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

  1. рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдкрд╛рда рдорд┐рд▓рддрд╛ рд╣реИ;
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рда рдореЗрдВ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ;
  3. рд╣рдо рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ ( рд▓реЗрд╡реЗрдиреНрд╕реНрд╣реЗрдЯрд┐рди рджреВрд░реА ) рд╕реЗ рд╕рднреА рд▓рд┐рдореЗрдЯреЗрдЯ рдХрд┐рдП рдЧрдП рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рда рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ;
  4. рд╣рдо рдЬреНрдЮрд╛рдирдХреЛрд╖ рд╕реЗ рд╕рдмрд╕реЗ "рд╕рдорд╛рди" рдкреНрд░рд╢реНрди рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ;
  5. рд╣рдо рдЪрдпрдирд┐рдд рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВред

рдЕрдкрдиреА рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдлрдЬреАрд╡рд┐рдЬреНрдЬреА (рдлрдЬреА рддреБрд▓рдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП) рдФрд░ рдкрд╛рдЗрдореЙрд░реНрдл 2 ( рд▓реЗрдореЗрдЯреНрд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП)ред

рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдФрд░ рдзреНрд╡рдирд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

import json
from fuzzywuzzy import fuzz
import pymorphy2

#   
morph = pymorphy2.MorphAnalyzer()
#  
with open("faq.json") as json_file:
    faq = json.load(json_file)


def classify_question(text):
    #  
    text = ' '.join(morph.parse(word)[0].normal_form for word in text.split())
    questions = list(faq.keys())
    scores = list()
    #      
    for question in questions:
        #    
        norm_question = ' '.join(morph.parse(word)[0].normal_form for word in question.split())
        #       
        scores.append(fuzz.token_sort_ratio(norm_question.lower(), text.lower()))
    # 
    answer = faq[questions[scores.index(max(scores))]]

    return answer

рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдПрдХ tsv рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ:

def dump_data(user, question, answer):
    username = user.username
    full_name = user.full_name
    id = user.id

    str = """{username}\t{full_name}\t{id}\t{question}\t{answer}\n""".format(username=username,
                                                                 full_name=full_name,
                                                                 id=id,
                                                                 question=question,
                                                                 answer=answer)

    with open("/data/dump.tsv", "a") as myfile:
        myfile.write(str)

рдЕрдм, рд╣рдо рдЙрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рд╕рдВрджреЗрд╢ рдкрд╛рда рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд╕рдВрджреЗрд╢ рдореЗрдВ рд▓рд┐рдЦреА рд╣реИ:

def message(update, context):
    """Answer the user message."""
    # 
    answer = classify_question(update.message.text)
    #  
    dump_data(update.message.from_user, update.message.text, answer)
    # 
    update.message.reply_text(answer)

рд╡реЛрдЗрд▓рд╛, рдЕрдм рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд▓реЗрдЦрди рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ:



4. рдбреЙрдХрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВ


рдЬреИрд╕рд╛ рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдиреЗ рдХрд╣рд╛: "рдпрджрд┐ рдЖрдк рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдВрджрд░ рд╣реИред", рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЛрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реЛ, рд╣рдо рдбреЙрдХрдЯрд░ рдХрдВрдкреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдЯреЗрдирд░реАрдХрд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:

  1. Dockerfile рдмрдирд╛рдПрдВ - рдХрдВрдЯреЗрдирд░ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреА рдЫрд╡рд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ;
  2. Docker-compose.yml рдмрдирд╛рдПрдБ - рдПрдХ рдПрдХрд▓ рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред)
  3. Boot.sh рдмрдирд╛рдПрдБ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдзреЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ)ред

рддреЛ, рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА:

#
FROM python:3.6.6-slim

#  
WORKDIR /home/alex/covid-bot

#  requirements.txt
COPY requirements.txt ./

# Install required libs
RUN pip install --upgrade pip -r requirements.txt; exit 0

#      
COPY data data

#   
COPY app.py faq.json reply_generator.py boot.sh  ./

#   
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# 
RUN chmod +x boot.sh

#  
ENTRYPOINT ["./boot.sh"]

Docker-compose.yml рдХреА рд╕рд╛рдордЧреНрд░реА:

# docker-compose
version: '2'
#  
services:
  bot:
    restart: unless-stopped
    image: covid19_rus_bot:latest
    container_name: covid19_rus_bot
    #    boot.sh
    environment:
      - SERVICE_TYPE=covid19_rus_bot
    # volume      
    volumes: 
        - ./data:/data

Boot.sh рдХреА рд╕рд╛рдордЧреНрд░реА:

#!/bin/bash
if [ -n $SERVICE_TYPE ]
then
  if [ $SERVICE_TYPE == "covid19_rus_bot" ]
  then
    exec python app.py
    exit
  fi
else
  echo -e "SERVICE_TYPE not set\n"
fi

рддреЛ, рд╣рдо рддреИрдпрд╛рд░ рд╣реИрдВ, рдпрд╣ рд╕рдм рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

sudo docker build -t covid19_rus_bot:latest .
sudo docker-compose up

рдпрд╣ рд╣реИ, рд╣рдорд╛рд░реЗ рдмреЙрдЯ рддреИрдпрд╛рд░ рд╣реИред

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рд╕рднреА рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдлрдПрдХреНрдпреВ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдЬреНрдЮрд╛рди рдЖрдзрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ! рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рдХреБрдВрдЬреА рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рди рдХреЛ рдмрджрд▓рдХрд░ рднреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдПрдХ рд╡рд┐рд╖рдп рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрдЧреА рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдЙрддреНрддрд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА (рд╡рд┐рднрд┐рдиреНрди рдЙрддреНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╕реНрдХреЗрд▓-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рдЧрднрдЧ 500 рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЬреНрдЮрд╛рди рдЖрдзрд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдЧрд╛ред

рдЬреЛ рд▓реЛрдЧ рдЕрдВрдд рддрдХ рдкрдврд╝ рдЪреБрдХреЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдЕрдкрдирд╛ рдмреЙрдЯ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ ред

All Articles