Subset/select 来自 DFM,使用 quanteda 中的字典
Subset/select from a DFM using a dictionary in quanteda
我有一个来自不同国家的文本语料库。我试图查看特定术语在每个国家/地区的文本中出现的频率。为此,我按照此处的示例进行操作:https://quanteda.io/articles/pkgdown/examples/plotting.html#frequency-plots
freq_grouped <- textstat_frequency(dfm(full_corpus),
groups = "Country")
freq_const <- subset(freq_grouped, freq_grouped$feature %in% "constitution")
这工作正常,除了它只捕获确切的术语 ("constitution")。我希望能够捕获术语的变体(例如 "charter of rights and freedoms")使用 glob(例如“*constitution*
”),并计算同一类别下的结果。我尝试为此使用字典,但结果为零。
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)
我怎样才能实现这个目标?
基本答案是您不能使用字典或任何其他类型的模式匹配对 dfm 进行子集化,因为 dfm_subset()
需要其子集匹配的逻辑值匹配 1:1 和 文档。字典会匹配特征,而不是文档。
如果您想在不选择文档的情况下匹配 features,但是——我认为这是您的意图——那么您可以使用 dfm_select()
,然后quanteda 字典是该命令的 pattern
参数的有效输入。此外,使用 valuetype = "glob"
参数,您可以指定您的模式匹配是 glob 而不是正则表达式。
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 的语料库的文档变量,您也可以将它们提供给 textstat_frequency()
调用 - 它们将附加到 dfm。
我有一个来自不同国家的文本语料库。我试图查看特定术语在每个国家/地区的文本中出现的频率。为此,我按照此处的示例进行操作:https://quanteda.io/articles/pkgdown/examples/plotting.html#frequency-plots
freq_grouped <- textstat_frequency(dfm(full_corpus),
groups = "Country")
freq_const <- subset(freq_grouped, freq_grouped$feature %in% "constitution")
这工作正常,除了它只捕获确切的术语 ("constitution")。我希望能够捕获术语的变体(例如 "charter of rights and freedoms")使用 glob(例如“*constitution*
”),并计算同一类别下的结果。我尝试为此使用字典,但结果为零。
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)
我怎样才能实现这个目标?
基本答案是您不能使用字典或任何其他类型的模式匹配对 dfm 进行子集化,因为 dfm_subset()
需要其子集匹配的逻辑值匹配 1:1 和 文档。字典会匹配特征,而不是文档。
如果您想在不选择文档的情况下匹配 features,但是——我认为这是您的意图——那么您可以使用 dfm_select()
,然后quanteda 字典是该命令的 pattern
参数的有效输入。此外,使用 valuetype = "glob"
参数,您可以指定您的模式匹配是 glob 而不是正则表达式。
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 的语料库的文档变量,您也可以将它们提供给 textstat_frequency()
调用 - 它们将附加到 dfm。