基于R的表情符号情感分析:如何获取文本+表情的综合情感得分
问题描述
我正在开展一个处理含Emoji的推特分析项目,核心目标是计算推文(文本+Emoji)的综合情感得分,Emoji是数据中最关键的信息,绝对不能忽略。目前我已经用iconv转换了Emoji的编码格式,但使用Vader sentiment工具时,只能计算出文本部分的情感得分,Emoji的情感完全没被纳入计算。
示例推文
dput(df_emoji$Description) c("DoorDash or Uber method asap<f0><9f><98><ad> cause I be starving<f0><9f><98><ad><f0><9f><98><ad>", "such a real ahh niqq cuz I be having myself weak asl<f0><9f><98><82>", "shii made me laugh so fuccin hard bro<f0><9f><98><82><f0><9f><98><82><f0><9f><98><82><f0><9f><98><82>", "Hart and Will Ferrell made a Gem in Get hard fr<f0><9f><98><82><f0><9f><98><82><f0><9f><98><82>", "@NigerianAmazon Chill<f0><9f><a4><a3><f0><9f><98><ad>", "so bomedy <f0><9f><98><82><f0><9f><98><82><f0><9f><98><82>", "is that ass Gotdam<f0><9f><98><82><f0><9f><98><82><f0><9f><98><82>", "wild<f0><9f><98><82><f0><9f><98><82><f0><9f><98><82>", "them late night DoorDash<e2><80><99>s be goin crazy<f0><9f><a4><a3>", "of the week<f0><9f><98><82><f0><9f><98><82><f0><9f><98><82><f0><9f><98><82>" )
当前使用代码
emoji_senti <- data.frame(text = iconv(data_sample$text, "latin1", "ASCII", "byte"), stringsAsFactors = FALSE) column1 <- separate(emoji_senti, text, into = c("Bytes", "Description"), sep = "\\ ") column2 <- separate(emoji_senti, text, into = c("Bytes", "Description"), sep = "^[^\\s]*\\s") df_emoji <- data.frame(Bytes = column1$Bytes, Description = column2$Description) allvals_emoji <- NULL for (i in 1:length(df_emoji$Description)){ outs <- vader_df(df_emoji$Description[i]) allvals_emoji <- rbind(allvals_emoji,outs) } allvals_emoji
运行结果
第一条推文仅9个英文词获得得分,转换后的Unicode表情符号未被计算:
# word_scores compound pos neu neg but_count # 1 {0, 0, 0, 0, 0, 0, 0, 0, 0} 0.000 0.000 1.000 0.000 0 # 2 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.9, 0, 0} -0.440 0.000 0.805 0.195 0 # 3 {0, 0, 0, 2.6, 0, 0, -0.67835, 0, 0} 0.444 0.293 0.570 0.137 0 # 4 {0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4, 0} -0.103 0.000 0.877 0.123 0 # 5 {0, 0} 0.000 0.000 1.000 0.000 0 # 6 {0, 0, 0, 0} 0.000 0.000 1.000 0.000 0 # 7 {0, 0, -2.5, 0, 0} -0.542 0.000 0.533 0.467 0 # 8 {0, 0} 0.000 0.000 1.000 0.000 0 # 9 {0, 0, 0, 0, 0, 0, 0} 0.000 0.000 1.000 0.000 0 # 10 {0, 0, 0, 0} 0.000 0.000 1.000 0.000 0
解决方案
1. 修复Emoji编码,让Vader识别
你当前用iconv转成的<f0><9f><98><ad>是字节转义格式,Vader无法识别。先把这些转义序列还原成真实的Emoji字符,再用支持Emoji的Vader版本处理:
编码还原代码
# 定义函数将<xx>格式的字节转成真实Emoji convert_byte_escapes <- function(text) { # 匹配所有<xx>格式的字节序列 byte_matches <- str_extract_all(text, "<[0-9a-fA-F]{2}>")[[1]] if (length(byte_matches) == 0) return(text) # 将字节序列转成十六进制raw格式,再转成字符 bytes <- as.raw(strtoi(substr(byte_matches, 2, 3), 16)) emoji <- rawToChar(bytes) # 替换原文本中的转义序列 for (i in seq_along(byte_matches)) { text <- gsub(byte_matches[i], emoji[i], text, fixed = TRUE) } return(text) } # 处理推文的Description列,生成带真实Emoji的文本 df_emoji$clean_text <- sapply(df_emoji$Description, convert_byte_escapes)
使用支持Emoji的Vader
R中的vaderSentiment包最新版本原生支持Emoji情感分析,直接调用即可:
library(vaderSentiment) # 批量计算情感得分 allvals_emoji <- lapply(df_emoji$clean_text, vader_df) allvals_emoji <- do.call(rbind, allvals_emoji)
此时Emoji的情感会被自动纳入计算,比如😀会被识别为正面情感,😩会被识别为负面情感。
2. 自定义Emoji情感词典(精准控制)
如果需要更贴合业务场景的Emoji得分,可以自己构建Emoji-情感映射表,叠加到Vader的结果上:
示例词典与计算代码
# 自定义Emoji情感词典(可根据需求扩展) emoji_sentiment <- data.frame( emoji = c("😩", "😀", "🤣"), score = c(-0.8, 0.7, 0.9) # 得分范围[-1,1] ) # 计算单条推文的Emoji总得分 calculate_emoji_score <- function(text) { total_score <- 0 for (i in seq(nrow(emoji_sentiment))) { count <- str_count(text, emoji_sentiment$emoji[i]) total_score <- total_score + count * emoji_sentiment$score[i] } # 归一化到[-1,1],和Vader的compound得分对齐 if (total_score != 0) { total_score <- total_score / abs(total_score) * min(1, abs(total_score)) } return(total_score) } # 计算每条推文的Emoji得分 df_emoji$emoji_compound <- sapply(df_emoji$clean_text, calculate_emoji_score) # 合并文本与Emoji的情感得分(这里采用直接相加后归一化) allvals_emoji$combined_compound <- allvals_emoji$compound + df_emoji$emoji_compound allvals_emoji$combined_compound <- sapply(allvals_emoji$combined_compound, function(x) { if (x > 1) 1 else if (x < -1) -1 else x })
3. 其他支持Emoji的情感分析工具
- transformers包:使用预训练大语言模型(如BERT),多数模型原生支持Emoji情感识别,R中可直接调用
transformers包实现。 - textblob-emoji:Python生态中的工具,专门处理Emoji情感,若用R可通过
reticulate包调用。
内容的提问来源于stack exchange,提问作者M. Talha Bin Asif
相关产品推荐
相关产品推荐

