quanteda:计算网络图中每个节点的边数
quanteda: Count number of edges for each node in a network plot
我有一个通过 quanteda
包的 textplot_network()
函数计算的网络图。最低限度,请参考官方quanteda
网站here。
我在下面报告的内容只是您可以在 link.
中找到的内容的复制粘贴
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)
生成的网络图如下:
如何计算图中呈现的每个节点的边数?如果我使用应用于 fcm
对象 topgat_fcm
的函数 topfeatures()
,我将获得网络的顶级集线器,它们是检测到的同时出现的计数。
有什么想法吗?
谢谢
任何节点的边数将是上三角形中的单元格数,不包括对角线(因为文档中一个特征与其自身的另一个实例同时出现不会产生 "edge"在情节中)。
让我们从一个更简单的例子来解决这个问题。我将定义一个非常简单的三文档结构,其中包含六种词类型。
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()
或者如果你转置矩阵,计算 "document" 频率的等效函数(虽然在这里,功能是 "documents").
排除自边,我们可以通过查看此 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 上的 class 定义,这意味着我们将无法在 textplot_network()
中使用它,但我们仍然可以使用我们的 rowSums()
方法来获取边数通过节点,为您的问题提供答案。
diag(fcmat) <- 0
rowSums(fcmat > 0)
## a b c d e f
## 4 3 0 1 1 0
我有一个通过 quanteda
包的 textplot_network()
函数计算的网络图。最低限度,请参考官方quanteda
网站here。
我在下面报告的内容只是您可以在 link.
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)
生成的网络图如下:
如何计算图中呈现的每个节点的边数?如果我使用应用于 fcm
对象 topgat_fcm
的函数 topfeatures()
,我将获得网络的顶级集线器,它们是检测到的同时出现的计数。
有什么想法吗?
谢谢
任何节点的边数将是上三角形中的单元格数,不包括对角线(因为文档中一个特征与其自身的另一个实例同时出现不会产生 "edge"在情节中)。
让我们从一个更简单的例子来解决这个问题。我将定义一个非常简单的三文档结构,其中包含六种词类型。
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()
或者如果你转置矩阵,计算 "document" 频率的等效函数(虽然在这里,功能是 "documents").
排除自边,我们可以通过查看此 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 上的 class 定义,这意味着我们将无法在 textplot_network()
中使用它,但我们仍然可以使用我们的 rowSums()
方法来获取边数通过节点,为您的问题提供答案。
diag(fcmat) <- 0
rowSums(fcmat > 0)
## a b c d e f
## 4 3 0 1 1 0