如何根据分组变量计算 quanteda 中的搭配?
How to count collocations in quanteda based on grouping variables?
我一直致力于识别和分类 R 中 Quenteda 包的搭配。
例如;
我从文档列表创建令牌对象,并应用搭配分析。
toks <- tokens(text$abstracts)
collocations <- textstat_collocations(toks)
然而,据我所知,没有明确的方法来查看哪个搭配是 frequent/exist 在哪个文档中。即使我应用 kwic(toks, pattern = phrase(collocations), selection = 'keep'
) 结果也只会包括 rowid 作为 text1、text2 等
我想根据 docvars 对搭配分析结果进行分组。 Quanteda 有可能吗?
听起来您想按文档来统计搭配。 textstat_collocations()
的输出已经提供了每个搭配的计数,但这些是针对整个语料库的。
所以按文档(或任何其他变量)分组的解决方案是
- 使用
textstat_collocations()
获取搭配。下面,我在删除停用词和标点符号后完成了这项工作。
- 使用
tokens_compound()
复合形成停用词的标记。这会将每个搭配序列转换为单个标记。
- 从复合标记形成 dfm,并使用
textstat_frequency()
按文档计算复合。
这有点棘手
使用内置的就职语料库实现:
library("quanteda")
## Package version: 3.0
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 12 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
library("quanteda.textstats")
toks <- data_corpus_inaugural %>%
tail(10) %>%
tokens(remove_punct = TRUE, padding = TRUE) %>%
tokens_remove(stopwords("en"), padding = TRUE)
colls <- textstat_collocations(toks)
head(colls)
## collocation count count_nested length lambda z
## 1 let us 34 0 2 6.257000 17.80637
## 2 fellow citizens 14 0 2 6.451738 16.18314
## 3 fellow americans 15 0 2 6.221678 16.16410
## 4 one another 14 0 2 6.592755 14.56082
## 5 god bless 15 0 2 8.628894 13.57027
## 6 united states 12 0 2 9.192044 13.22077
现在我们将它们复合,只保留搭配,然后通过文档获取频率:
dfmat <- tokens_compound(toks, colls, concatenator = " ") %>%
dfm() %>%
dfm_keep("* *")
dfm 已经包含每个搭配的文档计数,但如果您想要 data.frame 格式的计数,并带有分组选项,请使用 textstat_frequency()
。这里我只按文档输出前两个,但如果你删除 n = 2
那么它将按文档为你提供所有搭配的频率。
textstat_frequency(dfmat, groups = docnames(dfmat), n = 2) %>%
head(10)
## feature frequency rank docfreq group
## 1 nuclear weapons 4 1 1 1985-Reagan
## 2 human freedom 3 2 1 1985-Reagan
## 3 new breeze 4 1 1 1989-Bush
## 4 new engagement 3 2 1 1989-Bush
## 5 let us 7 1 1 1993-Clinton
## 6 fellow americans 4 2 1 1993-Clinton
## 7 let us 6 1 1 1997-Clinton
## 8 new century 6 1 1 1997-Clinton
## 9 nation's promise 2 1 1 2001-Bush
## 10 common good 2 1 1 2001-Bush
我一直致力于识别和分类 R 中 Quenteda 包的搭配。
例如;
我从文档列表创建令牌对象,并应用搭配分析。
toks <- tokens(text$abstracts)
collocations <- textstat_collocations(toks)
然而,据我所知,没有明确的方法来查看哪个搭配是 frequent/exist 在哪个文档中。即使我应用 kwic(toks, pattern = phrase(collocations), selection = 'keep'
) 结果也只会包括 rowid 作为 text1、text2 等
我想根据 docvars 对搭配分析结果进行分组。 Quanteda 有可能吗?
听起来您想按文档来统计搭配。 textstat_collocations()
的输出已经提供了每个搭配的计数,但这些是针对整个语料库的。
所以按文档(或任何其他变量)分组的解决方案是
- 使用
textstat_collocations()
获取搭配。下面,我在删除停用词和标点符号后完成了这项工作。 - 使用
tokens_compound()
复合形成停用词的标记。这会将每个搭配序列转换为单个标记。 - 从复合标记形成 dfm,并使用
textstat_frequency()
按文档计算复合。 这有点棘手
使用内置的就职语料库实现:
library("quanteda")
## Package version: 3.0
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 12 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
library("quanteda.textstats")
toks <- data_corpus_inaugural %>%
tail(10) %>%
tokens(remove_punct = TRUE, padding = TRUE) %>%
tokens_remove(stopwords("en"), padding = TRUE)
colls <- textstat_collocations(toks)
head(colls)
## collocation count count_nested length lambda z
## 1 let us 34 0 2 6.257000 17.80637
## 2 fellow citizens 14 0 2 6.451738 16.18314
## 3 fellow americans 15 0 2 6.221678 16.16410
## 4 one another 14 0 2 6.592755 14.56082
## 5 god bless 15 0 2 8.628894 13.57027
## 6 united states 12 0 2 9.192044 13.22077
现在我们将它们复合,只保留搭配,然后通过文档获取频率:
dfmat <- tokens_compound(toks, colls, concatenator = " ") %>%
dfm() %>%
dfm_keep("* *")
dfm 已经包含每个搭配的文档计数,但如果您想要 data.frame 格式的计数,并带有分组选项,请使用 textstat_frequency()
。这里我只按文档输出前两个,但如果你删除 n = 2
那么它将按文档为你提供所有搭配的频率。
textstat_frequency(dfmat, groups = docnames(dfmat), n = 2) %>%
head(10)
## feature frequency rank docfreq group
## 1 nuclear weapons 4 1 1 1985-Reagan
## 2 human freedom 3 2 1 1985-Reagan
## 3 new breeze 4 1 1 1989-Bush
## 4 new engagement 3 2 1 1989-Bush
## 5 let us 7 1 1 1993-Clinton
## 6 fellow americans 4 2 1 1993-Clinton
## 7 let us 6 1 1 1997-Clinton
## 8 new century 6 1 1 1997-Clinton
## 9 nation's promise 2 1 1 2001-Bush
## 10 common good 2 1 1 2001-Bush