Это не очень сложно сделать, но недавно я опубликовал несколько графиков статистики комментариев Reddit в Твиттере, и люди спрашивали, как я это сделал. Во-первых, вот графики:

Есть много простых способов анализа комментариев на Reddit, но я выбрал менее эффективный — написать два набора скриптов: один для анализа комментариев и один для их визуализации. Таким образом, я могу использовать действительно быстрый язык для анализа (Go) и что-то более традиционное для визуализации; JavaScript с D3. Я немного новичок в обоих языках, поскольку писал и модифицировал существующий код на обоих языках, но я знал, что многое узнаю о новых проектах, если буду использовать их оба.

Суть вещей такова:

  1. Скачать все комментарии Reddit за последний год
  2. Повторите анализ, в конечном итоге выводя JSON
  3. Визуализируйте JSON в d3
  4. Делайте заметки по пути.

Анализ

Вы можете скачать все комментарии на pushshift.io, если вы это сделаете, я предлагаю вам сделать пожертвование (им), если вы скачиваете много. Я скачал весь 2016 год и каждый месяц получаю новые комментарии 2017 года за предыдущий месяц.

Я скажу здесь, что вы, вероятно, можете использовать BigQuery для этого анализа, у pushshift есть отличный учебник по нему. Я мог бы сделать это, или я мог бы настроить экземпляр Hive и запросить данные, или я мог бы сделать множество других вещей, но для гибкости и простоты знакомства с данными я использую Go.

В Go я просматриваю каждую строку каждого файла и подсчитываю итоги, суммы или что-то еще. Это все пользовательский код. Я пытался преобразовать все в протобуф (заметки здесь, здесь, здесь), но это не дало никакой выгоды в скорости, а выгода в экономии места была не в восторге. Я также баловался параллелизмом, но дело в том, что это довольно линейный процесс, и я не вижу компромисса во времени разработки, чтобы исправить это. Поскольку мой анализ сосредоточен на одном субреддите, я должен был извлечь все комментарии для этого субреддита и просто проанализировать эти файлы, но я прокрастинатор, поэтому я этого не сделал.

В настоящее время я запускаю одну функцию анализа (извлечение) и две функции агрегации: для подсчета количества уникальных комментаторов в день, а затем вторую для подсчета количества комментариев, созданных [удалено], что является прокси для удаленных комментариев. . Это простые подсчеты или наборы, которые хранятся в карте дат и увеличиваются или добавляются при необходимости. (Код извлечь данные здесь, агрегировать здесь.)

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

Вывод моей программы Go очень прост: просто JSON, который я затем могу передать для визуализации.

Визуализация

Я решил использовать D3, так как он очень хорошо известен. Я также хотел сделать больше с «настоящим» проектом JavaScript, включая систему сборки, тестовый сервер, возможно, горячую перезагрузку, все эти вещи. Сколько бы вы ни слышали в Интернете жалоб на JS-фреймворки и тому подобное, они быстро меняются, но они, безусловно, дают мне обновление по сравнению с моим предыдущим миром взломанных скриптов, обновлением и обслуживанием вещей.

Я начал с настройки JS/D3/Python dev server и перешел на WebPack, Babel, ES2015 и NPM. Двумя моими главными приоритетами были быстрая система сборки (быстрая в человеческом смысле, меньше команд и больше автоматизации) и возможность разбивать мои файлы на множество модулей. Настройка всего заняла некоторое время, но оно того стоило. (Помощь в том, что здесь и здесь.)

D3 — это круто, но Майк Босток — супергерой и практически во всем дает пример. Я искал столбчатую диаграмму и нашел пример, из которого я изучил и сгенерировал частично новый код. Спасибо чувак!

Дальше все было легко — немного JS и несколько уроков в D3, и вы увидите, что диаграммы в целом довольно просты.

Пожалуйста, не стесняйтесь разветвляться, изменять или отправлять PR в любой из репозиториев!

В качестве бонуса мой последний график с тех пор, как я начал писать эту статью: