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

在R中复现Common words指标:单文档词相对频率均值计算遇阻

计算Loughran & McDonald 2014中的Common Words指标

问题背景

需求:复现Loughran & McDonald 2014中的Common words指标,流程为:先计算语料库所有文档中全部词汇的全局相对频率,再计算单个文档中所有词汇的该相对频率均值(值越高代表文档语言越通俗易读)。

已完成步骤:将tokens对象转换为dfm对象,并计算了全局词汇相对频率:

dfm_Notes_Summary <- dfm(tokens_Notes_Summary)
Summary_FreqStats_Notes <- textstat_frequency(dfm_Notes_Summary)

Summary_FreqStats_Notes$RelativeFreq <- Summary_FreqStats_Notes$frequency/sum(Summary_FreqStats_Notes$frequency)

遇到的问题:无法计算单个文档中所有词汇的全局相对频率均值。

解决方案

  • 构建词汇-全局相对频率映射
    把词汇和对应的全局相对频率做成命名向量,方便后续按词汇名快速匹配:

    # 构建词汇-全局相对频率的命名向量
    global_rel_freq <- setNames(Summary_FreqStats_Notes$RelativeFreq, Summary_FreqStats_Notes$term)
    
  • 计算单文档均值
    使用apply()函数按行遍历dfm对象,提取每个文档中出现的词汇对应的全局相对频率,再计算均值:

    # 计算每个文档的Common Words得分
    common_words_scores <- apply(dfm_Notes_Summary, 1, function(doc_tokens) {
      # 筛选当前文档中出现过的词汇(即频次>0的词汇)
      present_terms <- names(doc_tokens[doc_tokens > 0])
      # 提取这些词汇对应的全局相对频率
      term_rel_freqs <- global_rel_freq[present_terms]
      # 计算均值(na.rm=TRUE避免意外NA影响结果)
      mean(term_rel_freqs, na.rm = TRUE)
    })
    
  • 整理结果
    将得分与文档ID对应,方便后续分析:

    # 整理成包含文档ID和得分的数据框
    common_words_df <- data.frame(
      doc_id = docnames(dfm_Notes_Summary),
      common_words_score = common_words_scores,
      stringsAsFactors = FALSE
    )
    

高效优化方案(针对大规模语料库)

如果你的语料库规模极大,apply()处理稀疏矩阵的效率可能不高,可以改用矩阵运算优化,速度更快:

library(Matrix)
# 利用矩阵加权求和后除以总词数得到均值
common_words_scores <- rowSums(dfm_Notes_Summary %*% diag(global_rel_freq[colnames(dfm_Notes_Summary)])) / rowSums(dfm_Notes_Summary)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:26:27