Пакеты

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(udpipe)
## Warning: пакет 'udpipe' был собран под R версии 4.5.2
library(igraph)
## Warning: пакет 'igraph' был собран под R версии 4.5.2
## 
## Присоединяю пакет: 'igraph'
## 
## Следующие объекты скрыты от 'package:lubridate':
## 
##     %--%, union
## 
## Следующие объекты скрыты от 'package:dplyr':
## 
##     as_data_frame, groups, union
## 
## Следующие объекты скрыты от 'package:purrr':
## 
##     compose, simplify
## 
## Следующий объект скрыт от 'package:tidyr':
## 
##     crossing
## 
## Следующий объект скрыт от 'package:tibble':
## 
##     as_data_frame
## 
## Следующие объекты скрыты от 'package:stats':
## 
##     decompose, spectrum
## 
## Следующий объект скрыт от 'package:base':
## 
##     union
library(ggraph)
## Warning: пакет 'ggraph' был собран под R версии 4.5.2

Загружаем данные

caesar <- udpipe_read_conllu(
  "https://github.com/locusclassicus/text_analysis_2024/raw/main/files/bg_latinpipe.conllu"
)

Выбираем сущесмтвительные

caesar_subset <- caesar |>
  filter(upos == "NOUN")

Строим сеть

cooc <- cooccurrence(
  caesar_subset,
  term = "lemma",
  group = c("doc_id","sentence_id")
) |>
  as_tibble() |>
  filter(cooc > 35)

caesar_g <- graph_from_data_frame(cooc)

Граф

d <- as.numeric(degree(caesar_g))
V(caesar_g)$degree <- d
V(caesar_g)$hub <- ifelse(V(caesar_g)$degree >= 6, "hub", "other")

cols <- c(hub="#990099FF", other="#009900FF")

set.seed(21092024)

ggraph(caesar_g, layout="fr") +
  geom_edge_link(color="grey50", edge_width=1.2) +
  geom_node_label(aes(label=name, fill=hub), color="white") +
  scale_fill_manual(values=cols) +
  theme_graph()
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): семейство
## шрифтов не найдено в базе данных шрифтов Windows
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): семейство
## шрифтов не найдено в базе данных шрифтов Windows
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): семейство
## шрифтов не найдено в базе данных шрифтов Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## семейство шрифтов не найдено в базе данных шрифтов Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## семейство шрифтов не найдено в базе данных шрифтов Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## семейство шрифтов не найдено в базе данных шрифтов Windows
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## семейство шрифтов не найдено в базе данных шрифтов Windows