Время прочтения: 5 мин.

Довольно сложная задача найти информацию для работы в области DataScience. Она есть в открытом доступе в такой социальной сети как Вконтакте.

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

Таким образом, чтобы получить какую-либо информацию например о пользователе, необходимо сделать http-запрос такого типа:

https://api.vk.com/method/users.get?user_id=210700286&v=5.52

где мы видим протокол, по которому осуществляется соединение, адрес API-сервиса, название метода API и параметры запроса.

В ответ сервер вернет JSON с запрошенными данными.

В чем удобство данного метода сбора информации?

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

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

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

Наш выбор пал на язык Python и такие библиотеки как: rutermextract, urllib.request, json.

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

https://vk.com/editapp?act=create

Там создаем приложение и переходим на вкладку Настройки, там имеется ID-приложения. Данный идентификатор понадобится для авторизации.

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

Вставим следующую строку в адресную строку браузера:

https://oauth.vk.com/authorize?client_id=5490057&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.52

Где client_id должен быть равен идентификатору вашего приложения.

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

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

Проверим нашу работу:

https://api.vk.com/method/friends.getOnline?v=5.52&access_token=

После access_token= пишем наш токен и нажимаем Enter. Вуаля! Мы получили идентификаторы пользователей, которые на текущий момент находятся онлайн.

Теперь сделаем кое-что поинтересней.

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

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

#Поиск сотрудников по имеющимся данным
def search_users():
    q = 'Vladislav%20Makarov' #Имя Фамилия
    count = '10' #количество пользователей
    birth_day = '07' #день рождения
    birth_month = '08' #месяц рождения
    birth_year = '1997' #год рождения
    #сам запрос
    response = urllib.request.urlopen(URL + 'users.search?q=' + q + '&count=' + count + '&birth_day=' + birth_day + '&birth_month=' + birth_month + '&birth_year=' + birth_year + '&v=5.52&access_token=' + token)
    #преобразуем в json формат и в словарь
    json_m = response.read().decode('utf-8')
    data = json.loads(json_m)
    ids = []
    for i in data['response']['items']:
        ids.append(i['id'])
    return ids

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

Результат выполнения программы:

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

#возврат записей со стены пользователя или сообщества
def wall(owner_id):
    count = '2' #количество записей
    response = urllib.request.urlopen(URL + 'wall.get?owner_id=' + owner_id + '&v=5.52&access_token=' + token)

    json_m = response.read().decode('utf-8')
    data = json.loads(json_m)
    #тут мы выводим текст записи на стене пользователя
    try:
        print(data['response']['items'][1]['text'])
        analyze(data['response']['items'][1]['text'])
    except Exception as e:
        print(e)

Результат выполнения данной функции представлен на картинке ниже:

У нас есть несколько видов постов: пост написанный самим человеком, репост, и посты с картинками. Посты с картинками и репосты не рассматриваем, в данной статье рассмотрим только посты написанные самими пользователями и извлечем ключевые слова из них.

#функция по извлечению ключевых слов поста
def analyze(text):
    term_extractor = TermExtractor()
    for term in term_extractor(text):
        print(term.normalized, term.count)

Данная функция получает на вход текст поста и извлекает из него ключевые слова. С помощью встроенного морфологического анализатора pymorphy2.

Результат извлечения ключевых слов представлен на следующей картинке:

Такие ключевые слова извлечены из поста. Сложно говорить о смысле текста, но уже можно понять какие возможности можно получить с помощью данного инструмента.

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