在前几期中,我们已经介绍了文本分析的基础知识,预处理的方法以及主题模型的实现方法。
R语言心理学与管理学文本分析入门指南--第二期:文本的预处理
情感分析(Sentiment Analysis),又称情感分类(Opinion Mining),是自然语言处理(NLP)领域中的一个重要任务。其目标是从文本数据中提取和分析作者表达的主观情感、态度和情绪。情感分析通过对文本中的情感词汇、语法结构和语境信息进行识别和分类,来判断文本的情感倾向,如正面、负面或中性。情感分析不仅限于情感的极性分类,还可以深入分析更具体的情感类别,如愤怒、快乐、悲伤、惊讶等。
在市场调研中,情感分析可以帮助企业深入了解消费者对产品或服务的反馈和评价,从而优化产品设计和提升客户满意度。
在社交媒体中,情感分析被广泛用于监测公众舆论,帮助政府和企业及时了解和应对公众的态度和情感变化,管理品牌声誉。
在企业管理中,情感分析可以评估员工反馈,了解员工的工作满意度和心理状态,从而改善企业管理和员工福利政策。
2.1 基于极性分类的情感分析
2.2 基于情感类别的分析
2.3 基于目标的情感分析
3.1 心理健康监测
情感分析在心理健康监测中发挥着重要作用。通过分析社交媒体上的语言使用模式,研究者能够识别出抑郁症患者的特征语言。例如,抑郁症患者往往使用更多的负面情感词汇,如“悲伤”、“绝望”等,以及更多的自我指涉词汇,如“我”、“我的”。这些语言特征反映了他们的内心状态和情感体验(Choudhury et al., 2013)。情感分析技术可以自动化地分析大量的社交媒体文本,从中提取出潜在的心理健康问题。这种方法不仅节省了时间和人力成本,还能够实时监测心理健康状况,有助于早期检测和干预,从而避免心理问题的恶化。作者认为,通过这种方式,可以为心理健康提供一种新的、有效的监测手段,促进公众心理健康的改善。
3.2 人格特质研究
情感分析也广泛应用于人格特质研究,特别是语言使用与人格特质之间的关系研究。例如,Yarkoni(2010)通过分析博客中的语言,验证了大五人格模型与语言使用的相关性。研究发现,外向型人格的博主倾向于使用更多的积极情感词汇,如“快乐”、“兴奋”等,而神经质人格的博主则更多使用负面情感词汇,如“焦虑”、“不安”等。这种研究方法不仅能够揭示不同人格特质与语言使用之间的关联,还能够通过情感分析预测个体的人格特质。情感分析为人格心理学提供了一种新的研究工具,能够从海量的文本数据中提取有价值的信息,帮助研究者更好地理解人格特质的表达方式和影响因素。
3.3 社会心理学研究
在社会心理学研究中,情感分析同样具有重要的应用价值。例如,一项研究分析了2019年西班牙大选期间的政治推文,通过情感分析揭示了不同政治党派及其领导人的情感倾向和观点分布。研究者收集了大选前后几周内涉及政治党派及其领导人的数千条推文,应用统计和非线性嵌入方法提取了推文中的非线性特征并对情感动态进行了分析。结果显示,各政党及其领导人的情感动态和极性在选举期间有显著变化,且这些变化与政党的政治光谱位置、地区或国家层面的存在以及其民族主义或全球主义的愿望相关联(Rodríguez-Ibáñez et al., 2021)。
情感分析主要用于识别和提取文本中的情感和情绪。它通常分为两种主要方法:机器学习法和字典法。机器学习是最广泛使用的方法。它依靠机器学习算法和语言特征来进行情绪分类。基于词典的方法使用情绪词典,它代表通常用于表达积极或消极情绪的单词和短语列表。
4.1 机器学习法
机器学习法使用分类算法根据标注数据训练模型来进行情感分析。常用的算法包括朴素贝叶斯、支持向量机(SVM)和深度学习模型等。机器学习法的优点在于可以处理复杂的上下文关系,能够适应领域特定的词汇和表达。但其缺点在于需要大量标注数据进行训练以获得良好的表现,训练过程可能较为复杂。同时,在特定数据集上训练的分类器应用于另一个领域时,其往往无法表现得一样优秀。
4.2 字典法(Lexicon-based Approach)
当缺乏现成的情感词典时,可以使用以下三种方法创建和注释情感词典:
3. 基于语料库的方法:与基于词典的方法不同,基于语料库的方法从具有预先知道倾向的种子情绪词列表开始,并利用句法或共现模式在大型语料库中查找具有其倾向的新情绪词。其他情绪词的识别使用连接词的语言约束或惯例(例如,AND、OR、BUT)。例如,一对由连词连接的形容词(例如,“简单和容易”)通常具有相同的倾向。除了这种称为情绪一致性的想法(尽管在实践中并不总是一致的)之外,还可以为这些连接词设计一组规则。在此过程结束时,可以应用聚类等多种技术来构建情绪词集(例如正面词和负面词)。
来源:Birjali等(2021)
情感分析实现中需要注意的问题
在实现情感分析时,存在一些需要特别注意的问题和挑战。以下是几个关键点:
1. 情感分析中的第一个挑战源于情感词典的局限性
常用的情感词典往往是基于特定的领域或文化所构建的。在使用这些词典进行情感分析时就会受到领域特异性和语言文化差异对分析结果的影响。在领域特异性方面,由于大多数情感分析方法依赖于预定义的情感词典,这些词典可能在特定领域(如医学、金融、法律等)中的表现不佳。某些领域的术语可能不在词典中,从而影响分析结果的准确性。针对这一问题,笔者建议谨慎选择适合研究主题的情感词典以提高分析结果的准确性。如在进行金融领域情感分析时,可以考虑使用L-M金融词典展开分析。另一方面,情感词典也存在语言和文化差异。情感词典通常针对特定语言开发,不同语言或方言可能会有不同的情感表达方式。另外,不同文化背景的人对同一词汇的情感感受可能不同。因此,在分析不同语言的文本时,需要考虑到语言的差异。例如,当分析中文金融文本时,由于中文年报和英文年报在用词,表达方面有较大差异,不能直接简单地将英文词典进行翻译后套用在中文年报上。这里可以借鉴谢德仁和林乐(2015),汪昌云和武佳(2015)中的方法,使用L-M词典,但进行手工筛选,同时进行了适用于中文用词习惯和语境的翻译工作。
2. 情感分析的第二个挑战来自于上下文理解
在文本中存在多义词和歧义以及语境依赖性的问题。单词在不同上下文中的情感意义可能不同,存在多义词和歧义的问题。例如,"sick"在某些情况下可能表示负面情感(如"生病"),但在其他情况下可能表示正面情感(如"酷炫")。另一个限制在于语境依赖性。情感往往依赖于句子或段落的上下文,而简单的情感分析模型有可能无法充分理解这种依赖性,导致情感极性判断错误。Wang等(2020)提出了一种基于知识的方法,该方法依赖于著名的词典WordNet来解决这一具有挑战性的任务。该方法分别使用潜在语义分析(LSA)和PageRank对给定句子背后隐藏的语义空间和语义路径的歧义问题进行建模。
3. 情感分析的第三方面的挑战在于复合句和(双重)否定
如果处理包含多个情感倾向的复合句时,模型可能难以准确评估每个部分的情感并给出一个整体的情感得分。而处理诸如not、neither、nor等否定词对于情感分析也非常重要,因为它们可以反转给定文本的极性。在更复杂的存在双重否定的情况下,情感分析可能得出有偏差的结论。例如,句子“我不认为这不好”实际上是正面情感,但基于简单规则的模型可能会错误判断为负面情感。针对这一问题,Lazib等(2020)结合了bi- LSTM和CNN提出了一种基于句法路径的混合神经网络来检测否定范围。
4. 情感分析的第四个挑战在于讽刺和反语
当情绪分析中存在讽刺时,例如当某人写了一些积极的东西但实际上他想表达的是消极的意思或反之亦然时,这使得情绪分析的任务更加复杂。大多数情感分析工具难以识别这种隐含的情感,导致结果与实际情感倾向相悖。针对这一问题,Ren等(2018,2020)开发利用CNN等机器学习的方法来识别。Jain等(2020)使用深度学习对英语与印度语(Hinglish)混合语中的讽刺进行实时检测。他们提出的模型是双向LSTM与softmax注意力层和卷积神经网络的混合,取得了较好的效果。近年来,也有学者也尝试使用LLM(大语言模型)解决这个问题。然而近期的研究显示LLMs在较为简单的情感分析任务中表现良好,但在处理复杂任务时(如讽刺、反语等隐含情感表达),它们的表现可能还不如专门训练的小型语言模型(SLMs)(Zhang et al., 2023)。文献指出,LLMs在处理需要更深理解或结构化情感信息的任务时存在不足,特别是在处理如讽刺和反语等细致的情感表达时,它们仍然表现出较大的局限性。
5. 数据预处理对情感分析结果的影响
实现情感分析的R语言包
6.1 syuzhet包
# 如果还没有安装syuzhet包,请首先安装它
install.packages("syuzhet")
# 加载syuzhet包
library(syuzhet)
# 示例文本
text <- c("I am happy with the service.",
"The product quality is terrible.",
"This is the best day of my life!",
"I am not satisfied with the customer support.",
"The food was amazing, but the service was awful.")
# 打印示例文本
print(text)
# 获取情感分数
sentiment_scores <- get_nrc_sentiment(text)
# 打印情感分数
print(sentiment_scores)
# 获取每个句子的正负情感分数
sentiment_sentence <- get_sentiment(text, method = "syuzhet")
# 打印情感分数向量
print(sentiment_sentence)
# 绘制情感时间序列图
plot(sentiment_sentence, type = "l", main = "Sentiment Time Series",
xlab = "Sentence", ylab = "Sentiment")
6.2 RSentiment包
RSentiment包使用词性 (PoS) 标记来标记句子中的每个单词。该包会检查是否有任何副词或形容词在任何负量词(如“not”、“no”、 “none”和“never”)后面,并据此为其分配分数。
该包提供了三个可用于对文本进行评分的函数:
calculate_score(),计算文本的分数; calculate_sentiment(),将句子或文本分类到情绪类别中; calculate_custom_total_presence_sentiment(),返回每个情绪类别中的句子总数。
分数以正数或负数提供,报告在文本中找到的正词和负词数量的代数和(因此每个正词的分数为 1,每个负词的分数为 -1)。例如,句子“这个设备很好”、“这个设备非常好”、“这个设备非常非常好”和“这个设备很好但不好”的得分分别为 1、2、3 和 0。
# 加载RSentiment包
library(Rsentiment)
# 示例文本
text <- c("I love this product!",
"The service was terrible.",
"I am very happy with the purchase.",
"This is a bad experience.",
"I have no strong feelings about this.")
# 打印示例文本
print(text)
# 对每个句子进行情感分析
sentiment_results <- sapply(text, calculate_sentiment)
# 打印情感分析结果
print(sentiment_results)
6.3 sentimentr
# 如果还没有安装sentimentr包,请首先安装它
install.packages("sentimentr")
# 加载sentimentr包
library(sentimentr)
# 示例文本
text <- c("I love this product! It's absolutely wonderful.",
"I hate the customer service. It was very disappointing.",
"This is the best experience I've ever had.",
"The movie was okay, but it could have been better.",
"I'm so frustrated with the delays and poor quality.")
# 打印示例文本
print(text)
# 计算情感得分
sentiment_scores <- sentiment(text)
# 打印情感得分
print(sentiment_scores)
# 按句子汇总情感得分
sentiment_summary <- sentiment_by(text)
# 打印情感汇总
print(sentiment_summary)
# 可视化情感得分
plot(sentiment_summary)
6.4 SentimentAnalysis包
SentimentAnalysis包允许使用几个现有的专业词典,也可以创建新的词典。默认词典为:
哈佛大学开发的心理学哈佛IV词典 (GI); 亨利的金融专用词典:包含正面和负面词的列表,可通过loadDictionaryHE()函数检索。它非常小,只包含53个正面词和44个负面词; Loughran-McDonald金融专用词典:包含积极、消极和不确定词汇列表,以及诉讼词汇和情态词汇。可以通过loadDictionaryLM()函数检索。它包含145个积极词汇和885个消极词汇; QDAP 词典:qdap 包中包含的积极和消极词汇列表。它包含1280个积极词汇和2952个消极词汇。可以通过loadDictionaryQ-DAP()函数检索。
# 如果还没有安装SentimentAnalysis包,请首先安装它
install.packages("SentimentAnalysis")
# 加载SentimentAnalysis包
library(SentimentAnalysis)
# 示例文本
text <- c("I love this product! It works great.",
"This is the worst purchase I've ever made.",
"I'm extremely happy with the service.",
"The quality is terrible and I regret buying it.",
"Absolutely fantastic! Exceeded my expectations.")
# 打印示例文本
print(text)
# 分析情感
sentiment_results <- analyzeSentiment(text)
# 打印情感分析结果
print(sentiment_results)
# 提取极性分数
polarity_scores <- sentiment_results$SentimentQDAP
# 提取情感分类结果(Positive, Neutral, Negative)
classification <- convertToBinaryResponse(sentiment_results$SentimentQDAP)
# 打印极性分数
print(polarity_scores)
# 打印情感分类结果
print(classification)
# 统计正面和负面情感的数量
table(classification)
# 可视化情感分数分布
hist(polarity_scores, main = "Distribution of Sentiment Polarity Scores",
xlab = "Sentiment Polarity Score", ylab = "Frequency", col = "lightblue")
#sentiment_results返回的结果包括情感极性分数(SentimentQDAP)和其他相关的情感度量。
#polarity_scores显示了每个句子的情感极性得分,正值通常表示积极情感,负值表示消极情感。
#classification将情感极性得分分类为“正面”或“负面”。
Choudhury, M. D., Counts, S., & Horvitz, E. (2013). Social media as a measurement tool of depression in populations. Proceedings of the 5th Annual ACM Web Science Conference, 47-56.
Hong, Y., Kwak, H., Baek, Y., & Moon, S. (2013, May). Tower of babel: A crowdsourcing game building sentiment lexicons for resource-scarce languages. In Proceedings of the 22nd International Conference on World Wide Web (pp. 549-556).
Jain, D., Kumar, A., & Garg, G. (2020). Sarcasm detection in mash-up language using soft-attention based bi-directional LSTM and feature-rich CNN. Applied Soft Computing, 91, 106198.
Lazib, L., Qin, B., Zhao, Y., Zhang, W., & Liu, T. (2020). A syntactic path-based hybrid neural network for negation scope detection. Frontiers of computer science, 14, 84-94.
Liu, B. (2012). Sentiment analysis and opinion mining. Morgan & Claypool Publishers.
Lwin, M. O., Lu, J., Sheldenkar, A., Schulz, P. J., Shin, W., Gupta, R., & Yang, Y. (2020). Global Sentiments Surrounding the COVID-19 Pandemic on Twitter: Analysis of Twitter Trends. JMIR Public Health and Surveillance, 6(2), e19447. https://doi.org/10.2196/19447
Mohammad, S. M., & Turney, P. D. (2013). Crowdsourcing a word–emotion association lexicon. Computational intelligence, 29(3), 436-465.
Naldi, M. (2019). A review of sentiment computation methods with R packages. arXiv preprint arXiv:1901.08319.
Oscar, N., Fox, P. A., Croucher, R., Wernick, R., Keune, J., & Hooker, K. (2017). Machine Learning, Sentiment Analysis, and Tweets: An Examination of Alzheimer’s Disease Stigma on Twitter. The Journals of Gerontology: Series B, 72(5), 742-751. doi:10.1093/geronb/gbx014
Ren, L., Xu, B., Lin, H., Liu, X., & Yang, L. (2020). Sarcasm detection with sentiment semantics enhanced multi-level memory network. Neurocomputing, 401, 320-326.
Ren, Y., Ji, D., & Ren, H. (2018). Context-augmented convolutional neural networks for twitter sarcasm detection. Neurocomputing, 308, 1-7.
Rodríguez-Ibáñez, M., Gimeno-Blanes, F., Cuenca-Jiménez, P., Soguero-Ruíz, C., & Rojo-álvarez, J. (2021). Sentiment Analysis of Political Tweets From the 2019 Spanish Elections. IEEE Access, 9, 101847-101862. https://doi.org/10.1109/ACCESS.2021.3097492.
Valdivia, A., Luzón, M. V., & Herrera, F. (2017). Sentiment Analysis in TripAdvisor. IEEE Intelligent Systems, 32(4), 72-77. https://doi.org/10.1109/MIS.2017.3121555
Wang, Y., Wang, M., & Fujita, H. (2020). Word sense disambiguation: A comprehensive knowledge exploitation framework. Knowledge-Based Systems, 190, 105030.
Yarkoni, T. (2010). Personality in 100,000 words: A large-scale analysis of personality and word use among bloggers. Journal of Research in Personality, 44(3), 363-373.
Zhang, W., Deng, Y., Liu, B., Pan, S., & Bing, L. (2023). Sentiment Analysis in the Era of Large Language Models: A Reality Check. ArXiv, abs/2305.15005. https://doi.org/10.48550/arXiv.2305.15005.
谢德仁, 林乐. (2015). 管理层语调能预示公司未来业绩吗?——基于我国上市公司年度业绩说明会的文本分析. 会计研究, (2), 20-27.
汪昌云, 武佳薇. (2015). 媒体语气,投资者情绪与 IPO 定价. 金融研究, 423(9), 174-189.
排版:代新宇