Обработка данных в iPython notebook для задач SEO

image

При выполнении аналитических задач SEO, SMM, маркетинга мы столкнулись с непомерно растущим количеством инструментов для обработки данных. Каждый заточен под свои возможности или доступность для пользователя: Excel и VBA, сторонние SEO-инструменты, PHP и MySQL, Python, C, Hive и другие. Разнообразные системы и источники данных добавляют проблем: счетчики, рекламные системы, CRM, инструменты вебмастера Яндекса и Google, соцсети, HDFS. Необходим инструмент, совмещающий в себе простоту настройки и использования, модули для получения, обработки и визуализации данных, а также работы с различными типами источников. Выбор пал на iPython notebook (с недавних пор Jupyter notebook), представляющий собой платформу для работы со скриптами на 40 языках программирования. Широкое распространение платформа получила для научных вычислений, среди специалистов по обработке данных и машинному обучению. К сожалению для автоматизации и обработки данных маркетинговых задач Jupyter notebook используется крайне редко.

Для задач веб-аналитики и обработки данных для SEO Jupyter notebook подходит по нескольким причинам:
— простая настройка
— обработка и визуализация данных без необходимости писать код
— при недостатке ресурсов персонального компьютера можно просто запустить notebook на более мощной виртуалке (например, используя Amazon Web Services) и посчитать нужные данные без изменений кода скрипта

В данной статье рассмотрим три примера, которые помогут начать использовать Jupyter notebook для решения практических задач:

API Яндекс Метрики
Часто встречаются задачи подготовки отчетов о посещениях сайтов, данные для этих отчетов можно собирать автоматически, один раз настроив систему. Выигрыш по времени очевиден. В примере посмотрим как из Яндекс Метрики выгрузить статистику всех поисковых фраз для нескольких проектов (получить всю статистику из веб-интерфейса в этом случае довольно трудоемко).

Word2vec
Существуют сложные алгоритмы для автоматической обработки текстовых данных, посмотрим как их можно достаточно просто использовать для анализа конкретно ваших данных. Задачи, которые можно решать с помощью word2vec — поиск опечаток в словах, поиск синонимов, поиск «похожих» слов.

Расчет PageRank
Для специалистов SMO будет интересно, как с помощью алгоритма расчета PR можно найти самых авторитетных участников сообщества. Немного изменив настройку скрипта с таким же успехом можно найти страницу с самым высоким PageRank на вашем сайте. Также посмотрим как визуализировать пользователей группы ВКонтакте с помощью D3js.

Доклад был представлен на первом SEO Meetup «Data Driven SEO» 4 февраля в Rambler&Co (ссылка на видео).

Готовые коды этих примеров можно взять на GitHub.

Установка Jupyter notebook
Для установки на персональный компьютер потребуется всего 2 действия:
1. Устанавливаем дистрибутив питона Anaconda

2. В командной строке выполняем: conda install jupyter

Для запуска notebook в командной строке выполняем: jupyter notebook

В случае успешной установки в браузере откроется окно вида:
image

Выгрузка отчетов из Яндекс Метрики
(код примера)
Посмотрим как автоматически выгружать данные из отчета «Поисковые фразы». Проблемы ручной выгрузки такого отчета вполне очевидны: Яндекс Метрика не всегда может выгрузить сразу всю таблицу (для больших проектов число строчек исчисляется сотнями тысяч), а регулярная выгрузка для нескольких проектов в принципе довольно утомительна. Для тех, кому незнаком синтаксис питона, разберем этот пример подробно.
habrastorage.org/files/385/ae6/980/385ae698096d4b7b9df4e116ede90525.jpg

Импортируем нужные для библиотеки для запросов к API и работе с форматом JSON:

# -*- coding: utf-8 -*-
import requests
import json

Ctrl + Enter — выполнить строчку. Shift + Enter — выполнить строчку и перейти на следующую.

Получаем токен для запросов к своим счетчикам:
1. На странице https://oauth.yandex.ru/ заводим приложение и даем ему разрешение на получение статистики Яндекс Метрики. Скриншоты можно посмотреть в статье https://habrahabr.ru/post/265383/

2. Подставляем ID приложения в URL https://oauth.yandex.ru/authorize? response_type=token&client_id=
В результате получим авторизационный токен, который будем использовать в каждом запросе к Яндекс Метрике. Копипастим полученный токен в переменную скрипта token.

Задаем параметры нашей выгрузки:
project — список ваших счетчиков, по которым будем доставать данные (восьмизначное число в списке счетчиков metrika.yandex.ru)
startDate и endDate — дата начала и конца периода выгрузки в формате 'YYYY-MM-DD'. Например, startDate = '2016–01–31'
limit — сколько строк будем выгружать за один запрос. Например, если у нас 500 000 строк в отчете, то при значении limit = 10000 (максимальное значение для текущей версии API) скрипт сделает 50 запросов, чтобы выгрузить всю таблицу целиком

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

f = open('search phrases.txt', 'w')
f.close()

Далее в цикле проходим по всем номерам счетчиков, перечисленных в листе projects:

for project in projects:

Для каждого номера счетчика project начинаем выгрузку с первой строки (offset = 1), и в каждом цикле увеличиваем это значение на limit. Параметры в запросах к API (ссылка на документацию tech.yandex.ru/metrika/doc/api2/api_v1/intro-docpage):
oauth_token — полученный нами токен
id — номер счетчика
accuracy=full — точность, значение 'full' соответствует положению ползунка 100%
dimensions и metrics — измерения (строки таблицы) и метрики (столбцы)

Результат (как работать с JSON https://docs.python.org/2/library/json.html) добавляем в файл с разделителем табуляция (\t). Итоговую выгрузку копипастим в привычные отчеты и инструменты вроде Excel.

Word2Vec
(код примера)
Для использования библиотеки Word2Vec сначала дополнительно устанавливаем gensim pypi.python.org/pypi/gensim (не входит в дистрибутив Anaconda по умолчанию). На вход модели подается лист предложений из исходного списка поисковых фраз. Т. е. лист вида [['смотреть', 'фильмы', 'онлайн'], ['курс', 'рубля'], …].

Далее задаем параметры модели:
— num_features — размерность пространства векторов. Чем значение больше, тем с большей «точностью» модель будет учитывать входные данные (иногда увеличение размерности не дает улучшения качества модели). Обычно используют значения от 10 до нескольких сотен. Соответственно чем больше размерность, тем большие вычислительные ресурсы потребуются.
— min_word_count — позволяет учитывать в итоговом словаре модели только часто встречающиеся слова. Чаще всего берутся значения от 5 до 100. В результате мы существенно сократим размер словаря, оставив только имеющие практический смысл слова
— num_workers — сколько процессов параллельно будут строить модель
— context — сколько слов в контексте следует учитывать алгоритму. Поисковые запросы представляют собой весьма короткие «предложения»
— downsampling — исключаем часто встречающиеся в тексте слова. Google рекомендует значения от .00001 до .001

В данном примере модель строилась на 5 млн. поисковых запросах около 40 минут на ноутбуке с 2GB свободной RAM. Такой объем данных вполне можно использовать для задач SEO:

1. Поиск опечаток и семантически близких слов (напротив слова указывается косинусная мера близости соответствующих векторов):

Варианты опечаток и семантически близких слов для запроса 'yandex' в русской раскладке:
image

Пример близких слов к запросу 'сирия + асад':
image

В словосочетаниях можно различать запросы по «смыслу» (в плане близости соответствующих векторов). Выдача для дверных и автомобильных замков будет отличаться от зАмков швейцарии:
image

2. Нахождение взаимосвязей сущностей. Данный запрос к модели покажет слова, которые относятся к России также, как доллар относится к США. Логично, что это должны быть относящиеся к России валюты из поисковых запросов:
image

3. Определение «лишних» слов в списке
Слова 'форекс', 'нефть' и 'золото' будут гораздо ближе друг к другу в векторном пространстве из поисковых запросов, чем 'однушка':
image

Аналогичным образом из списка 'кот', 'человек', 'слон', 'шиншилла' запрос без «животного» признака окажется лишним:
image

4. Автоматическая кластеризация контента
Имея построенную с помощью Word2Vec модель, можно автоматически кластеризовать слова в векторном пространстве, используя популярные алгоритмы кластеризации. Например, применяя алгоритм KMeans для модели на 1000 текстов Lenta.ru, получим основные новостные сюжеты:
— эмбарго в отношении Украины
image

— теракты в Париже (слово «батаклать» получилось в результате обработки стеммером названия театра «Батаклан»)
image

— С-400 в Сирии
image

Работа с графами в Neworkx
(код выгрузки данных по API Вконтакте, обработка и визуализация)
В техническом плане графы представляют собой набор узлов, связанных между собой ребрами. На практике в качестве узлов могут выступать пользователи социальной сети или группы, страницы сайта. В качестве ребер — наличие дружбы между парой пользователей, сообщения, отметки нравится в постах группы, ссылки на другие страницы сайта. Библиотека Networkx позволяет строить такие графы и считать разнообразные характеристики графов. Посмотрим на примере группы ВКонтакте как посчитать PageRank каждого пользователя и визуализировать это в браузере.

В качестве примера была взята одна из относительно небольших групп из 660 участников (для наглядной визуализации), в которой многие участники знакомы друг с другом. Для построения графа достаточно выгрузить список участников группы (метод groups.getMembers API ВКонтакте), а затем для каждого участника получить список его друзей (метод friends.get). Результат выгрузки записываем в текстовый файл в формате:
{
ID пользователя,
[список друзей пользователя]
}

В итоге узлами графа g будут ID участников группы, а ребрами — ID друзей этого пользователя. Для подсчета PageRank используем функцию: x = networkx.pagerank (g). Выводим топ участников группы:
image

Для визуализации используем библиотеку D3.js, force-collapcible. В качестве размера узла берем его pagerank:
image

При наведении на узел можем посмотреть какому ID он принадлежит. Посмотреть подробную информацию о пользователей по его ID можно с помощью метода users.get: https://api.vk.com/method/users.get? user_id=12345

© Habrahabr.ru