基于Memotrace(留痕)、jieba、wordcloud、cnsenti的微信聊天记录分析(二)

在上一期博客中,我详细讲解了这个案例所需要安装的库并生成了词频统计以及云图,如果有需要可以参考上一期进行安装和尝试。

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}")

 

 至此我们完成了七种情绪类别的分析

结果示例如下

     

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值