Quanteda 将 fcm 输出转换为 data.frame

Quanteda convert fcm output to data.frame

我正在尝试使用出色的 Quanteda 来查看新闻文章中术语的共现。

我可以找到与“美国”(美国)共现的特征如下:

ch14_corp <- corpus(data_14)
ch14_toks <- tokens(ch14_corp, remove_punct = TRUE) %>%
+ tokens_remove(ch_stop)
ch14_fcm <- fcm(ch14_toks, context = "window")

然后获取共同出现频率最高的特征


topfeatures(ch14_fcm["美国", ], n=50)

朝鲜     美国     日本     中国     韩国     问题       马     政府     国家     报道 
     881      804      555      552      297      288      270      254      253      243 
      奥     总统       称     战略     表示       韩     关系     政策     认为     进行 
     238      238      234      227      214      174      173      169      162      160 
      中       核     亚太 国家安全     经济     安全       局     世界     发言   国务院 
     157      153      148      137      136      136      136      135      132      129 
      美       国     访问   俄罗斯     军事     国际     官员     媒体     公民     人权 
     126      122      121      120      120      118      118      114      114      114 
    联合     一个       名     地区     安倍     平衡     导弹     国防       斯     克里 
     112      112      112      111      110      110      107      105      104      102

谁能告诉我如何将其转换为 'data.frame'?或 A 列中带有 'feature' 的 table,然后它与 B 列中的“美国”同时出现的次数?

我想另一种方法可能是不使用 'topfeatures' 而是只获取矩阵中包含与“美国”同时出现的所有项的行(或列?),然后根据它们同时出现的次数对它们进行排序?

我认为如果我按照以下方式进行操作是否可行?

df <- as.data.frame(t(mat_term)
colnames(df)[1] <- "Term"  
colnames(df)[2] <- "Freq"  
us_co <- df[order(-df$Freq),]  
us_co[1:100,] 

有人可以确认这是正确的吗?给我一个 co-occur 带有术语“美国”(美国)的前 100 个特征的数据框?

这或多或少是对的。这是我使用 built-in 示例的方法,您可以根据需要替换您的文本和不同的参数(例如 n)。

注意 padding = TRUE 的使用:这会在标点符号或停用词被删除的 space 中留下空白,这样对于以前由删除的标记之一分隔的单词,邻近度不会膨胀.

library("quanteda")
## Package version: 2.1.1

ch14_corp <- head(data_corpus_inaugural)
ch14_toks <- tokens(ch14_corp, remove_punct = TRUE, padding = TRUE) %>%
  tokens_remove(stopwords("en"), padding = TRUE) %>%
  tokens_tolower()
ch14_fcm <- fcm(ch14_toks, context = "window")

topf <- topfeatures(ch14_fcm["united", ], n = 6)

data.frame(Term = names(topf), Freq = topf, row.names = NULL) %>%
  dplyr::arrange(desc(Freq))
##           Term Freq
## 1       states    8
## 2   government    3
## 3 constitution    3
## 4   instituted    1
## 5       enable    1
## 6         step    1