В настоящее время недостаточно разработать хороший продукт. Очень важно, как вы это представите. Очень много случаев, когда прорывные идеи не получали спонсорской поддержки без должной демонстрации их возможностей. Это доказанный психологический факт, что красивый дизайн играет важную роль в успехе любого продукта. Красивая презентация может внести гораздо больший вклад в ваш окончательный успех, чем вы могли ожидать.

Сегодня ключевая концепция - это упрощение, и она работает и в дизайне. Дополнительные кнопки заменены на интуитивно понятный и удобный интерфейс. Таким образом, разработка приложений становится не просто процессом, требующим много времени, но и довольно дорогим и требующим огромной команды разработчиков. Однако добавление некоторых функций или решение проблем также может занять некоторое время. В некоторых случаях, когда крайний срок приближается, это неуместно. Технологии развиваются и растут, и скорость разработки тоже постоянно растет. Теперь один разработчик просто не может разрабатывать интеллектуальные модули и веб-сайт, который можно было бы выставить напоказ, потому что технологии слишком сильно различаются. К счастью, многие компании сталкиваются с такой проблемой, поэтому для ее решения была разработана новая структура.

Основные подходы и принципы, лежащие в основе рекомендательных систем, были рассмотрены в предыдущей статье. Мы разработали простой и рабочий алгоритм реализации нашей математической модели, который можно рекомендовать определенному количеству людей.

Теперь мы подробно рассмотрим процесс разработки приложения для получения музыки по имени. Для этого воспользуемся фреймворком Streamlit. Эта технология позволяет создавать красивые сайты, используя только Python. Это круто, поскольку вам не нужно быть знакомым с какой-либо другой технологией или программой.

Streamlit был разработан сотрудниками предприятия специально для разработчиков интеллектуальных систем (при этом использование фреймворка этим не ограничивается). Streamlit предназначен для сокращения времени разработки за счет исключения следующих шагов: развертывание приложения, внутренняя и внешняя разработка. Вы просто пишете код своего приложения на Python и сразу видите результат в браузере. Такой подход к разработке позволяет исправить большинство ошибок на месте. Кстати, процесс разработки похож на работу с Jupyter Notebook, что многим может понравиться. Окончательный код приложения, полученный в процессе разработки, читабелен и чист, что позволяет другим разработчикам быстро понять принцип работы алгоритма.

Инструментарий работает по принципу обычного скрипта Python. Это означает, что любое изменение интерфейса должно быть полностью изменено. Есть необходимые утилиты для работы со сложными вычислениями через кеширование результатов.

Помимо плюсов, конечно, есть и мелкие минусы. Для представления интерфейса доступны только два представления (меню и главное представление). Это может оттолкнуть некоторых разработчиков.

Фреймворк Streamlit был разработан специалистами крупных компаний специально для разработчиков интеллектуальных систем (но технология не ограничивается только этой областью) и призван сократить время разработки приложений за счет исключения таких этапов, как развертывание приложения, разработка backend и frontend. Вы просто реализуете код своего приложения на Python и сразу видите результат в браузере. Такой подход к разработке позволяет исправить большинство ошибок на месте. Кроме того, разработка очень похожа на работу в Jupyter Notebook, что может понравиться многим разработчикам. Окончательный код приложения, полученный во время разработки с помощью этого инструмента, читабелен и чист. Это, в свою очередь, позволяет другим разработчикам быстро понять принцип работы алгоритма.

Инструментарий работает по принципу обычного скрипта Python. Это означает, что любое изменение виджетов интерфейса позиции перезапускает свою работу, а продуманная архитектура фреймворка пересчитывает только те места, которые необходимы для изменения интерфейса, поэтому фреймворк работает очень быстро по сравнению с аналогичными. единицы. Также есть необходимые утилиты для работы со сложными вычислениями путем кеширования результатов.

Помимо плюсов есть и небольшие минусы. Стоит учесть тот факт, что в вашем распоряжении всего два поля для отображения интерфейса (меню и основная область соответственно). Кроме того, элементы могут отображаться только последовательно друг за другом, что может показаться некоторым разработчикам странным.

Вернемся к разработке приложений. Для начала нужно собрать большую базу данных пользователей и их историю прослушивания музыки. Необходимо создать связь между группами. Этот шаг позволит нам искать похожих художников в будущем. За основу можно взять базу данных LastFM Dataset на несколько сотен тысяч записей. Этого более чем достаточно для создания прочной системы.

Также можно собрать информацию об артистах в Википедии и после ее группировки сохранить в реляционной базе данных. Мы будем использовать SQLite в качестве основной базы данных, поскольку это одна из самых быстрых баз данных, и Python также имеет встроенные модули для работы с ней.

После успешного завершения всех действий со сбором данных, используя рассмотренный метод матричной факторизации, рассчитываем матрицу рекомендаций (стоит учесть, что алгоритм из предыдущей статьи имеет очень большую асимптотическую сложность и использовать его не рекомендуется. для больших данных. Для этих целей используются его модификации:, SVD ++ и другие). Как только будут завершены все необходимые приготовления для внедрения основного приложения, можно приступать к работе с сайтом.

Для начала нужно реализовать функции поиска исполнителя в базе по имени и индексу. Для этого мы реализуем функцию get_info, которая будет выполнять простой запрос к нашей базе данных. А чтобы не писать несколько функций, мы используем механизм диспетчеризации событий Python, работающий стандартным модулем. Следует отметить, что вам следует нормализовать строку для поиска по имени исполнителя. Таким образом, вы можете искать строки, содержащие в имени символы, отличные от ASCII. Код функции поиска показан ниже:

# Create a cursor to the main music database. CURSOR = sqlite3.connect('soundera.sqlite3').cursor() @st.cache @functools.singledispatch def get_info(name: str) -> Tuple[str, str, int]: """Find a artist information by provided name. This method is necessary to find a artist information by provided name in the main music database. Everyone results of this method are streamlit caching to achieve higher performance. """ name = unicodedata.normalize('NFKD', name.lower().strip()) # Executing artist search by name among available in the database. CURSOR.execute("SELECT * FROM artists WHERE name = ? LIMIT 1", [name]) return CURSOR.fetchone() @st.cache @get_info.register(int) def _(name_id: int) -> Tuple[str, str, int]: """Find a artist information by provided name_id. This method is necessary to find a artist information by provided index in the main music database. Everyone results of this method are streamlit caching to achieve higher performance. This function is extension of the method get_info. """ CURSOR.execute("SELECT * FROM artists WHERE name_id = ? LIMIT 1", [name_id]) return CURSOR.fetchone()

После успешной реализации функции поиска исполнителя необходимо загрузить рассчитанные ранее параметры для математической модели. Для их сохранения и для последующей быстрой работы рекомендуется использовать формат хранения данных h5. Оптимизирован для работы с числами. Для этого напишем небольшую функцию с использованием библиотеки h5py и результат будет кеширован. См. Ниже реализацию этой функции:

@st.cache def load_params(filename: str) -> Tuple[np.ndarray, np.ndarray]: """Restore system params state from the user provided file. This method is necessary to restore system params state from the user provided path to file. The system parameters of the model are stored in a special format for storing number values. """ with h5py.File(pathlib.Path(filename).resolve(), 'r') as source_f: x = source_f['x'][:] y = source_f['y'][:] return x, y

Теперь нам нужно реализовать функцию для вычисления похожих групп. Для этого нам нужно умножить матрицу скрытых атрибутов U на вектор признаков исполнителя, на котором мы ориентируемся UTi, и разделить все на норму вектора. Мы используем следующую формулу:

Эта формула позволяет рассчитать сходство предметов между собой, что требуется в задаче. Код этой функции приведен ниже:

@st.cache def recommend(item_id: int) -> List[Tuple[int, float]]: """Search for the most correlated items to the item of user interest. This method is necessary to search for the most correlated items to the item of user interest. The conclusion results sort by descending order in the vector of the correlations of items. """ params = load_params('soundera.h5') # Computing the norm of item factors vector. norms = np.sqrt((params[1] * params[1]).sum(axis=1)) # Computing the correlation between items in the dataset. scores = params[1].dot(params[1][item_id]).flatten() / norms # Computing indexes of items in the primary dataset. indexes = np.argpartition(scores, -26)[-26:] return sorted(zip(indexes, scores[indexes]), key=lambda x: -x[1])

Имея все необходимые функции, вы можете разработать пользовательский интерфейс с помощью Streamlit. В левом меню нам нужно сделать поле ввода для ввода названия группы. Сделать это довольно просто: нужно создать элемент text_input, доступный в библиотеке Streamlit, и присвоить результат переменной. Пожалуйста, посмотрите код ниже:

# Create a widget for entering the name of a song or artist. music_title = st.sidebar.text_input('Enter a music title or artist name:', 'Placebo')

Теперь вам нужно запросить информацию из базы данных и передать ее функции для расчета рекомендаций. Результаты могут быть отображены в окне интерфейса с информацией о группе, собранной ранее. Код реализации представлен ниже:

try: name, info, index = get_info(music_title) # Show name of the artist. st.title(name.title()) # Computing the most correlated items for provided music name. items = (get_info(int(item[0])) for item in recommend(index)) # Show a table with results. st.table(pd.DataFrame(items)) if not info: st.markdown(unsafe_allow_html=True, body=""" We could not find description for this artist or group name for you requested :( Perhaps the description of this artist or group name is not in the database. """) else: # Showing information about the artist if possible. st.markdown(body=f'{info}', unsafe_allow_html=True) except TypeError: st.markdown(unsafe_allow_html=True, body=""" We could not find a suitable artist or group name for the name you requested :( Perhaps this artist or group name is not in the database or the name is entered incorrectly. Checkup the name of the artist or group and try again. """)

Выполнено! Теперь вы можете запускать созданное приложение с помощью основной команды Streamlit run и получать рекомендации для ваших любимых групп. Наш пример:

После успешной реализации вам необходимо развернуть свое приложение в облаке и поделиться им с друзьями или использовать его для получения рекомендаций. Для этого вы должны сначала создать виртуальную среду Python и установить все необходимые зависимости проекта. Вы можете запустить следующую команду:

$ sudo apt-get -y install graphviz python3-venv tmux
$ python3 -m venv venv
$ ./venv/bin/pip install graphviz == 0.13.0 h5py == 2.10.0 numpy = = 1.17.3 с обтекаемым светом == 0.50.2

Затем переместите все файлы проекта в облако. Например, вы можете использовать утилиту ssh. Для этого выполните следующие команды:

$ scp -r ./music_algo [email protected]: ~ /

Далее вам необходимо настроить Streamlit для корректной работы в сети. Укажите следующие параметры в файле ~ / .streamlit / config.toml:

После внесения изменений сохраните файл и запустите сценарий с помощью ранее установленной утилиты tmux. Для этого выполните следующие команды:

$ tmux new-session -d -s «музыка» ~ / .venv / venv / streamlit запустить main.py

Эта команда запустит демон с процессом приложения. Для управления приложением необходимо выполнить команду: tmux attach-session -t music и выполнить необходимые действия. Такой подход обеспечивает безошибочный рабочий процесс приложения после отключения сеанса ssh.

Первоначально опубликовано на https://celadonsoft.com.