Визуализация биобиблиографии одного из научных трудов Парвуса

Изучаем пределы возможности сетей (графов)

Автор

Богданова Анастасия

Дата публикации

4.04.2025

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


Проектирование сети

В качестве источника данных взяты результаты библиографического исследования коллекции трудов русского и немецкого социалиста И.Л.Гельфанда, более известного под псевдонимом Парвус, хранящейся в книжном фонде Центра социально-политической истории ГПИБ России (статья в печати).


В ходе работы, проведенной весной 2024 года, нами были получены данные о более, чем 220 инвентарных номерах книжных изданий научных и публицистических трудов Парвуса, хранящихся в библиотеке ЦСПИ. Все экземпляры были просмотрены de visu, на их основе составлена биобиблиографическая база данных. Целью настоящего исследования является попытка превращения биобиблиографической информации в математический объект, его визуализация и оценка потенциала и возможностей цифрового подхода к подобному типу данных.


Подготовка данных

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


После очень плодотворных консультаций с Борисом Валерьевичем Орехевым за основу был принят следующий подход:
Узлы: Труд/работа/книга Парвуса, и его(её) “владелец” или “актор”. Автор пишет, издатель переводит и публикует, читатель покупает и владеет, библиотека получает и ставит на полку (прячет в спецфонде).
Ребра: Ребрами в нашем случае будет процесс смены “актора” или “владельца” текста/труда/книги/работы.


Для лучшего понимания того, «что у ей вовнутре» устройства сетей, .csv файлы с данными узлов и ребер были сделаны вручную.

library(visNetwork)
set.seed(20250305)
# Создаем узлы с tooltips
nodesPar <- data.frame(
  id = c(1, 
         20, 30, 40, 50, 60, 
         100, 103, 104, 105, 106, 101, 102, 107, 108, 
         1000, 1001, 1002, 1003, 1004, 
         10001, 8001, 8002, 8003, 8004), 
  label = c("КНИГА: PARVUS \nDie Soziale \nBilanz des Krieges", 
            "ПУБЛИКАЦИЯ: \nСтокгольм \nИздание журнала Извне", 
            "ПУБЛИКАЦИЯ: \nBerlin Verlag für \nSozialwissenschaft", 
            "ПУБЛИКАЦИЯ: \nBudapest Népszava \nkönyvkereskedés kiadása", 
            "ПУБЛИКАЦИЯ: \nKøbenhavn Socialdemokratiets \nForlag Fremad",
            "ПУБЛИКАЦИЯ: \nStockholm Frams \nFörlag",
            "Владелец \n006 | 29",
            "Владелец NA", 
            "Владелец \n1448 | 26",
            "Владелец \n800 | 27",
            "Владелец \n722 | 32",
            "Владелец \n1538 | 28",
            "Владелец \n1141 | 28",
            "Владелец \n700 | 28",
            "Владелец \n3135 | 29",
            "Шифр полки \nв библиотеке: ЦР",
            "Шифр полки \nв библиотеке: ЕА38",
            "Шифр полки \nв библиотеке: ET255",
            "Шифр полки \nв библиотеке: VIIC1",
            "Шифр полки \nв библиотеке: ВВ255",
            "Спецфонд. \nОграниченный доступ",
            "Спецпометы: \nВладельческая надпись",
            "Спецпометы: \nЗнак библиотеки",
            "Спецпометы: \nСтраницы не разрезаны",
            "Спецпометы: \nЗнак библиотеки"), 
  shape = "icon",  # Используем иконки
  title = c("Работа написана <br>в 1917 году на <br>немецком языке", 
            "Опубликована <br>на русском языке <br>в 1918 г.", 
            "Опубликована <br>на немецком языке <br>в 1917 г.",
            "Опубликована <br>на венгерском языке <br>в 1918 г.",
            "Опубликована <br>на датском языке <br>в 1917 г.",
            "Опубликована <br>на шведском языке <br>в 1918 г.",
            "Не установлен. <br>Владел до 1929 г.",
            "Не установлен",
            "Не установлен. <br>Владел до 1926 г.",
            "Библиотека Р.Крейчи. <br>Владел до 1927 г.",
            "Не установлен. <br>Владел до 1932 г.",
            "Czóbel (Цобель). <br>Владел до 1928 г.",
            "Не установлен. <br>Владел до 1928 г.",
            "Библиотека Парвуса. <br>Владел до 1928 г.",
            "Не установлен. <br>Владел до 1929 г. <br>Часть страниц не разрезаны",
            "Рубрика: Русское зарубежье",
            "Рубрика: Социализм, марксизм, <br>ленинизм и история <br>рабочего движения. Общий отдел. <br>Социализм и война.",
            "Рубрика: Социализм, марксизм, <br>ленинизм и история <br>рабочего движения. <br>История рабочего движения в других странах. <br>Европа. Венгрия. <br>Политическое рабочее движение. <br>Социалистическое движение.",
            "Рубрика: ИМЭ. Социализм и анархизм. <br>Научный социализм. <br>Маркс,  Энгельс их ближайшие ученики.",
            "Рубрика: Всеобщая история. <br>Самостоятельные страны <br>в период капитализма. <br>Общие сочинения.",
            "Номер СФ-22429",
            "Надпись: <br>Czóbel (Цобель)",
            "На обложке марка <br>с голубой каемкой",
            "Книгу не читали",
            "На обложке марка <br>Библиотеки Парвуса"),  #  tooltips для каждого узла
  icon = list(
    face = "FontAwesome",
    code = c("f2bd", 
             "f015", "f015", "f015", "f015", "f015",
             "f007", "f007", "f007", "f007", "f007", "f007", "f007", "f007", "f007", 
             "f02e", "f02e", "f02e", "f02e", "f02e", 
             "f05e", "f14b", "f14b", "f14b", "f14b"),  # Unicode иконок FA
    size = 50,
    color = c("darkred", 
              "blue", "blue", "blue", "blue", "blue", 
              "darkgrey",  "darkgrey",  "darkgrey",  "darkgrey",  "darkgrey",  "darkgrey",  "darkgrey",  "darkgrey",  "darkgrey", 
              "orange", "orange", "orange", "orange", "orange", 
              "red", "violet", "violet", "violet", "violet")  # Цвета иконок
  )
)
nodesPar$font <- lapply(nodesPar$label, function(x) list(vadjust = 10))
# Связи между узлами
edgesPar <- data.frame(from = c(1, 1, 1, 1, 1, 
                             20, 30, 30, 30, 30, 
                             40, 40,
                             50, 60,
                             100, 101, 102, 103, 104, 105, 106, 107, 108,
                             1000,
                             101, 106, 108, 107), 
                    to = c(20, 30, 40, 50, 60, 
                           100, 103, 104, 105, 106, 
                           101, 102,
                           107, 108,
                           1000, 1001, 1002, 1003, 1004, 1004, 1004, 1004, 1004,
                           10001,
                           8001, 8002, 8003, 8004))


Строим граф

На основе файлов с узлами (nodesPar.csv) и ребрами (edgesPar.csv) строим интерактивный граф с иконками, стрелками и tooltips (выпадающими подсказками).

Используем иконки с сайта FontAwesome.com. Для наглядности нами было выбрано 6 иконок для разных типов узлов:


Автор:


Издательство:


Читатель:


Библиотека:


Спецпометы:


Спецфонд:


Немного ЦМ (цифровой магии) из библиотеки visNetwork, которая немножко шуршит «под капотом» и выдает небольшой интерактивный граф. Интерактивный - это значит, что он будет взаимодействовать с вашей мышкой, попробуйте потянуть его за “усы”!


visNetwork(nodesPar, edgesPar, width = "100%", height = "600px") |> 
  visOptions(highlightNearest = list(enabled = TRUE, degree = 1, hover = TRUE)) |> 
  visEdges(smooth = TRUE, arrows = "to", arrowStrikethrough = FALSE) |> 
  visNodes(shapeProperties = list(borderDashes = TRUE, useBorderWithImage = TRUE)) |>
  visNodes(size = 40, margin = list(top = 5, bottom = 5, left = 5, right = 5)) |> 
  visLayout(randomSeed = 321) |>
  addFontAwesome() 


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