Sentimentr调用update_polarity_table更新自定义情感极性不生效问题
排查操作错误的核心原因及修正方案
1. 关键传参错误:更新后的词典根本没被函数实际使用
你观察到的「yes得分为0.8、unsure/unknown得分为-0.5」,完全是sentimentr内置默认词典hash_sentiment_jockers_rinker的预设值——出现这个结果的核心原因是,你在调用sentiment_by时没有通过正确的参数槽位传入自定义词典。
原调用代码里直接将updated_socal_google作为无命名的位置参数传入,在多数版本的函数实现中,这个位置不会被识别为词典输入槽,函数会自动降级使用内置默认词典完成计算,和你准备的socal_google更新词典完全无关。
修正原则:必须用显式命名参数lexicon = 传入自定义词典,不要依赖位置匹配。
2. 词典更新流程不符合函数输入要求
你调用sentimentr:::update_polarity_table时存在两个输入错误:
- 传入的第一个参数是
hash_sentiment_socal_google(本质是R的hash环境对象),但这个函数要求输入的是data.table格式的原生极性表(带词、极性值两列的普通数据表),不是封装好的hash检索环境。直接传hash环境会导致函数静默失效,根本不会执行词表的合并更新。 - 自定义传入的新词表列名用了
words/polarity,但函数默认识别的列名是x(存储单词)、y(存储极性值),列名不匹配会让函数读不到你设置的三个零值词。
正确的词典更新逻辑:
- 从原hash词典中提取底层存储极性表的data.table结构
- 基于原生数据表执行极性值更新
- 将更新后的数据表重新封装为hash词典对象,供分析函数调用
3. 为什么你在原词典中检索不到这几个词
你之前用'yes' %in% lexicon::hash_sentiment_socal_google做存在性判断时,得到永远为FALSE的结果——这是因为hash_sentiment系列对象本质是R的environment环境类型,不是普通向量,%in%运算符对环境对象的判断逻辑不生效。正确的检索方式为:
# 查看单个词的得分 lexicon::hash_sentiment_socal_google[['yes']] # 导出词典内全部单词列表 all_dict_terms <- lexicon::hash_sentiment_socal_google$table$x
修正后的完整可运行代码
# 加载依赖包 library(sentimentr) library(lexicon) library(hash) # 生成格式正确的更新版词典 original_polarity <- hash_sentiment_socal_google$table updated_polarity <- update_polarity_table( original_polarity, x = data.frame( x = c('yes', 'unsure', 'unknown'), y = c(0, 0, 0), stringsAsFactors = FALSE ) ) updated_socal_google <- hash(updated_polarity) # 运行情感分析,显式指定自定义词典 sentiments_new <- sentiment_by( x = text_sentences, by = NULL, averaging.function = average_mean, lexicon = updated_socal_google, amplifier.weight = 0.5, n.before = 10, n.after = 4 )
内容的提问来源于stack exchange,提问作者Jasmine B
相关产品推荐
相关产品推荐

