如何限制findAssocs()仅针对选定词汇计算关联?
高效计算特定词汇间的关联
嘿,我懂你想避免遍历整个TDM来计算关联的需求——毕竟只需要特定的be动词和那几个目标词的相关性,没必要浪费算力在其他词汇上。下面是具体的实现步骤,既高效又能得到你想要的结果:
第一步:提取TDM的词汇子集
首先,我们把需要的所有词汇(目标词+soln里的be动词)找出来,从原TDM中只提取这些词对应的行,生成一个规模小很多的子矩阵。这样后续计算就只在这个小矩阵里进行,速度会快很多。
# 定义你需要的be动词向量 soln <- c("was","are","were","am","is","been","being","be") # 合并目标词和soln词汇,得到所有需要关注的词汇 target_terms <- c("oil", "opec", "xyz", soln) # 先检查这些词汇哪些实际存在于TDM中(避免不存在的词报错) existing_terms <- intersect(target_terms, rownames(tdm)) # 提取TDM子集 tdm_subset <- tdm[existing_terms, ]
第二步:手动计算目标词汇间的相关性
findAssocs底层其实是用相关性计算实现的,我们可以直接针对子矩阵计算目标词和soln词汇的关联,同时保留和findAssocs一致的阈值过滤逻辑:
# 把TDM子集转换成普通矩阵,方便计算 mat <- as.matrix(tdm_subset) # 定义要计算关联的源词汇(oil、opec、xyz),确保它们存在于子矩阵中 source_terms <- intersect(c("oil", "opec", "xyz"), rownames(mat)) # 定义要匹配的soln词汇,同样确保存在 soln_terms <- intersect(soln, rownames(mat)) # 逐个计算每个源词和soln词汇的相关性,过滤并排序 assoc_results <- lapply(source_terms, function(term) { # 计算当前源词和所有soln词的皮尔逊相关系数(和findAssocs默认一致) cor_values <- cor(mat[term, ], mat[soln_terms, ]) # 过滤掉低于你设定的阈值(比如0.1)的结果 cor_values <- cor_values[cor_values >= 0.1] # 按相关性从高到低排序 sort(cor_values, decreasing = TRUE) }) # 给结果命名,方便查看 names(assoc_results) <- source_terms
为什么这个方法更高效?
原来的findAssocs会遍历整个TDM的所有词汇来计算关联,而我们通过提取子集,把计算范围缩小到了你真正关心的词汇上——尤其是当原TDM包含成千上万个词汇时,这个优化能大幅减少计算时间和内存占用。
如果需要和findAssocs完全一致的输出格式,这个结果的结构和它是一样的,你可以直接查看assoc_results就能得到每个目标词对应的关联词汇和系数。
内容的提问来源于stack exchange,提问作者anshabhi
相关产品推荐
相关产品推荐

