Quanteda中dfm_lookup生成的DFM未展示各关键词列的问题
问题描述
我使用quanteda包结合自定义词典创建文档特征矩阵(DFM),但当前输出仅包含文档ID和词典所有特征的总频次两列,无法看到每个关键词/类别的单独频次。执行代码、当前输出及期望效果如下:
执行代码
library(lubridate) library(quanteda) ## 子集化数据 item7_corpus_subset <- item_7_corpus |> filter(year(filing_date) == year_data) |> head(100) ## 测试用,正常运行可注释 # 分词及生成n元语法 item7_tokens <- tokens(item7_corpus_subset, what = "word", remove_punct = TRUE, remove_symbols = TRUE, remove_numbers = TRUE, remove_url = TRUE) |> tokens_ngrams(n = 1:3) ## 按词典统计词汇 item7_doc_dict <- item7_tokens |> dfm(tolower = TRUE) |> dfm_lookup(dictionary = cyber_dict, levels = 1:3) print(item7_doc_dict)
当前输出
## Document-feature matrix of: 100 documents, 1 feature (94.00% sparse) and 13 docvars. ## features ## docs cyber_dict ## 1000015_10K_1999_0000912057-00-014793.txt 0 ## 1000112_10K_1999_0000930661-00-000704.txt 0 ## 1000181_10K_1999_0001000181-00-000001.txt 0 ## 1000227_10K_1999_0000950116-00-000643.txt 0 ## 1000228_10K_1999_0000889812-00-001326.txt 0 ## 1000230_10K_1999_0001005150-00-000103.txt 0 ## [ reached max_ndoc ... 94 more documents ]
期望效果
希望输出像示例那样,每个词典类别单独作为一列,显示对应频次:
## Document-feature matrix of: 14 documents, 9 features (19.84% sparse) and 6 docvars. ## features ## docs CULTURE ECONOMY ENVIRONMENT GROUPS INSTITUTIONS LAW_AND_ORDER RURAL URBAN VALUES ## Lenihan, Brian (FF) 9 583 21 0 93 11 9 0 19 ## Bruton, Richard (FG) 35 201 5 0 95 14 0 0 14 ## Burton, Joan (LAB) 33 400 6 3 84 6 2 3 6 ## Morgan, Arthur (SF) 56 427 10 0 63 22 2 1 18 ## Cowen, Brian (FF) 16 416 24 0 63 4 8 1 13 ## Kenny, Enda (FG) 26 211 8 1 53 18 0 2 8 ## [ reached max_ndoc ... 8 more documents ]
解决方案
问题根源在于词典结构和dfm_lookup的参数设置,按以下步骤调整:
- 检查并调整词典结构
确保你的cyber_dict是按类别分组的列表格式,而非单一向量。示例格式如下:
cyber_dict <- list( 网络攻击 = c("cyber attack", "hacking", "data breach"), 数据安全 = c("encryption", "firewall"), 系统漏洞 = c("vulnerability", "exploit") )
如果词典是单一向量(比如cyber_dict <- c("cyber attack", "hacking")),会被识别为单个类别,自然只会输出总频次。
- 修改
dfm_lookup的levels参数
将原代码中的levels = 1:3改为levels = 1,这样会保留词典的顶级类别作为单独特征列:
item7_doc_dict <- item7_tokens |> dfm(tolower = TRUE) |> dfm_lookup(dictionary = cyber_dict, levels = 1) print(item7_doc_dict)
levels=1:3会将词典的多层级合并为总频次,而levels=1会保留每个顶级类别的独立统计结果。
- 匹配n元语法与词典条目
由于你生成了1-3元的tokens,要确保词典中的短语(比如2元、3元短语)与tokens的格式一致,否则会出现匹配不到的情况(比如词典里写"cyber attack",tokens里要生成对应的二元语法才能被统计)。
内容的提问来源于stack exchange,提问作者NHH
相关产品推荐
相关产品推荐

