在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
相关产品推荐
相关产品推荐

