Обробка даних в 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 і a list — дата початку та кінця періоду вивантаження у форматі '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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.