如何在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
相关产品推荐
相关产品推荐

