Да, это все о Streamlit, пользовательском интерфейсе, который написан исключительно на чистом коде Python и позволяет вам видеть результат прямо в веб-браузере, а не в консоли IDE. Изюминкой является то, что он поддерживает все широко используемые визуализации данных, такие как Matplotlib, Altair, Vega-lite и другие. Более того, сообщество Streamlit очень открыто для обсуждения новых функций и поддержки. Наконец, развернуть окончательный вариант продукта довольно просто, поскольку он коррелирует с репозиторием вашего проекта на GitHub.

Эта статья содержит пошаговое руководство по созданию простого приложения для распознавания тем Streamlit ML и несколько полезных советов по настройке его дизайна.

Шаг 1. Начало работы

Во-первых, вам нужно установить библиотеку.

pip install streamlit 

Затем вы создаете каталог my_streamlit_app (или любое другое имя) и добавляете файл My_app.py, куда вы импортируете все необходимые библиотеки. Наше приложение предсказывает тему.

import streamlit as st
import topic_recognition

Я уже обучил свой классификатор Multi-label с помощью Scikit-learn и векторизатора tfidf. Вот - аналогичная проблема подробно объяснена. У меня есть три отдельных файла: один для создания и подгонки модели; один для предварительной обработки входящего текста и прогнозирования темы, и еще один с моим приложением Streamlit. В приложении я импортировал файл, в котором будет предсказываться тема для текста, вводимого пользователем. Набор данных, обученная модель, словарь и бинаризатор сохраняются в каталоге my_streamlit_app.

Шаг 2. Создайте приложение

from PIL import Image
st.title("Topic recognition app :memo:")
img = Image.open("Image.jpg")
st.image(img)
st.subheader("This tool can predict the topic of your text.")

Синтаксис Streamlit довольно прост. Он поддерживает уценку, можно вставлять смайлы и включать вполне стандартные для таких библиотек виджеты, как слайдер, переключатели, флажки, поля выбора, а также видео и аудио. Полное руководство по интерактивным функциям можно найти в его документации.

Теперь нам нужно добавить текстовую область для ввода текста пользователем и кнопку «Отправить».

text_input = st.text_input(label='Your text')
submit_button = st.button(label='Submit', value="Type here...")

Вот что увидит пользователь:

Кроме того, вы можете загрузить текст пользователя, используя опцию загрузки файла.

pip install PyMuPDF

После того, как вы установили пакеты для чтения файла pdf, откройте и прочтите его в своем приложении.

import fitz
uploaded_pdf = st.file_uploader("Load your pdf file: ", type=['pdf'])

if uploaded_pdf is not None:
    with fitz.open(stream=uploaded_pdf.read(), filetype="pdf") as doc:
        text_input = ""
        for page in doc:
            text_input += page.getText()
        st.write(text_input)
        doc.close()
else:
    st.write("File not found")

Результат будет таким:

Если вы хотите настроить фон, вы можете добавить эти функции и загрузить свое изображение.

import base64
@st.cache( allow_output_mutation=True )
def get_base64_of_bin_file(bin_file):
    with open( bin_file, 'rb' ) as f:
        data = f.read()
    return base64.b64encode( data ).decode()

def set_png_as_page_bg(png_file):
    bin_str = get_base64_of_bin_file(png_file)
    page_bg_img = '''
    <style>
    body {
    background-image: url("data:image/png;base64,%s");
    background-size: cover;
    }
    </style>
    '''% bin_str

    st.markdown(page_bg_img, unsafe_allow_html=True)
    return

set_png_as_page_bg('background.png')

Вы также можете выбрать одну из тем оформления или индивидуальную. Больше информации в блоге Streamlit.

Шаг 3. Добавьте свою модель

Просто добавьте одну строчку кода:

st.write('Predicted topic: {topic}.'.format(topic= topic_recognition.predict_topic(text_input)))

Мы также можем добавить некоторые функции редактирования, чтобы сделать наши результаты более читабельными.

  1. Markdown
st.write('Predicted topic: **{topic}**.'.format(topic= topic_recognition.predict_topic(text_input)))

2. Текстовая аннотация

from __init__ import annotated_text
def annotation(text):
    topics = topic_recognition.predict_topic(text)
    text_with_annotations = []
    for i in range(0,len(topics)):
        topic = topics[i]
        text_with_annotations.append((topic, "", "#8ef"))
    annotated_text(50,"Predicted topic: ", *text_with_annotations)

annotation(text_input)

Полное руководство по работе с аннотированным текстом можно найти здесь. Streamlit работает с компонентами JavaScript и HTML, как мы могли видеть, и которые могут отображаться в ваших приложениях.

Шаг 4. Запуск приложения

Чтобы запустить приложение в браузере, просто введите в терминале:

streamlit run app.py

и ваше приложение будет запускаться на http: // localhost: 8501.

Шаг 5. Развертывание

После того, как вы добавили все необходимые функции, вы можете развернуть свое приложение. Для этого вам нужно щелкнуть мышью в правом верхнем углу и выбрать «Развернуть это приложение».

После того, как вы ее нажмете, вы перейдете на https://share.streamlit.io/, где вы можете авторизоваться, используя свою учетную запись GitHub, и выбрать имя репозитория или вставить ссылку в свой файл app.py. Чтобы развернуть приложение, вам нужен файл requirements.txt со списком всех библиотек, которые необходимо установить. В моем случае этот файл выглядит так:

О том, как установить требования к дальнейшей упаковке, вы можете прочитать здесь.

Вы также можете развернуть свое приложение с помощью Docker и Heroku.

Вывод:

Плюсы использования Streamlit:

  • довольно простой интуитивно понятный синтаксис
  • поддержка компонентов HTML и JavaScript
  • активное сообщество
  • быстрое добавление новых функций
  • покрывают большинство виджетов пользовательского интерфейса
  • поддерживать несколько интерактивных визуализаций

Минусы:

  • невозможность встраивать собственные куски кода, следовательно, невозможно уйти далеко от стандартного интерфейса Streamlit
  • В моем приложении было несколько моделей, и я мог развернуть его как через docker, так и через git, однако модели в общей версии ничего не предсказывали. Я хотел бы дополнительно изучить этот вопрос и буду рад услышать предложения.

В общем, большое спасибо за чтение. Пожалуйста, оставляйте комментарии, если у вас есть какие-либо вопросы, и аплодируйте, если вам понравилась эта история.