R 使用quanteda中的字典从DFM中进行子集/选择

R 使用quanteda中的字典从DFM中进行子集/选择,r,text-mining,quanteda,R,Text Mining,Quanteda,我有来自不同国家的文本语料库。我试图了解每个国家的文本中出现特定术语的频率。为了做到这一点,我下面举一个例子: 如何实现这一点?基本答案是,您不能使用字典或任何其他类型的模式匹配对dfm进行子集划分,因为dfm_子集要求其子集匹配的逻辑值与文档的比例为1:1。字典将匹配特征,而不是文档 但是,如果您希望在不选择文档的情况下匹配功能(我认为这正是您想要的),那么您可以使用dfm_select,quanteda字典是该命令的模式参数的有效输入。此外,通过valuetype=glob参数,您可以指定模

我有来自不同国家的文本语料库。我试图了解每个国家的文本中出现特定术语的频率。为了做到这一点,我下面举一个例子:


如何实现这一点?

基本答案是,您不能使用字典或任何其他类型的模式匹配对dfm进行子集划分,因为dfm_子集要求其子集匹配的逻辑值与文档的比例为1:1。字典将匹配特征,而不是文档

但是,如果您希望在不选择文档的情况下匹配功能(我认为这正是您想要的),那么您可以使用dfm_select,quanteda字典是该命令的模式参数的有效输入。此外,通过valuetype=glob参数,您可以指定模式匹配是glob而不是regex

library("quanteda")

subdfm <- dfm(data_corpus_inaugural) %>%
    dfm_select(pattern = dict, valuetype = "glob")

head(subdfm)
## Document-feature matrix of: 6 documents, 5 features (66.7% sparse).
## 6 x 5 sparse Matrix of class "dfm"
##                  features
## docs              constitutional constitution constitutions constitutionally unconstitutional
##   1789-Washington              1            1             0                0                0
##   1793-Washington              1            1             0                0                0
##   1797-Adams                   0            8             1                0                0
##   1801-Jefferson               1            2             0                0                0
##   1805-Jefferson               0            6             0                0                0
##   1809-Madison                 0            1             0                0                0

textstat_frequency(subdfm)
##            feature frequency rank docfreq group
## 1     constitution       206    1      37   all
## 2   constitutional        53    2      24   all
## 3    constitutions         4    3       3   all
## 4 constitutionally         4    4       3   all
## 5 unconstitutional         3    5       3   all

如果您有用于创建dfm的语料库的DocVar,您也可以将它们提供给textstat_frequency调用-它们将附加到dfm。

尝试使用grepl为模式匹配或grepl的stringi替代方案对您的freq_分组对象进行子集设置。您可以使用glob2rx将glob转换为正则表达式。感谢您花时间来解决此问题。这就解决了我的问题。在某种程度上与上述相关,我是否正确,您在示例页面中使用的相对频率图实际上是在计算1949年后所有总统演讲中的总字数的权重,而不是每位总统的权重?如果是这样的话,由总统计算这些数字是否更有意义?一些总统的演讲会比其他总统的演讲要短,因此在其中一次演讲中提及利益相关者的任期会更有分量。我是否误解了某些内容?对于文档示例中的某些内容,我建议您在引用特定页面时提交一个问题,并将该问题标记为问题。
dict <- dictionary(list(constitution = c('*constitution*', 'charter of rights and freedoms', 
                                         'canadian charter', 'constituição*', '*constitucion*')))

freq_const <- subset(freq_grouped, freq_grouped$feature %in% dict)

freq_const
    [1] feature   frequency rank      docfreq   group    
    <0 rows> (or 0-length row.names)
library("quanteda")

subdfm <- dfm(data_corpus_inaugural) %>%
    dfm_select(pattern = dict, valuetype = "glob")

head(subdfm)
## Document-feature matrix of: 6 documents, 5 features (66.7% sparse).
## 6 x 5 sparse Matrix of class "dfm"
##                  features
## docs              constitutional constitution constitutions constitutionally unconstitutional
##   1789-Washington              1            1             0                0                0
##   1793-Washington              1            1             0                0                0
##   1797-Adams                   0            8             1                0                0
##   1801-Jefferson               1            2             0                0                0
##   1805-Jefferson               0            6             0                0                0
##   1809-Madison                 0            1             0                0                0

textstat_frequency(subdfm)
##            feature frequency rank docfreq group
## 1     constitution       206    1      37   all
## 2   constitutional        53    2      24   all
## 3    constitutions         4    3       3   all
## 4 constitutionally         4    4       3   all
## 5 unconstitutional         3    5       3   all