在RStudio中为表格新增列计算不同文本字符串的熵
解决R中逐行计算文本字符串熵的问题
你当前使用的entropy()函数(大概率来自entropy包)是对整个输入向量计算分布熵,而非逐行处理每个文本字符串,这会导致所有行得到相同的熵值(或仅基于整体分布的单一结果)。要实现逐行计算每个文本的熵,需自定义函数并逐行应用,以下是两种可行方案:
方案1:基于字符频率计算熵
如果需要统计每个文本中字符出现频率的熵:
# 加载所需包 library(entropy) library(stringr) # 自定义计算单文本字符熵的函数 calc_char_entropy <- function(text) { # 去除空格(不需要的话可删除此行) text_clean <- str_remove_all(text, "\\s") # 统计每个字符的出现次数 char_counts <- table(str_split(text_clean, "", simplify = TRUE)) # 计算香农熵 entropy(char_counts, method = "shannon") } # 逐行应用函数生成ENTROPY列 DistEventsAllInfo_NOOUTL$ENTROPY <- sapply(DistEventsAllInfo_NOOUTL$VERBATIM, calc_char_entropy)
方案2:基于单词频率计算熵
如果你的文本是空格分隔的短语(如示例中的“A LIGHT STOMACH”),需要统计单词出现频率的熵:
# 加载所需包 library(entropy) library(stringr) # 自定义计算单文本单词熵的函数 calc_word_entropy <- function(text) { # 按空格拆分单词,统一转为小写(可选步骤) words <- str_split(str_to_lower(text), "\\s+", simplify = TRUE) # 过滤空字符串(处理连续空格情况) words <- words[words != ""] # 统计每个单词的出现次数 word_counts <- table(words) # 计算香农熵 entropy(word_counts, method = "shannon") } # 逐行应用函数 DistEventsAllInfo_NOOUTL$ENTROPY <- sapply(DistEventsAllInfo_NOOUTL$VERBATIM, calc_word_entropy)
优化提示
针对7万行的数据,sapply效率足够,若追求更快速度可改用data.table:
# 使用data.table优化处理速度 library(data.table) setDT(DistEventsAllInfo_NOOUTL) DistEventsAllInfo_NOOUTL[, ENTROPY := sapply(VERBATIM, calc_word_entropy)]
内容的提问来源于stack exchange,提问作者Sandra Roccuzzo
相关产品推荐
相关产品推荐

