Граф цитирования статей Хабрахабра

    Однажды, мне стало интересно: насколько статьи на Хабре связаны между собой? Поэтому сегодня мы займемся исследованием связности статей, и конечно не только посчитаем численные метрики, но и увидим картину целиком.



    (это не просто картинка для привлечения внимания, а граф цитирования статей внутри Хабрахабра, где размер вершин определяется числом входящих рёбер, i.e., "количеством цитат внутри Хабра")


    Началось всё с того, что в комментариях к статье про Хабра-граф и карму Tiberius и Loriowar озвучили идею, фактически витающую в воздухе: а почему бы не взглянуть на граф цитирования статьёй внутри самого Хабра?




    Вы спрашивали? Мы отвечаем. Для того чтобы рассказ не был размахиванием рук, конкретизируем разбираемые вопросы:


    • Q1: Как выглядит граф цитирования Хабрахабра и какие в нём хабы (hubs and authorities)?


    • Q2: Насколько связным является сообщество (граф цитирования) и какие в нём кластеры?


    • Q3: Как изменится граф, если из него убрать самоцитирование?

    Под катом трафик. Все картинки кликабельны.


    Краткие пояснения по терминологии:


    Хаб — это вершина с большим количеством исходящих ссылок, а "авторитетный источник" (authority) — вершина с большим количеством входящих ссылок. Под связностью мы будем понимать среднее число рёбер приходящихся на вершину (входящую или выходящую). Самоцитирование — это ребро, у которого обе вершины с одинаковым автором.


    Граф цитируемости статей (внутри Хабра)


    Возьмем граф из начала статьи и внимательно посмотрим на каждый из кластеров и крупные вершины. Мне удалось выделить и пометить несколько интересных "сообществ" статей.





    К сожалению, пост номер один: habrahabr.ru/post/1 получил много входящих по чисто техническим причинам (несовершенство парсера), на самом деле на него никто не ссылался.


    Остальные кластеры довольно интересны, например есть целая группа историй IT в духе: Грэйс «бабуля COBOL» Хоппер или целый ряд статей по Тензорной Алгебре. Всего у нас 95 тысяч вершин и порядка 50 тысяч рёбер. Связность очень низкая: на одну вершину в среднем приходится порядка одного ребра и примерно 60% всех точек не связаны ни с одной другой статьёй на Хабре — см. большое плотное облако вокруг графа на самой последней картинке внизу.


    Граф без самоцитирования


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





    Однако, ряд кластеров всё-таки выжил. Посмотрим на них повнимательнее.


    "Народные" кластеры


    Три самых больших и интересных кластера, которые выжили — это перевод книги Passionate Programmer, KingPin и лекции Питера Тиля. Отличная командная работа, в том числе и по документированию серии! Это очень интересный и позитивный результат, он говорит о том, что сообщество может скоординировано проводить достаточно большую и сложную работу, а так же поддерживать ссылочную целостность — найдя одну статью, всегда можно извлечь и найти всю серию.



    Карта хабов ака граф исходящих рёбер


    Мы уже посмотрели на "авторитетные источники", где вес вершины определялся входящими ребрами, теперь мы можем взглянуть на вершины с большим числом исходящих рёбер. И определить — какие же в сети присутствуют хабы.





    Рассмотрим степень влияния каждого из хабов, подсветив их рёбра.



    Теперь внимательно посмотрим, что же это за хабы?



    Как мы видим речь в основном идёт о постах с подборками интересных материалов на самом Хабре. Например, топом самого интересного или материалами по питону. Что безусловно логично — самым большим числом внешних ссылок обладают каталоги, хранящие исходящие ссылки (где же этот мета-обзор всех обзоров статей Хабра?).


    Также этот граф подсказывает нам о большой любви сообщества к Python (и, надо сказать, небезосновательно).


    Лидеры по числу входящих\исходящих цитат


    Рассмотрим остальные посты (25+ ссылок) без учёта входящих и исходящих (т.е. считаем граф неориентированным).





    Все статьи в списке можно условно разделить на каталоги (интересные и полезные ссылки по теме Х) и части серии. Если внимательно приглядеться, то первые — это в точности наши хабы, а вторые — authorities.


    То есть статей, которые бы просто все активно цитировали на Хабре нет (по крайней мере цитируют их тут реже, чем статьи серий).


    Рейтинг цитирования авторов


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


    Первое место оказалось довольно предсказуемым — причём с бооольшим отрывом.


    Рейтинг цитирования топ-30

    1 alizar,743
    2 marks,261
    3 ilya42,202
    4 MagisterLudi,202
    5 lapyk,167
    6 XaocCPS,144
    7 SLY_G,131
    8 frii_fond,127
    9 grokru,124
    10 dmitrykabanov,118
    11 kichik,115
    12 saul,101
    13 itinvest,99
    14 jeston,97
    15 ValdikSS,95
    16 Mithgol,83
    17 andorro,76
    18 UiDesignGroup,72
    19 IT_invest,71
    20 amarao,70
    21 p-y-t-h-o-n,69
    22 esetnod32,66
    23 aleksandrit,66
    24 azproduction,64
    25 nokiaman,64
    26 wiygn,63
    27 NCNecros,62
    28 FSBook,61
    29 Boomburum,61


    Рейтинг самоцитирования


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


    Можно считать это личным вкладом в связность статей Хабра (автор данной статьи даже занял в этом рейтинге 26-ое (!) место).


    Рейтинг самоцитирования

    1 itinvest,541
    2 SLY_G,526
    3 MagisterLudi,469
    4 1cloud,424
    5 esetnod32,415
    6 ptsecurity,410
    7 maisvendoo,373
    8 zag2art,365
    9 ilya42,337
    10 EvseyFaydo,302
    11 lol_wat,270
    12 frii_fond,264
    13 1eqinfinity,258
    14 alexzfort,229
    15 XaocCPS,226
    16 andorro,226
    17 alizar,222
    18 khizmax,218
    19 Boomburum,196
    20 Mithgol,188
    21 Milfgard,174
    22 eagleson,173
    23 vedenin1980,168
    24 OsipovRoman,161
    25 CooperMaster,159
    26 varagian,155
    27 bbk,154
    28 Irina_Ua,153
    29 dmitrykabanov,133
    30 Unrul,131


    Воспроизводимость и открытые данные


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


    Ссылки: граф цитирования Хабрахабра и граф без самоцитирования (Gephi), а также дапм всех статей Хабрахабра доступен здесь (собрано в 20-х числах мая 2016-го), как и большое число других вкусных и интересных данных по Хабру, специально собранных и очищенных для использования (может неплохо подойти, если пишите диплом или нужны реальные текстовые или (полу-)структурированные данные).


    Выводы


    • Q1: Хабы — подборки интересностей на Хабре, авторитетные источники — серии статей, граф похож на облачко с несколькими сообществами и огромным поясом статей вокруг без единой ссылки (порядка 60% всех вершин)
    • Q2: Граф сильно разреженный — порядка одного ребра на вершину, встречаются достаточно связные кластеры — например "Магия тензорной алгебры", поддерживающие связность за счет того, что каждая статья хранит каталог всех ссылок серии
    • Q3: Без самоцитирования практически все кластеры пропадают, но остаётся небольшой ряд "народных" кластеров, например перевод книги KingPin, показывающий настоящую командную работу сообщества.

    Вместо заключения


    Из любви к искусству: граф цитирования без учета рёбер в качестве веса вершин

    Поделиться публикацией

    Комментарии 46

      +3
      Отличная статья! Огромное спасибо за проделанную работу!

      Последнюю амёбу надо поставить себе на рабочий стол, выглядит, как делящаяся клетка;)))
        +1
        И правда. А мне почему-то вакуольку напомнило
        +3
        Замечательно, спасибо. Не думал что предложение так быстро материализуется.
          0
          Круто. Большое спасибо за работу.
            +1
            Очень круто. А чем анализ делался? Библиотеки на Python есть для подобного?
              +1

              Все трансформации шли посредством requests (запросы к Хабру) + BeautifulSoup4 (парсим HTML) + pandas (работаем с табличками и подсчет рейтингов). Графы анализировались и визуализировались в Gephi.

                +1
                Все-таки надо освоить Pandas. А то я какой-то ужас с гетерогенными массивами в городу, чтобы таблицы получить)
                  0

                  Еще в копилку numpy, scipy, matplotlib и бонусом маленький модуль tqdm

                    +2
                    Меня еще очень seaborn порадовал. На редкость приятные и гармоничные графики рисует. Полный же восторг:
                    image
                      +1
                      Оооо… progress bar! Я счастлив. Приходилось извращаться) Как в этом проекте, например:
                      https://github.com/meklon/DAB_analyzer
                        0
                        Советую вот этот пост почитать.
                        habrahabr.ru/post/276725
                          0

                          Единственное, мне показалось, что эта штука log_progress только для IPython, нет?

                            0
                            Причем только для Jupiter среды. Узковато.
                            +1
                            Спасибо, красиво, но у меня не блокнот, а более или менее полноценная программа консольная. Универсальность, да. Сейчас очень симпатично выглядит.

                      +1
                      Gephi — полный восторг. Просто кластерный анализ без графов тоже может, насколько я понимаю?
                        0

                        Gephi заточен под графы (точнее даже под визуализацию графов), если нужен ML\DM, то почему бы не глянуть на sklearn?

                          +1
                          О. То, что надо. Спасибо.
                        +1
                        Из pandas в gephi есть готовый экспорт?
                          0

                          Pandas всё же сделан для обработки неструктурированных данных (например, табличных с i.d.d.), а Gephi для визуализации структурированных (конкретнее для графов).


                          Для работы с графами в python есть NetworkX и в нём есть экспорт в Gephi — см. write_gefx.


                          Еще Gephi умееть работать с простыми графами в XML, поэтому иногда проще сгенерить такую XML-ку обычными print — например, если граф достаточно большой и не хочется его материализовать в памяти python-интерпретатора. Для примера, кусочек такой XML-ки ниже:


                          XML-представление графа в Gephi
                          <?xml version='1.0' encoding='utf-8'?>
                          <gexf version="1.1" xmlns="http://www.gexf.net/1.1draft" xmlns:viz="http://www.gexf.net/1.1draft/viz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">
                            <graph defaultedgetype="undirected" mode="static">
                              <nodes>
                                <node id="presentation" label="presentation" />
                                <node id="rust" label="rust" />
                                <node id="css" label="css" />
                               ...
                                </nodes>
                              <edges>
                                <edge id="0" source="presentation" target="soft" weight="0.08333333333333333" />
                                <edge id="1" source="presentation" target="android" weight="0.01639344262295082" />
                                <edge id="2" source="rust" target="virus" weight="0.01694915254237288" />
                              ....
                            </edges>
                            </graph>
                          </gexf>
                            0
                            Понятно, спасибо. А что вы имели ввиду, когда писали, что pandas для неструктурированных, если там все на DataFrames которые суть те же таблицы? Или я не понял что-то?
                              0

                              Неструктурированные данные — это каждая строка — точка, а каждая колонка — это переменная, причем на точках нет структуры т.е. про точки говорят, что они i.i.d. — независимы и одинаково распределены (вот переход тут немного упростил конечно).


                              В случае с графом между точками есть отношение — edge(X,Y), то есть точки уже не независимы, а связаны между собой.


                              DataFrames задают таблицы, в которых подразумевается, что каждая строка — это точка и когда мы строим, ну например, линейную регрессию Xw = y мы в явном виде подразумеваем, что точки из X в R^n независимы и у X в точности n колонок и каждая колонка — это переменная, а каждая строка — это точка в R^n.


                              Конечно, при желании можно таблицами в pandas задавать структурированные данные (как графы, например) и самому ввести все нужные операции, но встроенных методов работы со структурированными данными в духе add_edge там нет.

                          +1
                          А не смотрели в сторону graph_tool? Там есть готовые алгоритмы кластеризации и много разной визуализации.
                            0

                            Неплохо, нужно будет попробовать в последующем анализе. Только с ссылкой какие-то проблемы — видимо без "d" на конце: https://graph-tool.skewed.de

                              0
                              Да, извиняюсь, опечатка.
                          +5

                          If it exists, there is porn Python library of it. No exceptions.

                            +2
                            Не так давно на Python подсел и именно это очень радует)
                              +1

                              Однажды попробовав Python, уже не могу переключиться назад :-)

                                +1
                                Печалит только то, что у меня часто отдельная программа одноразовая. Чисто посчитать и вывести конкретные данные.
                                  +1

                                  На самом деле скриптовые языки для этого и нужны — "склеить вот это вот всё". У меня тоже самое — нужно для какой-то статьи поставить эксперименты: качаем, форматируем, трансформируем, склеиваем, запускаем, меряем и тадаам — результаты и графики.


                                  Хотя мы сейчас довольно интересное демо пилим, где основные вычисления идут на python, а react даёт пользователю возможность поиграть через браузер.

                                    +1
                                    У меня к этому еще добавляются датчики и железяки слепленные в одном экземпляре на жвачке и изоленте. Причём иногда как добавочный модуль к оборудованию за пару миллионов)
                          +1
                          Долгая работа я полагаю, спасибо за это!
                            +1
                            Я так понимаю, учитывалось цитирование только в статьях?
                            Или комментарии тоже учитывались? Было бы интересно посмотреть на такой граф тоже.
                              0

                              Только статьи.

                                +1

                                Коли разок "выстрелило", то попробую ещё раз предложить идею анализа, поддержав и развив мысль LoadRunner: круто было бы сделать аналогичные исследования, но для комментов. Лично мне, в голову приходят следующее интересности:


                                • кто ни кого ссылается в комментариях, то бишь группы по интересам;
                                • зависимость количества комментариев пользователя от их качества (кто пишет "редко но метко", а кто берёт количеством);
                                • как часто в одной ветке встречаются одни и те же лица, то есть, например, гипотеза: " Milfgard и Meklon очень часто материализуются в одном треде";
                                • "магическая" корреляция (или её отсутствие) между размером комментария и рейтингом;
                                • какая-нибудь статистика про большие комментарии и их "качество": периодически встречаются достойнейшие высказывания, которые тянут на статью, но выражены в формате комментария;
                                • статистика о количество пользователей в одной ветке обсуждения: существуют ли длинные обсуждения с большим вовлечением народа или это удел нескольких пользователей, которые решили уйти подальше и поглубже в дебаты/споры/etc; есть ли связь глубины и полезности как в абсолютном отншении (суммы плюсов и минусов за комментарии в ней), так и в относительном (то есть чем длиннее ветка, тем более "полезным" получается каждый комментарий в ней в среднем) и тд;
                                • просто "общая температура по больнице" и топ глубоко обсуждаемых статей, то есть оценить статью не общим количеством комментариев, а количеством обсуждений и их глубины (например, ветка в 10-15 комментариев гораздо содержательнее чем последовательное количество из такого же количества несвязанных сообщений).

                                Ну и, как говорится: "Сила Habr'ы в комментариях" так что их обязательно нужно всесторонне изучить.

                                  0

                                  Ок, была такая магистерская работа в вышке, которая до Хабра не добралась, как я не старался пинать автора — человек собрал комменты и кластеризовал юзеров по типу комментирования — в духе "общительный" или там "молчун" и тд.


                                  Мне все хочется повторить, собрать и выложить такие данные, но это будет нетривиально.

                                    +1

                                    Пните ещё разок… авось получится: достанет пыльный диссер из закромов родины и навояет… статистика должна быть интересной.


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

                                    +3
                                    Мы скорее часто устраиваем беспредел в комментариях, когда синхронно появляемся. Насчет корреляции — почти уверен, что я всегда появляюсь в тех тредах, где отписался Milfgard, но не наоборот. Можно еще проверить зависимость между упоминанием человека и его появлением в треде.
                                      +1
                                      Вот яркий пример «наоборот» )
                                        +1
                                        А я в таких частых случаях вообще Вас обоих путаю — кто из вас кто и приходится пару секунд вспоминать. Я не сторонник теории заговоров, но всё это крайне подозрительно, потому что одновременное появление чаще как раз без упоминания.
                                          +1
                                          Просто мы оба отмороженные. Меклон врач, а я по жизни.
                                          Но я его видел, он не мой виртуал, да-да.
                                            +5

                                            Один известный отмороженный герой тоже видел Тайлера Дардена… но это совсем ничего не значит.

                                          0
                                          Вот опять. Гипотеза работает Ж)
                                            0
                                            А что именно вас удивляет?
                                              0
                                              Удивляет — ничего. Только холодная статистика!
                                  +1
                                  Очень круто! Спасибо за проделанную работу.
                                    0
                                    офтоп: первая иллюстрация невероятно напоминает собой вирус

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

                                    Самое читаемое