quanteda:使用类似于 textstat_frequency 的 textstat_keyness 为多个目标生成输出

quanteda: producing an output for several targets using textstat_keyness similarly to textstat_frequency

我有一个包含 2 个文档变量的语料库:group 和 interest。

我有兴趣使用 textstat_keyness 识别给定的兴趣和组(目标)组合与语料库其余部分的关键特征,我想为任何可能的兴趣和组组合复制它。

我可以通过以下方式轻松完成一次:

data_trim@docvars$focus <- 0 
data_trim@docvars$focus[data_trim@docvars$group=="One of the Groups" 
& data_trim@docvars$interest=="One of the interests"] <- 1 #I created the


keyness <- dfm(data_trim, groups = "focus")
k_sustainability <- textstat_keyness(keyness, target ="1")

但是我想找到一种简单的方法来为组和目标的任何可能组合生成结果,而无需手动执行此操作。

我知道 textstat_frequency 函数允许我 select groups = c("group", "interest") 并针对 "group" 和 "interest" 的任意组合生成包含最常用词的输出。 有什么方法可以对 textstat_keyness 做同样的事情吗?

(我展示了 textstat_frequency 输出的示例)

textstat_frequency(dt_tfidf, n = 20, groups = c("group", "interest"), force=TRUE)

feature     frequency   rank      docfreq      group
 ...          ...        1          ..         group1 & interest1
                         2                     group1 & interest1
                         3                     group1 & interest1
                         .                     ....
                         .
                         1                     group2 & interest1
                         2                     group2 & interest1
                         .                      .
                         .
                         18                     group100 & interest100
                         19                     group100 & interest100
                         20                     group100 & interest100      

所以我想要类似的东西使用 textstat_keyness 以获得类似的东西(即具有前 20 项得分特征,以及相应的组可以通过列排名和组识别,就像我在 textstat_frequency):

feature    chi2         p           n_target        n_reference rank    group
 ...         ..             .. ...      ..           ...          1.    group1 & interest1
  ....
与所有其他文档相比,

textstat_keyness() 识别与 dfm 中的目标 "document" 最相关的关键字。因此,为了比较组合,您首先需要根据组的组合创建一个分组的 dfm。然后您可以遍历 dfm 并为每个组与所有其他组进行比较。

操作方法如下:

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

docvars(data_corpus_irishbudget2010, "govopp") <-
  ifelse(docvars(data_corpus_irishbudget2010, "party") %in% c("FF", "Green"),
    "Government", "Opposition"
  )
dfmatgr <- dfm(data_corpus_irishbudget2010, groups = c("govopp", "party"))
head(dfmatgr, nf = 5)
## Document-feature matrix of: 5 documents, 5 features (16.0% sparse) and 4 docvars.
##                   features
## docs               when  i presented the supplementary
##   Government.FF       9 90         1 933             7
##   Opposition.FG      19 42         1 802             1
##   Government.Green    9 33         0 224             0
##   Opposition.LAB     25 76         0 856             0
##   Opposition.SF      28 31         1 783             2

这创建了团体,在这种情况下,这些团体是由政府、反对派和政党组成的。 (您的示例可能有重叠组,但由于我无法复制它,所以我使用了一个内置语料库中的示例。)

现在我们创建一个 data.frame 并循环遍历目标。为了演示,我只记录了前 2 个关键字,但您可以将其更改为 20 个或任何您喜欢的关键字。

df <- data.frame()
for (g in docnames(dfmatgr)) {
  df_temp <- head(textstat_keyness(dfmatgr, target = g), 2)
  df_temp[["target"]] <- g
  df <- rbind(df, df_temp)
}

df
##         feature      chi2            p n_target n_reference           target
## 1          2010  59.14626 1.465494e-14       41          14    Government.FF
## 2        scheme  51.30431 7.910339e-13       31           8    Government.FF
## 11    taoiseach 116.89154 0.000000e+00       49          18    Opposition.FG
## 21          not  39.15371 3.917181e-10      127         259    Opposition.FG
## 12 enterprising 102.69108 0.000000e+00        9           0 Government.Green
## 22           we  67.76028 2.220446e-16       97         521 Government.Green
## 13       fianna  66.59467 3.330669e-16       47          25   Opposition.LAB
## 23         fáil  65.23011 6.661338e-16       44          22   Opposition.LAB
## 14        state  59.81864 1.043610e-14       42          32    Opposition.SF
## 24         care  32.97959 9.313121e-09       18          10    Opposition.SF

注意:我强烈反对使用例如访问 docvars data_trim@docvars$focus -- 使用 docvars() 代替,因为这将始终有效。如果我们更改对象结构,您的代码将会中断。 (在即将发布的 v2 中,我们可以使用 $ 访问 docvars。)