求助:在R中提取目标词前后10个词用于情感分析
提取目标词前后10词上下文的R解决方案
针对你的需求,这里提供两种实用的R实现方法,分别适配不同场景:
方法一:正则表达式快速提取上下文字符串
适合快速获取包含目标词的前后10词片段,无需提前分词:
# 加载所需包 library(dplyr) library(stringr) # 定义目标词向量 target_words <- c("jesus", "mary", "christ", "magdelene") # 构建匹配前后最多10个完整单词的正则模式 context_pattern <- paste0( "(?:\\b\\w+\\b\\s){0,10}", # 前面0-10个词(含空格分隔) "\\b(", paste(target_words, collapse = "|"), ")\\b", # 目标词(匹配完整单词) "(?:\\s\\b\\w+\\b){0,10}" # 后面0-10个词(含空格分隔) ) # 处理你的亚马逊评论数据框(假设数据框名为df,text列为评论内容) context_df <- df %>% mutate( # 提取每条评论中所有匹配的上下文片段,返回列表 contexts = str_extract_all(text, context_pattern, ignore.case = TRUE) ) %>% # 将列表展开为每行一个上下文片段 tidyr::unnest(contexts) %>% # 提取当前上下文对应的目标词(方便后续分组分析) mutate(target_word = str_extract(contexts, paste0("\\b(", paste(target_words, collapse = "|"), ")\\b"), ignore.case = TRUE)) %>% # 统一目标词大小写(可选) mutate(target_word = tolower(target_word))
注意:ignore.case = TRUE 确保匹配不同大小写的目标词(比如"Jesus"或"JESUS"),如果不需要可以移除该参数。
方法二:分词+滑动窗口精准提取
适合需要对上下文的单个词做精细化处理(比如情感分析时逐个词计算得分)的场景:
# 加载所需包 library(dplyr) library(tidytext) library(tidyr) # 定义目标词向量 target_words <- c("jesus", "mary", "christ", "magdelene") # 1. 对评论进行分词,保留评论标识和词的位置 tokenized_df <- df %>% # 给每条评论生成唯一ID(如果已有ID列可替换row_number()) mutate(comment_id = row_number()) %>% # 分词,自动转小写(如需保留大小写可设置to_lower = FALSE) unnest_tokens(word, text) %>% # 按评论分组,给每个词标记位置 group_by(comment_id) %>% mutate(word_position = row_number()) %>% ungroup() %>% # 可选:过滤停用词(比如the/and等无意义词汇) filter(!word %in% stop_words$word) # 2. 定位所有目标词的位置 target_positions <- tokenized_df %>% filter(word %in% target_words) %>% select(comment_id, target_word = word, target_position = word_position) # 3. 提取每个目标词前后10个词的上下文 context_tokens <- target_positions %>% left_join(tokenized_df, by = "comment_id") %>% # 筛选位置在目标词前后10范围内的词 filter(abs(word_position - target_position) <= 10) %>% # 按评论和目标词分组,拼接上下文为字符串(或保留单个词用于情感分析) group_by(comment_id, target_word) %>% summarize( context_text = str_c(word, collapse = " "), # 可选:保留单个词的列表,方便后续逐个词做情感分析 context_words = list(word) ) %>% ungroup()
后续情感分析建议
得到上下文后,你可以直接用context_text列进行文本情感分析(比如用sentimentr包的sentiment()函数),或者用context_words列表对每个词单独打分后取平均值,结果会更精准。
内容的提问来源于stack exchange,提问作者Lui Holohan
相关产品推荐
相关产品推荐

