我有一个通过textplot_network()
软件包的quanteda
函数计算出的网络图。最低限度请访问官方quanteda
网站here。
我在下面报告的只是您在链接中可以找到的内容的复制粘贴。
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)
结果网络图如下:
如何计算图中绘制的每个节点的边数?如果我使用应用于topfeatures()
对象fcm
上的函数topgat_fcm
,则会获得网络的顶级集线器,它们是检测到的同现的计数。
有什么想法吗?
谢谢
答案 0 :(得分:2)
任何节点的边数将是上三角形中的像元数(不包括对角线)(因为要素与文档中其自身另一个实例的共现不会在图形中产生“边”)
让我们从一个简单的示例中解决这个问题。我将定义一个非常简单的具有六个单词类型的三文档结构。
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”和“ f”。 “ 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