Число ребер для любого узла будет количеством ячеек в верхнем треугольнике, исключая диагональ (поскольку совместное вхождение объекта с другим его экземпляром в документе не создает «ребро» на графике).
Давайте подойдем к этому на более простом примере.Я определю очень простую структуру из трех документов с шестью типами слов.
library("quanteda", warn.conflicts = FALSE)
## Package version: 1.4.0
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
txt <- c("a b b c", "b d d e", "a e f f")
fcmat <- fcm(txt)
fcmat
## Feature co-occurrence matrix of: 6 by 6 features.
## 6 x 6 sparse Matrix of class "fcm"
## features
## features a b c d e f
## a 0 2 1 0 1 2
## b 0 1 2 2 1 0
## c 0 0 0 0 0 0
## d 0 0 0 1 2 0
## e 0 0 0 0 0 2
## f 0 0 0 0 0 1
Здесь «a» имеет четыре ребра, с «b», «c», «e» и «е».«b» имеет три ребра, с «c», «d» и «e» (исключая совместное вхождение «b» с самим собой в первом документе).
Чтобы получить число, мыможно просто суммировать ненулевые ячейки, что может произойти с использованием rowSums()
или, если вы транспонируете матрицу, эквивалентную функцию для вычисления частоты «документа» (хотя здесь функции являются «документами»).
Исключая собственные ребра, мы можем проверить эти ребра, взглянув на график сети для этого fcm.
rowSums(fcmat > 0)
## a b c d e f
## 4 4 0 2 1 1
docfreq(t(fcmat))
## a b c d e f
## 4 4 0 2 1 1
textplot_network(fcmat)
Чтобы исключить подсчет само ребер, мынужно обнулить диагональ.В настоящее время это приведет к удалению определения класса в fcm, что означает, что мы не сможем использовать его в textplot_network()
, но мы все еще можем использовать наш подход rowSums()
для получения числа ребер по узлам, предоставляя ответ на ваш запрос.вопрос.
diag(fcmat) <- 0
rowSums(fcmat > 0)
## a b c d e f
## 4 3 0 1 1 0