You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的参数设置,按以下步骤调整:

  1. 检查并调整词典结构
    确保你的cyber_dict是按类别分组的列表格式,而非单一向量。示例格式如下:
cyber_dict <- list(
  网络攻击 = c("cyber attack", "hacking", "data breach"),
  数据安全 = c("encryption", "firewall"),
  系统漏洞 = c("vulnerability", "exploit")
)

如果词典是单一向量(比如cyber_dict <- c("cyber attack", "hacking")),会被识别为单个类别,自然只会输出总频次。

  1. 修改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会保留每个顶级类别的独立统计结果。

  1. 匹配n元语法与词典条目
    由于你生成了1-3元的tokens,要确保词典中的短语(比如2元、3元短语)与tokens的格式一致,否则会出现匹配不到的情况(比如词典里写"cyber attack",tokens里要生成对应的二元语法才能被统计)。

内容的提问来源于stack exchange,提问作者NHH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:52:53