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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:24:43