quanteda: подсчитать количество ребер для каждого узла в сетевом графике - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть сетевой график, рассчитанный с помощью функции textplot_network() пакета quanteda.Для минимального, пожалуйста, обратитесь к официальному quanteda веб-сайту здесь .То, о чем я сообщаю ниже, является лишь копией вставки того, что вы можете найти по ссылке.

library(quanteda)
load("data/data_corpus_tweets.rda")
tweet_dfm <- dfm(data_corpus_tweets, remove_punct = TRUE)
tag_dfm <- dfm_select(tweet_dfm, pattern = ("#*"))
toptag <- names(topfeatures(tag_dfm, 50))
topgat_fcm <- fcm_select(tag_fcm, pattern = toptag)
textplot_network(topgat_fcm, min_freq = 0.1, edge_alpha = 0.8, edge_size = 5)

В результате сетевой график выглядит следующим образом:

enter image description here

Как рассчитать количество ребер для каждого из узлов, отображаемых на графике?Если я использую функцию topfeatures(), примененную к объекту fcm topgat_fcm, я получаю верхние концентраторы сети, которые являются счетчиками обнаруженных совпадений.

Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 24 февраля 2019

Число ребер для любого узла будет количеством ячеек в верхнем треугольнике, исключая диагональ (поскольку совместное вхождение объекта с другим его экземпляром в документе не создает «ребро» на графике).

Давайте подойдем к этому на более простом примере.Я определю очень простую структуру из трех документов с шестью типами слов.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...