在上一期博客中,我详细讲解了这个案例所需要安装的库并生成了词频统计以及云图,如果有需要可以参考上一期进行安装和尝试。
https://blog.csdn.net/zzy66666c/article/details/140600036?spm=1001.2014.3001.5502
情绪分析(一)
什么是情绪
情绪,是对一系列主观认知经验的通称,是人对客观事物的态度体验以及相应的行为反应,一般认为,情绪是以个体愿望和需要为中介的一种心理活动。
为什么要情绪分析
情绪分析(Sentiment Analysis),也称为情感分析或意见挖掘,是自然语言处理(NLP)领域中的一个重要任务,它旨在自动识别和提取文本中的主观信息,特别是人们对于实体、事件、主题等的情感倾向、观点、态度或情绪。以下是情绪分析之所以重要的几个主要原因:
商业智能与市场洞察:企业可以利用情绪分析来了解消费者对其产品或服务的态度,从而评估市场反馈,优化产品设计,改进客户服务,以及制定更有效的市场营销策略。例如,通过分析社交媒体上的用户评论,企业可以快速识别产品缺陷或市场趋势。
品牌声誉管理:情绪分析有助于企业监控其品牌在社交媒体、在线论坛、新闻网站等渠道上的声誉。通过实时跟踪提及品牌的情感倾向,企业可以及时发现并解决潜在的公关危机,维护品牌形象。
金融投资预测:在金融领域,情绪分析被用于分析投资者情绪,以预测市场走势。通过分析社交媒体上的投资者言论、新闻报道等,可以获取市场情绪的实时快照,为投资决策提供参考。
政策制定与公众意见:政府机构可以利用情绪分析来监测公众对政策、法规、社会事件等的反应,从而更准确地了解民意,为政策制定提供依据。这有助于政府提高决策的科学性和民主性。
学术研究:在心理学、社会学、政治学等领域,情绪分析为研究人类情感、态度、观点等提供了新的工具和方法。通过对大量文本数据的分析,研究人员可以揭示社会趋势、文化变迁等现象背后的情感驱动因素。
个性化推荐系统:在电商、新闻、社交媒体等领域,情绪分析可以用于优化个性化推荐系统。通过分析用户的情感偏好,系统可以更加精准地推荐符合用户兴趣和需求的内容或产品,提升用户体验和满意度。
情绪分析库cnsenti介绍
下载
pip install cnsenti -i https://pypi.tuna.tsinghua.edu.cn/simple/
情感分类
cnsenti库将情绪分为'好' '乐' '哀' '怒' '惧' '恶' '惊'七种
示例
from cnsenti import Sentiment
senti = Sentiment()
test_text= '我好开心啊,非常非常非常高兴!今天我得了一百分,我很兴奋开心,愉快,开心'
result = senti.sentiment_count(test_text)
print(result)
运行结果
{'words': 22,
'sentences': 2,
'好': 0,
'乐': 4,
'哀': 0,
'怒': 0,
'惧': 0,
'恶': 0,
'惊': 0}
依靠sentiment_count()这个方法,我们可以实现对文本的情感分析,
我写的微信聊天情绪分析代码示例
单文件分析
具体文件路径根据需要自行修改
import pandas as pd
from cnsenti import Emotion
# 初始化Emotion对象
emotion = Emotion()
# 初始化一个字典来跟踪每种情感的累计数量
emotion_counts = {
'好': 0,
'乐': 0,
'哀': 0,
'怒': 0,
'惧': 0,
'恶': 0,
'惊': 0
}
# 读取CSV文件
df_input = pd.read_csv('D:\\MemoTrace\\data\\messages.csv', encoding='utf-8') # 假设CSV文件名为'input.csv'
# 遍历CSV文件中的每一行
for index, row in df_input.iterrows():
text = row['StrContent'] # 假设文本存储在名为'text_column'的列中
if pd.notna(text): # 确保文本不是NA或空值
result = emotion.emotion_count(text)
# 更新情感字典中的计数
for emotion_type, count in result.items():
if emotion_type in emotion_counts:
emotion_counts[emotion_type] += count
# 将情感字典转换为DataFrame
results_df = pd.DataFrame.from_dict(emotion_counts, orient='index', columns=['count'])
results_df.reset_index(inplace=True)
results_df.columns = ['emotion', 'count']
# 将DataFrame写入新的CSV文件
results_df.to_csv('D:\\MemoTrace\\data\\all_emotion_summary.csv', index=False, encoding='utf-8')
多文件分析
from cnsenti import Emotion
import pandas as pd
import os
import re
# 初始化Sentiment对象
emotion = Emotion()
# 指定顶级目录
top_dir = 'D:\\MemoTrace\\data\\聊天记录'
# 遍历顶级目录下的所有文件夹
for subdir, dirs, files in os.walk(top_dir):
# 提取文件夹名(去除括号及其内容)
folder_name = os.path.basename(subdir)
clean_folder_name = re.sub(r'\(.*?\)', '', folder_name)
# 构造预期的CSV文件名
csv_file_name = f"{clean_folder_name}.csv"
# 检查该CSV文件是否存在于当前文件夹中
if csv_file_name in files:
# 读取CSV文件
csv_file_path = os.path.join(subdir, csv_file_name)
df_input = pd.read_csv(csv_file_path, encoding='utf-8')
# 初始化情感计数字典
emotion_counts = {
'好': 0,
'乐': 0,
'哀': 0,
'怒': 0,
'惧': 0,
'恶': 0,
'惊': 0
}
# 假设文本存储在名为'StrContent'的列中
if 'StrContent' in df_input.columns:
# 遍历CSV文件中的每一行
for index, row in df_input.iterrows():
text = row['StrContent']
if pd.notna(text):
result = emotion.emotion_count(text)
# 更新情感字典中的计数
for emotion_type, count in result.items():
if emotion_type in emotion_counts:
emotion_counts[emotion_type] += count
# 将情感字典转换为DataFrame
results_df = pd.DataFrame.from_dict(emotion_counts, orient='index', columns=['count'])
results_df.reset_index(inplace=True)
results_df.columns = ['emotion', 'count']
# 构造结果CSV文件的路径
results_csv_path = os.path.join(subdir, 'emotion_summary.csv')
# 将DataFrame写入新的CSV文件
results_df.to_csv(results_csv_path, index=False, encoding='utf-8')
如果需要根据isSender单独进行分析可以参考以下代码
from cnsenti import Emotion
import pandas as pd
import os
import re
# 初始化Sentiment对象
emotion = Emotion()
# 指定顶级目录
top_dir = 'D:\\MemoTrace\\data\\聊天记录'
# 遍历顶级目录下的所有文件夹
for subdir, dirs, files in os.walk(top_dir):
# 提取文件夹名(去除括号及其内容)
folder_name = os.path.basename(subdir)
clean_folder_name = re.sub(r'\(.*?\)', '', folder_name)
# 构造预期的CSV文件名
csv_file_name = f"{clean_folder_name}.csv"
# 检查该CSV文件是否存在于当前文件夹中
if csv_file_name in files:
# 读取CSV文件
csv_file_path = os.path.join(subdir, csv_file_name)
df_input = pd.read_csv(csv_file_path, encoding='utf-8')
# 初始化情感计数字典
emotion_counts = {
'好': 0,
'乐': 0,
'哀': 0,
'怒': 0,
'惧': 0,
'恶': 0,
'惊': 0
}
# 假设文本存储在名为'StrContent'的列中,且'IsSender'用于筛选
if 'StrContent' in df_input.columns and 'IsSender' in df_input.columns:
# 筛选IsSender为'0'的行
filtered_df = df_input[df_input['IsSender'] == 0]
# 遍历筛选后的DataFrame中的每一行
for index, row in filtered_df.iterrows():
text = row['StrContent']
if pd.notna(text):
result = emotion.emotion_count(text)
# 更新情感字典中的计数
for emotion_type, count in result.items():
if emotion_type in emotion_counts:
emotion_counts[emotion_type] += count
# 将情感字典转换为DataFrame
results_df = pd.DataFrame.from_dict(emotion_counts, orient='index', columns=['count'])
results_df.reset_index(inplace=True)
results_df.columns = ['emotion', 'count']
# 构造结果CSV文件的路径
results_csv_path = os.path.join(subdir, 'emotion_summary_where_isSender_0.csv')
# 将DataFrame写入新的CSV文件
results_df.to_csv(results_csv_path, index=False, encoding='utf-8')
如果需要统计某种情绪的比例可以参考以下代码
import pandas as pd
import os
# 指定顶级目录
top_dir = 'D:\\MemoTrace\\data\\聊天记录'
# 定义情绪计数字典
emotion_counts = {
'好': 0,
'乐': 0,
'哀': 0,
'怒': 0,
'惧': 0,
'恶': 0,
'惊': 0
}
# 遍历顶级目录下的所有文件夹
for subdir, dirs, files in os.walk(top_dir):
# 检查是否包含两种CSV文件
for is_sender in [0, 1]:
csv_file_name = f'emotion_summary_where_isSender_{is_sender}.csv'
if csv_file_name in files:
# 读取CSV文件
csv_file_path = os.path.join(subdir, csv_file_name)
df = pd.read_csv(csv_file_path, encoding='utf-8')
# 确保DataFrame中有必要的列
if 'emotion' in df.columns and 'count' in df.columns:
# 根据情绪类型累加计数
for emotion, count in zip(df['emotion'], df['count']):
if emotion in emotion_counts:
emotion_counts[emotion] += count
# 计算每种情绪的比例
total_count = sum(emotion_counts.values())
emotion_percentages = {emotion: (count / total_count if total_count > 0 else 0)
for emotion, count in emotion_counts.items()}
# 将比例转换为带有四位小数的字符串(注意:这通常不是推荐的做法,因为它会丢失DataFrame的灵活性)
emotion_percentages_str = {emotion: f"{percent:.4f}" for emotion, percent in
emotion_percentages.items()}
results_df = pd.DataFrame.from_dict(emotion_percentages_str, orient='index', columns=['percentage'])
# 现在results_df中的'percentage'列是字符串类型的,包含了四位小数
# 构造结果CSV文件的路径
results_csv_path = os.path.join(subdir, f'emotion_percentage_isSender_{is_sender}.csv')
# 写入CSV文件(注意:此时'percentage'列已经是字符串了)
results_df.to_csv(results_csv_path, index_label='emotion', encoding='utf-8',
float_format='%.4f') # float_format实际上不会在这里生效,因为它是字符串
# 重置情绪计数字典为初始状态(如果需要处理下一个文件)
emotion_counts = {
'好': 0,
'乐': 0,
'哀': 0,
'怒': 0,
'惧': 0,
'恶': 0,
'惊': 0
}
else:
print(f"缺少必要的列在文件: {csv_file_path}")
至此我们完成了七种情绪类别的分析
结果示例如下