Как предсказывать успешность постов в социальной сети

Как предсказывать успешность постов в социальной сети

У меня есть своя группа «Вконтакте», и мне стало интересно, можно ли спрогнозировать, будет публикация успешной или нет. Я решил написать программу, которая бы автоматически брала текст поста, проверяла его с помощью нейронной сети и публиковала только в том случае, если вероятность получить одобрение аудитории достаточно высока. Разрабатывать мы будем на Qt5 и используем Python и Keras для обучения нейросети.
Для начала в проекте на Qt в файле .pro подключим библиотеку network, добавив строку QT += network. Чтобы разместить пост на стене группы, выполняем код:

Как видишь, мы отправляем запрос POST с адресом в переменной str. Используем метод VK API wall.post, чтобы разместить пост на стене группы. Параметр owner_id должен быть равен номеру группы, но записан со знаком минус; параметр message содержит текст поста; from_group — указатель, что пост будет размещен от имени сообщества, он равен единице; access_token — токен доступа.

Ты мог заметить, что для обработки запроса мы подключили слот slotV. Он может выглядеть так:

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

Создание базы данных для обучения нейронной сети

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

Чтобы извлечь каждый пост, отправляем запрос GET:

Мы используем метод VK API wall.getById: извлекаем пост со стены группы по его номеру.

Параметр posts содержит уникальный идентификатор поста (здесь — -78329950_123), который состоит из идентификатора группы со знаком минус и порядкового номера поста, разделенных знаком _. Порядковый номер поста содержится в переменной cnt. Параметр access_token — это токен доступа к группе.

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

Теперь, когда все посты записаны в файл, мы готовы синтезировать нейронную сеть и обучать ее.

Keras для работы с нейронными сетями

Нам понадобится Keras — библиотека для работы с нейронными сетями.

Есть замечательная книга — «Глубокое обучение на Python» Франсуа Шолле. По ней ты можешь освоить теорию, ознакомиться с примерами решения задач от самых простых до весьма сложных, таких как сверточные сети и генерация изображений.

Для начала выполним ряд стандартных действий и установим Python:

Затем установим пакеты научных вычислений для Python:

Поставим TensorFlow:

И саму библиотеку Keras:

Можно установить Keras и из репозитория на GitHub. В этом случае ты получишь доступ к папке keras/examples с примерами сценариев.

Чтобы проверить, что все установилось, попробуй запустить сценарий Keras.

Для выполнения этого примера может потребоваться несколько минут.

Обучение нейронной сети

Основу своей нейронной сети я выбрал из библиотек Keras — нейронная сеть предсказывает, какой отзыв получит рецензия на фильм: положительный или отрицательный. В нашем случае сеть будет определять, получит пост лайки или нет. Начнем с подключения всех необходимых библиотек и модулей.

Объявим два массива: string_list и mark_list. В первом будут храниться тексты постов, а во втором ноль, если у соответствующего поста не было лайков, и единица, если были. Прочитаем все посты из созданного ранее файла базы данных.

Создадим и подготовим токенайзер:

Токенайзер создает таблицу, в которой каждому слову из нашего массива постов присваивается уникальное число. Максимальное число в моем случае — 15000.

Сохраним таблицу токенайзера в файл, чтобы пользоваться ей в дальнейшем:

А теперь преобразуем наш массив постов в массив чисел в соответствии с таблицей токенайзера:

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

Далее наши массивы надо привести к формату, удобному для понимания нейронной сетью. Это значит, что число слов в каждом посте должно быть одинаковым. Зададим его равным 400. Если в каком-нибудь посте будет меньше слов, то оставшиеся числа заполнятся нулями:

На данный момент все подготовительные мероприятия завершены, и мы можем синтезировать нейронную сеть.

Этот код я полностью взял из примера и заменил лишь размерности данных.

Давай скомпилируем нашу нейронную сеть.

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

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

Процесс может занять до десяти минут, придется подождать. У меня точность обучения составила 62%. Это говорит о том, что в данных была найдена закономерность и сеть можно использовать по назначению. Если бы результат составил 50% или меньше, это значило бы, что закономерностей не найдено и нейронная сеть просто угадывает исход с той же вероятностью.

Давай проверим, как работает наша сеть.

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

Внедрение нейронной сети на Python в проект на С++

Наша нейронная сеть обучена и готова к использованию. Теперь нам надо внедрить ее в проект на С++ на платформе Qt5, который будет постить отобранные посты в ВК.

Тебе нужно только прописать свои пути к файлам vkbase.h5 и tokenizer.pickle.

Скрипт, который мы внедрили в проект, — функция под названием neuron, которая принимает параметр text и возвращает вероятность в виде числа prediction. Опишем доступ к нашей функции и аргумент, который мы будем в нее отдавать.

Здесь переменная cit — это пост, который надо проверить. Теперь вызовем нашу функцию с постом в качестве аргумента и получим результат.

Переменная koef и есть наш результат, вероятность того, что пост получит лайки. Теперь мы можем проверить его: если он больше 0.5, мы можем размещать пост в сети, если меньше — лучше взять другой.

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

Итого

После внедрения описанного проекта в реальной группе ВК я увидел результат довольно скоро. Количество лайков не сильно изменилось, но количество подписчиков продолжает расти, так что этот проект оказался не только интересным, но и полезным. Надеюсь, не для меня одного.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий