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

Вики-игра

Мотивация для этого проекта возникла, когда я работал над отчетом, и мой друг упомянул игру, в которую можно играть в Википедии. Он объяснил игру так: вы начинаете со случайной ссылки на статью в Википедии и, нажимая только на ссылки в теле статьи (и последующих статей), вы можете перейти на страницу Адольф Гитлер за 3 клика. На первый взгляд, это правда! (Если вы обдуманно и стратегически подходите к ссылкам, которые вы выбираете).

После того, как последние несколько часов я был завален написанием, я решил сделать перерыв и немного изучить эту тему. Я, что интересно, не нашел данных по этой так называемой игре, поэтому решил изучить ее сам (а почему бы и нет!). Я называю это:

Сетевой картограф Википедии

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

Чтобы решить эту… «Проблему Гитлера», алгоритм начинается со страницы «Случайная статья» в Википедии. Он перебирает все ссылки на этой странице, проверяя, соответствуют ли они заголовку целевой страницы, если нет, он начинает с первой ссылки и повторяет процесс поиска заголовков ссылок, а затем нажимает на первую ссылку. Эта программа будет переходить только на максимальную глубину, указанную перед сбоем, в результате чего алгоритм начнет поиск страницы со следующей ссылки предыдущего уровня (в стиле поиска в ширину).

Код

Вот упрощенный фрагмент рекурсивного цикла, выполняющего фактический поиск в реализации C++:

bool Finder::find_hitler_recursive(int n, Page *page, string path[]){    
    // There are sort of 2 base cases here
    if(n > MAX) return false;
    if(page->name == goal_page){
        path[n+1] = goal_page;
        return true;
    }
    // Breadth search
    for(size_t i = 0; i < page->links.size(); i++){
        if(page->links[i].get_title() == goal_page){
            path[n+1] = page->links[i].get_title();
            return true;
        }
    }

    Page* nextPage;
    if(n != MAX){
        for(size_t i = 0; i < page->links.size(); i++){
            nextPage = page->get_sub_page(page->links[i]);
            // Depth search
            if(find_hitler_recursive(n+1, nextPage, path)){
                path[n+1] = page->links[i].get_title();
                return true;
             }
        }
    }
    return false;
}

Полный набор кода можно найти в репозитории github по адресу https://github.com/lharri73/wikipediaProject.

Результаты

То, что я нашел из этого, было, честно говоря, довольно удивительным (но может ввести в заблуждение и будет рассмотрено позже). Необработанные данные из моих выводов можно найти в этом CSV-файле (он большой, и вам придется скачать его, чтобы просмотреть, так как Github не сможет показать вам предварительный просмотр). Вот некоторые из основных моментов:

  • 99,580% всех страниц Википедии можно найти Гитлера как минимум за 3 клика.
  • 96,875% требуется 3 клика
  • 2,9490% требуется 2 клика
  • 0,1756% требуется 1 клик
  • С Гитлером была связана 2 961 уникальная связь.

С необработанными данными вы можете начать с первого столбца, перейти на эту страницу Википедии и найти ссылку во втором столбце. Обратите внимание, что файл CSV содержит название страницы в том виде, в каком оно отображается в заголовке, а не текст ссылки (ссылка Английский может указывать на страницу Английский язык, поэтому Английский язык появится в файле csv, а не английский). Продолжайте, пока не дойдете до целевой страницы, в данном случае Адольф Гитлер.

Я решил пойти дальше. Смотреть на необработанные данные в виде электронной таблицы может быть очень весело, поэтому следующим очевидным шагом было создание графика. Простого бинарного дерева было недостаточно, поэтому я остановился на сети, где каждый узел может иметь n соединений, а размер узла прямо пропорционален n. Я создал 2 графика, один из которых представляет собой простое изображение, показывающее общую архитектуру графика в 2D, а другой — интерактивный 3D-график. Интерактивный график можно найти по адресу https://lharri73.github.io/wikipediaProject/.

Ограничения

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

  • Если цель может быть достигнута несколькими путями, будет возвращен только первый путь (который может не быть кратчайшим путем.
  • Требуется ЗНАЧИТЕЛЬНО больше времени, чтобы определить, что доступ к целевой странице невозможен.
  • Это приводит к тому, что данные вводят в заблуждение. Из-за этого этот алгоритм по своей природе находит больше истинных путей, чем отрицательных результатов.

Заключение

Во-первых: нет, я не одержим Гитлером, и это не отражает моих политических взглядов, это просто вывод довольно интересного набора данных.

На самом деле не так уж и удивительно, что Адольф Гитлер так распространен среди доменов Википедии. Причина, по которой так легко попасть на эту страницу, кроется в том влиянии, которое он оказывал на людей на протяжении всей истории. На странице Вики-игры на самом деле есть вариант, в котором вместо перехода на страницу Адольфа Гитлера за 3 клика, страница Иисуса Христа открывается за 5 кликов (что является интересным наблюдением, учитывая, что Гитлера можно легко достичь за 3 клика). ). В целом, я считаю, что можно достичь любого исторически значимого человека, события или места таким же образом, как Адольф Гитлер, и, возможно, даже с той же частотой, это просто потребует дальнейшего изучения. На данный момент, однако, я считал эту простую игру тщательно изученной.