Рубрики
Без рубрики

Визуализировать график влияния языка программирования

Автор оригинала: Peter Gleeson.

Учебное пособие по визуализации сети с Geophi и Sigma.js

Вот предварительный просмотр того, что мы будем делать сегодня: Языки программирования влияют на график графика Отказ Проверьте ссылку, чтобы исследовать отношения «Разработка влияния» между более чем 250 языками программирования прошлым и настоящим!

Твоя очередь!

В сегодняшнем мире сетевые сети являются повсеместным аспектом современной жизни.

На сегодняшний день начать мой день – я использовал Лондон Транспортная сеть путешествовать в город. Затем я вошел в филиал моего любимого кафе и использовал мой хром для подключения к их Сеть Wi-Fi Отказ Далее я вошел в разные Социальные сети Сайты я часто лежал.

Не секрет, что некоторые из самых влиятельных компаний последних нескольких десятилетий должны их успех к власти сети.

Facebook, Twitter, Instagram, LinkedIn и другие платформы социальных сетей полагаются на мелкие мировые свойства социальных сетей. Это позволяет им эффективно подключать своих пользователей друг с другом (и рекламодателями).

Google обязан большим количеством своего нынешнего успеха к своему раннему доминирующему рынку поисковой системы – включена в их способность возвращать соответствующие результаты с помощью их Страница Ранг сетевой алгоритм Отказ

Эффективная распределительная сеть Amazon позволяет им предлагать доставку в тот же день в некоторых крупных городах.

Сети также являются сверхъестественными в таких областях, как искусственный интеллект и машинное обучение. Нейронные сети очень активное поле исследований. Многие алгоритмы обнаружения функций, необходимые в компьютерном видении, полагаются в значительной степени на Использование сетей для моделирования разных частей изображений Отказ

Широкий ассортимент научных явлений также можно понять с точки зрения сетевых моделей. Это включает в себя Квантовая механика , Биохимические пути и экологический и Социально-экономические системы Отказ

Учитывая их неоспоримое значение, то, как мы можем лучше понимать сети и их свойства?

Математическое исследование сетей известно как « Теория графика », и является одной из более доступных ветвей математики. Эта статья направлена на предоставление введения, при условии, что мало предшествующих знаний или опыта.

Мы будем использовать Python 3.x и некоторые потрясающие программное обеспечение с открытым исходным кодом под названием Гефир Чтобы собрать сетевую визуализацию того, как диапазон языков программирования прошлым и настоящим и настоящим связан влиянием.

Но сначала…

Что именно сеть?

Приведенные выше примеры дают нам некоторые подсказки. Транспортные сети состоят из Направления подключен маршруты Отказ Социальные сети состоят из Люди , связан через их Отношения для другого. Алгоритмы поисковой системы Google оценивают «ранг» разных веб-страницы Глядя на какие страницы ссылка к другим.

В целом, сеть – это любая система, которая может быть описана с точки зрения узлы и края или в разговорных условиях, «точки и линии».

Некоторые системы легко рассуждаются таким образом. Социальные сети, пожалуй, самый очевидный пример. Компьютерные файловые системы – это еще одна – папки и файлы связаны с их «родителями» и «детскими» отношениями.

Но реальная сила сетей происходит от того, что многие многие системы могут быть абстрагированы и смоделированы в сетевых условиях, даже если сначала не очевидно, как.

Представляющие сети

Нам нужно немного зайти за пределы рисунков пен и бумаги для анализа и описания сетей математически. Как мы можем повернуть изображения точек и линий в цифры, которые мы можем хруститься?

Одно решение – составить Матрица соседних представлять нашу сеть.

Матрицы – одна из тех концепций, которые могут звучать немного запугивать, если вы не знакомы с ними, но не бойся. Подумайте о них как о сетках чисел, которые могут быть использованы для выполнения многих расчетов все сразу. Вот пример ниже:

      Python Java Scala C#
Python     0    1     0  0
Java       0    0     0  1
Scala      0    1     0  0
C#         0    1     0  0

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

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

Например, даже с относительно скромным количеством узлов (скажем 1000), в матрице будет гораздо большее количество элементов (E.G., 000 000 000 000).

Многие реальные системы доходятся Редкие сети Отказ В этих сетях большинство узлов соединяются только к небольшой доли от всех остальных.

Если мы представляли собой редкую сеть 1000 узлов в памяти компьютера в качестве матрицы смежности, у нас будет 1 000 000 байтов данных, хранящихся в RAM. Большинство будут нужными. Должен быть более эффективный способ сделать это.

Альтернативный подход – это работать с Списки по краю вместо. Это именно то, что они говорят, что они. Это просто список каких узлов пары связаны друг с другом.

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

Java, Python
Java, Scala
Java, C#
C#, Java

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

Другим способом представления сетей Списки соседних Отказ Это списки каждый узел, за которым следует узлы, которые он ссылается. Например:

Java: Python, Scala, C#
C#: Java

Сбор данных, создание соединений

Любая сетевая модель и визуализация будут такими же хорошими, как и данные, используемые для его построения. Это означает, что, а также обеспечение того, что данные являются как точными, так и полными, нам также необходимо оправдать средства выводящихся краев между узлами.

Во многих отношениях это критический шаг. Любой последующий анализ и выводы, сделанные по сети, зависят от возможности оправдывания «критерия связи».

Например, в Анализ социальных сетей , вы можете связать людей, основанные на том, следуют ли они друг другу в социальных сетях. В молекулярной биологии вы можете связать гены на основе их соращивание Отказ

Часто метод, используемый для соединения узлов, позволит Вес Быть назначенным к краям, давая меру «силы».

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

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

Однако для этого учебника мы будем использовать более простые средства подключения языков программирования. Мы полагаемся на точность Википедии.

Для наших целей это должно быть в порядке. Успех Википедии является свидетельством, что он должен делать что-то правильно. Способ с открытым источником, совместным методом, по которому письменные статьи должны обеспечить некоторую степень объективности.

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

Еще один бонус – обширный, Хорошо задокументированная википедия API , что делает поиск информации еще проще. Давайте начнем.

Шаг 1 – Установка Geophi

GePhi доступен на Linux, Mac и Windows. Вы можете скачать его здесь Отказ

Для этого проекта я использовал Lubuntu. Если вы на Ubuntu/Debian, вы можете выполнить следующие шаги, чтобы получить GEPHI UP и запустить. В противном случае процесс установки, скорее всего, будет намного так же, как все, с кем вы знакомы.

Скачайте последнюю версию (на момент написания это было v.0.9.1) Gephei для вашей системы. Когда он готов, вам нужно извлечь файлы.

cd Downloads
tar -xvzf gephi-0.9.1-linux.tar.gz
cd gephi-0.9.1/bin./gephi

Возможно, вам понадобится проверить вашу версию Java Jre. Gephei требует последней версии. На моей относительно свежей установке Lubuntu я просто установил по умолчанию-JRE, и все работало оттуда.

apt install default-jre
./gephi

Есть еще один шаг, прежде чем вы будете готовы дойти. Для того, чтобы экспортировать график в Интернет, вы можете использовать Sigma.js Плагин для Gephi.

Из строки меню GePhi выберите опцию «Инструменты» и выберите «Плагины».

Нажмите на вкладку «Доступные плагины» и выберите «SigmaExporter» (я также установил JSON Exporter, потому что это еще один полезный плагин, чтобы иметь около).

Нажмите кнопку «Установить», и вы будете проходить через процесс. Вам нужно будет перезапустить GePhi, как только вы закончите.

Шаг 2 – Написание сценария Python

Этот учебник будет использовать Python 3.x, плюс несколько модулей, чтобы облегчить жизнь. Использование установщика модуля PIP, выполните следующую команду:

pip3 install wikipedia

Теперь в новом каталоге создайте файл, называемый что-то вроде Script.py И открыть его в своем любимом редакторе кода/IDE. Ниже приведен план основной логики:

  1. Во-первых, вам понадобится Список языки программирования включать.
  2. Далее пройдите этот список и получите HTML соответствующей статьи Wikipedia.
  3. Из этого извлечь список языков программирования, которые на каждом языке влияют. Это станет неровным критерием связи.
  4. Пока вы на этом, это было бы приятно схватить некоторые метаданные о каждом языке.
  5. Наконец, вы захотите написать все данные, которые вы собрали на файл .csv

Полный скрипт можно найти в этот гид Отказ

Импортировать некоторые модули

В Script.py , начните, импортируя несколько модулей, которые облегчат вещи:

import csv
import wikipedia
import urllib.request
from bs4 import BeautifulSoup as BS
import re

ОК – начните, сделав список узлов для включения. Это где Википедия Модуль приходит в удобное. Это делает доступ к Википедия API Супер легко.

Добавьте следующий код:

pageTitle = "List of programming languages"
nodes = list(wikipedia.page(pageTitle).links)
print(nodes)

Если вы сохраните и запустите этот скрипт, вы увидите, что он распечатает все ссылки из «Список языков программирования» Статья Википедии. Хороший!

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

Например, вы можете увидеть « Список языков разметки », « Сравнение языков программирования » и других там.

Хотя GePhi позволяет удалить узлы, которые вы предпочитаете не включать, не повредило бы «очистить» данные, прежде чем продолжить. Во всяком случае, это сэкономит время позже.

removeList = [
    "List of",
    "Lists of",
    "Timeline",
    "Comparison of",
    "History of",
    "Esoteric programming language"
    ]

nodes = [i for i in nodes if not any(r in i for r in removeList)]

Эти строки определяют список подстрок, которые будут удалены из данных. Затем скрипт проходит через данные, удаляя любые элементы, которые содержат любую из ненужных подстроек.

В Python это требует только одной строки кода!

Некоторые функции помощника

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

Хватающий HTML

Первая функция использует Beautifulsoup Модуль, чтобы получить HTML для каждой страницы википедии каждого языка.

base = "https://en.wikipedia.org/wiki/"

def getSoup(n):
    try:
        with urllib.request.urlopen(base+n) as response:
            soup = BS(response.read(),'html.parser')
            table = soup.find_all("table",class_="infobox vevent")[0]                return table
     except:
         pass

Эта функция использует модуль URLLIB.REQUEST, чтобы получить HTML для страницы на "https://en.wikipedia.org/wiki/" + "Язык программирования" Отказ

Затем это передается на BeautifulSoup, которая читает и анализирует HTML в объект, который мы можем использовать для поиска информации.

Далее используйте find_all () Способ извлечения HTML-элемента, который вас интересует.

Здесь это будет сводная таблица в верхней части элемента каждого языка программирования. Как они могут быть идентифицированы?

Самый простой способ – посетить один из страниц языка программирования. Здесь вы можете просто использовать инструменты разработчика браузера для осмотра элементов интереса.

Сводная таблица имеет тег HTML le> и css cl Asses «In Fobox » и «V событие», поэтому вы можете использовать их для идентификации таблицы в HTML.

Укажите это с аргументами:

  • "Стол" а также
  • класс _ = "Infobox Vevent"

find_all () Возвращает список всех элементов, соответствующих критериям. Для того, чтобы на самом деле указать интересующий вас элемент, добавьте индекс [0] Отказ Если функция успешна, она возвращает Таблица объект. В противном случае возвращается Нет Отказ

С любой автоматизированной процедурой сбора данных, всегда важно тщательно обрабатывать исключения. Если нет, то в лучшим сценарию сценария скрипт вылетает, и вам нужно будет начать.

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

Получить метаданные

Следующая функция использует Таблица объект для поиска некоторых метаданных. Здесь он ищет таблицу за год, когда язык впервые появился.

def getYear(t):
    try:
        t = t.get_text()
        year = t[t.find("appear"):t.find("appear")+30]
        year = re.match(r'.*([1-3][0-9]{3})',year).group(1)
        return int(year)
    except:
        return "Could not determine"

Эта короткая функция занимает Таблица объект как его аргумент, и использует Beautifulsoup’s get_text () Функция для создания строки.

Следующим шагом является создание подстроки под названием Год Отказ Это занимает 30 символов после первого появления слова "Появляются" Отказ Эта строка должна содержать год, когда язык впервые появился.

Для того, чтобы извлечь всего год, используйте регулярное выражение (любезно предоставлено модулем Re ), чтобы соответствовать любым символам, которые начинаются с цифры от 1 до 3, и сопровождаются тремя цифрами.

re.match(r'.*([1-3][0-9]{3})',year)

Если это успешно, функция возвращает Год как целое число. В противном случае он возвращает грустный взгляд “не мог определить”. Возможно, вы пожелаете соскребайте дальнейшие метаданные – такие как парадигма, дизайнер или набрав дисциплину.

Сбор ссылок

Еще одна функция для вас – на этот раз, вы будете кормить в Таблица Объект для данного языка и, надеюсь, получит список других языков программирования.

def getLinks(t):
    try:
        table_rows = t.find_all("tr")
        for i in range(0,len(table_rows)-1):
            try:
                if table_rows[i].get_text() == "\nInfluenced\n":
                    out = []
                    for j in table_rows[i+1].find_all("a"):
                        try:
                            out.append(j['title'])
                        except:
                            continue
                    return out
            except:
                continue
        return
    except:
        return

WOAH, посмотри на все что гнездо … Что на самом деле здесь происходит?

Эта функция использует тот факт, что Таблица Объекты имеют постоянную структуру. Информация в таблице хранится в строках (соответствующая тег HTML – это < TR>). Один из этих строк будет содержать текст "\ ninflued \ n" Отказ Первая часть функции находит, какие строки это.

Как только эта строка была найдена, вы можете быть уверены в следующем Строка содержит ссылки на каждый из языков программирования, влияющими на текущий. Найти эти ссылки, используя find_all ("a") – где аргумент «А» Соответствует тегу HTML Отказ

Для каждой ссылки J , добавьте его [«Название»] Атрибут списку под названием OUT Отказ Причина заинтересовать [«Название»] атрибут это потому, что это будет соответствовать точно Имя языка, как хранится в узлы Отказ

Например, Java хранится в узлы как "Java (язык программирования)" Таким образом, вам нужно использовать это точное имя на протяжении всего набора данных.

Если успешно, GetLinks () Возвращает список языков программирования. Остальная часть функции имеет дело с обработкой исключения, если что-то должно быть не так на любой стадии.

Собирать данные

Наконец, вы почти готовы посидеть и позволить сценарию сделать свое дело. Он будет собирать данные и хранить его в два объекта списка.

edgeList = [["Source,Target"]]
meta = [["Id","Year"]]

Теперь напишите цикл, которая применит функции, определенные ранее каждому элементу узлы и храните выходы в EdgeList и Мета Отказ

for n in nodes:
    try:
        temp = getSoup(n)
    except:
        continue
    try:
        influenced = getLinks(temp)
        for link in influenced:
            if link in nodes:
                edgeList.append([n+","+link])
                print([n+","+link])
    except:
        continue
    year = getYear(temp)
    meta.append([n,year])

Эта функция принимает каждый язык в узлы и попытки получить сводную таблицу с своей страницы Wikipedia.

Затем он извлекает все языки в списках таблицы, которые находятся под влиянием языка.

Для каждого языка, который также появляется в узлы Список, добавьте элемент на EdgeList в виде [«Источник, цель»] Отказ Таким образом, вы создадите список ребра для корма в GePhi.

Для целей отладки напечатайте каждый элемент, добавленный в EdgeList – Просто чтобы убедиться, что все работает, как следует. Если вы были дополнительно тщательно, вы можете добавить операторы печати к кроме пункты тоже.

Далее получите название языка и год и добавьте их к Мета список.

Писать в CSV.

После того, как цикл работает, последний шаг – написать содержимое EdgeList и Мета к запятыми файлы отделенной стоимости (CSV). Это легко сделать с CSV Модуль импортирован ранее.

with open("edge_list.csv","w") as f: 
    wr = csv.writer(f)
    for e in edgeList:
        wr.writerow(e)

with open("metadata.csv","w") as f2:
    wr = csv.writer(f2)
    for m in meta:
        wr.writerow(m)

Сделанный! Сохраните скрипт, а из терминала запуска:

$ Python3 Script.py.

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

Шаг 3 – Графическое здание с Geophi

Надеюсь, у вас установлен Gephi и работает раньше. Теперь вы можете создать новый проект и использовать данные, которые вы собрали, чтобы построить направленный график. Это покажет, как разные языки программирования повлияли друг на друга!

Начните с создания нового проекта в Gephi и перейдите на представление «Лаборатории данных». Это обеспечивает электронный интерфейс для обработки данных в GePhi. Первое, что нужно сделать, это импортировать список краев.

  • Нажмите «Импортировать электронную таблицу».
  • Выберите Edge_List.csv Файл, созданный сценарием Python. Убедитесь, что Gephei знает, чтобы использовать запятые в качестве сепаратора.
  • Выберите «Список по край» из типа списка.
  • Нажмите «Далее» и убедитесь, что вы импортируете как источник, так и целевые столбцы в виде строк.

Это должно обновить лабораторию данных со списком узлов. Теперь импортируйте metadata.csv файл. На этот раз убедитесь, что выберите «Список узлов» из типа списка.

Переключитесь на вкладку «Предварительный просмотр» и посмотрите, как выглядит сеть.

Ах … Это просто немного … монохромный. И грязный Как тарелка спагетти. Давайте исправим это.

Сделать это красивым

Есть все виды способов, которыми вы можете работать над презентацией, и вот где приходит немного творческой свободы. С сетевыми визуализациями существует, по существу, три вещи, которые необходимо учитывать:

  1. Позиционирование Существует несколько алгоритмов, которые могут генерировать шаблоны макета для сети. Популярный выбор – это Фрухтерман-Рейнгольд алгоритм , который доступен в Gephi.
  2. Размеры Размер узлов в графе можно использовать для представления некоторой интересной собственности. Часто это Мера центральности Отказ Есть Многие способы измерения центральности , но все они отражают «важность» данного узла, с точки зрения того, насколько хорошо связано с остальной частью сети.
  3. Раскраска Также возможно использовать цвет, чтобы показать некоторое свойство узла. Часто цвет используется для обозначения Сообщественная структура Отказ Это широко определено как «группа узлов, которые более связаны друг с другом, чем с остальной частью графика». В социальной сети это может выявить дружбу, семью или профессиональные группы. Есть несколько алгоритмы, которые могут обнаружить структуру сообщества Отказ Gephi поставляется с Лувье Метод встроенный.

Чтобы сделать эти изменения, вам нужно будет рассчитать некоторую статистику. Переключитесь на окно «Обзор». Здесь вы увидите панель справа. Он должен содержать вкладку «Статистика». Откройте это, и вы увидите ряд вариантов.

Gephi поставляется со многими встроенными статистическими возможностями. Для каждого из них нажав «Run», создаст отчет, который будет раскрывать идеи о сети.

Некоторые полезные, чтобы знать, включают в себя:

  • Средняя степень Средний язык связан с четырьмя другими. Отчет также показывает Распределение степени график Это показывает, что большинство языков имеют очень мало подключений, в то время как небольшая пропорция имеет много. Это говорит о том, что это без масштаба сеть Отказ Много исследований было сделано на Бесплатные сети и процессы, которые их генерируют.
  • Диаметр Эта сеть имеет диаметр 12 – это означает, что это «широкое» количество соединений между любыми двумя языками. Средняя длина пути чуть до четырех. Это означает, что в среднем любые два языка разделены четырьмя краями. Эти цифры дают меру «размера» сети.
  • Модульность Это оценка, которая показывает, как «разделенная» сеть. Здесь оценка модульности составляет около 0,53. Это относительно высокое, что предлагает в этой сети различные модули. Опять же, это указывает на что-то интересное о базовой системе. Языки, как правило, попадают в отличие «Группы влияния».

Во всяком случае, чтобы изменить внешний вид сети, отправляйтесь на левую панель.

На вкладке «Макет» вы можете выбрать, какой алгоритм макета для использования. Нажмите «Беги» и посмотрите, как график сдвигается в режиме реального времени! Посмотрите, какой алгоритм макета, который вы думаете, лучше всего работает.

Над вкладкой макета – это вкладка «Внешний вид». Здесь вы можете играть с разными настройками для узлов и краев, размеров и меток. Они могут быть настроены на основе атрибутов (включая статистику, которую вы получаете GEPHI для расчета).

Как предложить, вы могли бы:

  • Окрашивайте узлы их атрибутом модульности. Это цвета их в соответствии с их членством сообщества.
  • Размер узлов по их степени. Лучшие подключенные узлы появятся больше, чем менее подключенные.

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

Как только вы довольны появлением вашего графа, пришло время перейти к последнему шагу – экспортирую в Интернет!

Шаг 4 – Sigma.js

Уже вы построили сетевую визуализацию, которую можно изучить в Gephi. Вы могли бы выбрать скриншот или сохранить график в формате SVG, PDF или PNG.

Однако, если вы установили плагин Sigma.js ранее, то почему бы не экспортировать график в HTML? Это создаст интерактивную визуализацию, которую вы можете разместить в Интернете или загружать в Github и поделиться с другими.

Для этого выберите «Export> Sigma.js шаблон …» из строки меню GePhi.

Заполните детали по мере необходимости. Обязательно выберите, какой каталог вы экспортируете проект. Вы можете изменить заголовок, легенду, описание, поведение на курсе и много других деталей. Когда вы будете готовы, нажмите «ОК».

Теперь, если вы перейдите к каталогу, вы экспортировали проект, вы увидите папку, содержащую все файлы, сгенерированные Sigma.js.

Откройте index.html в вашем любимом браузере. Та-да! Есть твоя сеть! Если вы знаете небольшой CSS и JavaScript, вы можете погрузиться в различные сгенерированные файлы, чтобы настроить вывод по желанию.

И это завершает это руководство!

Резюме

  • Многие системы могут быть смоделированы и визуализированы как сети. Теория графов – это ветвь математики, которая предоставляет инструменты для того, чтобы помочь понять сетевые структуры и свойства.
  • Вы использовали Python, чтобы соскрести данные из Wikipedia для создания языков программирования на графике влияния языков. Критерием связи был, был ли данный язык был указан как влияние на чужой дизайн.
  • GEPHI и SIGMA.JS являются инструментами с открытым исходным кодом, которые позволяют проанализировать и визуализировать сети. Они позволяют вам экспортировать сеть в изображении, PDF или веб-форматах.

Спасибо за чтение – я с нетерпением жду любых комментариев или вопросов, которые вы могли бы иметь! Для фантастического ресурса, чтобы узнать больше о теории графика, см. Albert-László Barabási Интерактивная онлайн книга Отказ

Полный код для этого учебника можно найти здесь Отказ