如何基于法语ANEW词典(FAN)在Quanteda中计算文本平均情感值
用法语ANEW词典(FAN)+ Quanteda计算文本平均情感值指南
嘿,我来帮你梳理怎么用法语版ANEW(也就是FAN词典)结合Quanteda工具,算出语料库中每篇文本的平均情感值。咱们一步步来:
1. 加载FAN词典并构建权重命名向量
FAN和普通的键值对词典不一样,它是给每个词直接分配数值分数的,所以首先得把它转换成Quanteda能识别的格式。假设你的FAN词典是CSV文件(这类情感词典一般都是这种结构,比如包含词和效价/唤醒度这类情感维度列):
- 先读取词典数据:
library(readr) # 替换成你的FAN词典实际路径 fan_dict <- read_csv("你的FAN词典文件路径.csv")
- 接着把词典转成权重命名向量——把词作为向量的名称,对应的情感分数作为向量值(这里以效价为例,你也可以换成唤醒度、支配度这些维度):
# 假设词典里效价列的名字是valence,词列是word fan_weights <- setNames(fan_dict$valence, fan_dict$word)
2. 预处理语料库并选择特征
接下来处理你的语料库,先转成Quanteda的语料库对象,再做特征筛选(比如去掉停用词、标点,只保留有用的实词):
library(quanteda) # 把你的文本数据转成Quanteda语料库(支持数据框或向量格式) my_corpus <- corpus(你的文本数据源) # 生成文档-特征矩阵,同时做基础清洗 dfm_obj <- dfm(my_corpus, remove_punct = TRUE, # 去掉标点符号 remove_symbols = TRUE, # 去掉特殊符号 remove_stopwords = TRUE, # 去掉法语停用词 tolower = TRUE) # 统一转小写,保证和词典词格式匹配
3. 计算加权情感分数&平均情感值
现在可以计算每篇文档的情感分数了,核心是用FAN的权重对匹配到的词做加权求和,再除以匹配到的词数得到平均值,这里给你两种方法:
方法一:用Quanteda内置函数更省心
# 匹配词典中的词,计算每篇文档的加权情感总和 sentiment_stats <- textstat_weighted(dfm_obj, weights = fan_weights) # 计算平均情感值:加权总和 ÷ 匹配到的有效词数 average_sentiment <- sentiment_stats$weighted_sum / sentiment_stats$n # 把结果和原文档绑定,方便后续分析 final_result <- data.frame(文档名称 = docnames(my_corpus), 平均效价 = average_sentiment)
方法二:手动计算更灵活(适合自定义逻辑)
# 只保留语料库中存在于FAN词典里的词 dfm_fan_match <- dfm_select(dfm_obj, pattern = names(fan_weights)) # 计算每篇文档的加权情感总和 weighted_total <- rowSums(dfm_fan_match * fan_weights[colnames(dfm_fan_match)]) # 统计每篇文档匹配到的FAN词数量 matched_word_count <- rowSums(dfm_fan_match) # 处理没有匹配到任何FAN词的文档(这里设为NA,你也可以改成0或全局平均值) average_sentiment <- ifelse(matched_word_count == 0, NA, weighted_total / matched_word_count) # 整理成易读的结果表 final_result <- data.frame(文档名称 = docnames(my_corpus), 平均效价 = average_sentiment)
一些实用小提醒
- 如果FAN词典包含多个情感维度(比如效价、唤醒度、支配度),可以分别为每个维度创建权重向量,重复上面的步骤就能得到各维度的平均分数。
- 预处理时一定要保证语料库的词和词典的词格式统一(比如都转小写),不然会出现大量匹配失败的情况。
- 对于没有匹配到任何FAN词的文档,你可以根据研究需求选择赋值:比如设为NA、0,或者用整个语料库的平均情感值填充。
内容的提问来源于stack exchange,提问作者Tristan G
相关产品推荐
相关产品推荐

