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

如何在R中结合正则与带评分关键词字典实现基础情感分析

在R中用正则匹配情感词并保留对应评分的实现

1. 准备示例数据

先定义带索引的文档数据和带评分的情感词典,方便直接测试运行:

library(dplyr)
library(stringr)
library(purrr)

# 示例文档(含唯一索引)
docs <- tibble(
  doc_id = c(1, 2, 3),
  text = c(
    "这部电影太棒了,剧情超精彩,但结局有点遗憾",
    "今天的服务很差,态度恶劣,完全不满意",
    "新品上市,体验还行,性价比不错"
  )
)

# 带情感评分的词典(正分表积极,负分表消极)
sentiment_dict <- tibble(
  word = c("太棒了", "精彩", "遗憾", "很差", "恶劣", "不满意", "还行", "不错"),
  score = c(2, 1.5, -1, -2, -1.8, -2.5, 0.5, 1)
)

2. 构建精准匹配的正则模式

为避免部分匹配(比如把“不错”误匹配到“不错过”),给每个情感词加上单词边界规则,确保只匹配完整单词:

# 构建正则:匹配完整单词,多个词用|分隔
sentiment_pattern <- str_c("\\b", sentiment_dict$word, "\\b", collapse = "|")

# 若中文场景下\\b效果不佳,可替换为空格/首尾匹配规则
# sentiment_pattern <- str_c("(?<=^|\\s)", sentiment_dict$word, "(?=\\s|$)", collapse = "|")

3. 按文档匹配并关联评分

提取每个文档的匹配词,再通过映射关联对应评分,同时保留文档索引:

# 生成匹配结果:含文档索引、匹配词、对应评分及总得分
result <- docs %>%
  mutate(
    # 提取当前文档所有匹配的情感词
    matched_words = str_extract_all(text, sentiment_pattern),
    # 将匹配词映射为对应的评分列表
    matched_scores = map(matched_words, ~ sentiment_dict$score[match(.x, sentiment_dict$word)]),
    # 可选:计算当前文档的总情感得分
    total_score = map_dbl(matched_scores, sum, na.rm = TRUE)
  )

# 查看嵌套格式的结果(每个文档一行)
print(result %>% select(doc_id, text, matched_words, matched_scores, total_score))

# 若需要展开为每行一个匹配词的细粒度格式
expanded_result <- result %>%
  select(doc_id, matched_words, matched_scores) %>%
  unnest(c(matched_words, matched_scores))

print(expanded_result)

关键细节说明

  • 正则边界规则:\\b或(?<=^|\\s)/(?=\\s|$)确保只匹配独立的完整单词,避免歧义匹配;
  • match函数:精准关联匹配词与词典中的评分,保证每个关键词的分值不丢失;
  • unnest操作:将嵌套的匹配结果展开,方便后续做细粒度的情感分析。

内容的提问来源于stack exchange,提问作者vintdeux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:55:34