import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np def plot_emotion_confusion_matrix(results_df, emotion_columns): correct_count = {emotion: 0 for emotion in emotion_columns} incorrect_count = {emotion: 0 for emotion in emotion_columns} undefined_count = {emotion: 0 for emotion in emotion_columns} for idx, row in results_df.iterrows(): true_emotions = set(row['true emotions'].split()) if isinstance(row['true emotions'], str) else set() predicted_emotions = set(row['predict emotions'].split()) if isinstance(row['predict emotions'], str) else set() for emotion in emotion_columns: if emotion in true_emotions and emotion in predicted_emotions: correct_count[emotion] += 1 elif emotion in predicted_emotions and emotion not in true_emotions: incorrect_count[emotion] += 1 elif emotion in true_emotions and emotion not in predicted_emotions: undefined_count[emotion] += 1 data = [] for emotion in emotion_columns: data.append([ correct_count[emotion], incorrect_count[emotion], undefined_count[emotion] ]) heatmap_df = pd.DataFrame(data, columns=["Correctly Identified", "Incorrectly Identified", "Undefined"], index=emotion_columns) num_examples = len(results_df) plt.figure(figsize=(10, 12)) sns.heatmap(heatmap_df, annot=True, cmap="Blues", fmt="d", cbar=False) plt.title(f"Emotion Prediction Confusion Matrix (Examples: {num_examples})") plt.xlabel("Prediction Status") plt.ylabel("Emotion") plt.xticks(rotation=45, ha="right") plt.tight_layout() plt.show() def plot_true_emotion_frequency(results_df, emotion_columns): true_emotion_count = {emotion: 0 for emotion in emotion_columns} for idx, row in results_df.iterrows(): true_emotions = set(row['true emotions'].split()) if isinstance(row['true emotions'], str) else set() for emotion in emotion_columns: if emotion in true_emotions: true_emotion_count[emotion] += 1 data = [] for emotion in emotion_columns: data.append([true_emotion_count[emotion]]) heatmap_df = pd.DataFrame(data, columns=["True Emotion Count"], index=emotion_columns) plt.figure(figsize=(10, 12)) sns.heatmap(heatmap_df, annot=True, cmap="YlGnBu", fmt="d", cbar=False) plt.title(f"True Emotion Frequency (Examples: {len(results_df)})") plt.xlabel("True Emotion Count") plt.ylabel("Emotion") plt.xticks(rotation=45, ha="right") plt.tight_layout() plt.show() def plot_predicted_emotion_frequency(results_df, emotion_columns): predicted_emotion_count = {emotion: 0 for emotion in emotion_columns} for idx, row in results_df.iterrows(): predicted_emotions = set(row['predict emotions'].split()) if isinstance(row['predict emotions'], str) else set() for emotion in emotion_columns: if emotion in predicted_emotions: predicted_emotion_count[emotion] += 1 data = [] for emotion in emotion_columns: data.append([predicted_emotion_count[emotion]]) heatmap_df = pd.DataFrame(data, columns=["Predicted Emotion Count"], index=emotion_columns) plt.figure(figsize=(10, 12)) sns.heatmap(heatmap_df, annot=True, cmap="YlOrRd", fmt="d", cbar=False) plt.title(f"Predicted Emotion Frequency (Examples: {len(results_df)})") plt.xlabel("Predicted Emotion Count") plt.ylabel("Emotion") plt.xticks(rotation=45, ha="right") plt.tight_layout() plt.show() csv_path = "RuBert-tiny2-EmotionsDetected/Dstasets/Emotions_detected.csv" results_df = pd.read_csv(csv_path) emotion_columns = [ "admiration", "amusement", "anger", "annoyance", "approval", "caring", "confusion", "curiosity", "desire", "disappointment", "disapproval", "disgust", "embarrassment", "excitement", "fear", "gratitude", "grief", "joy", "love", "nervousness", "optimism", "pride", "realization", "relief", "remorse", "sadness", "surprise", "neutral" ] plot_true_emotion_frequency(results_df, emotion_columns) plot_predicted_emotion_frequency(results_df, emotion_columns) plot_emotion_confusion_matrix(results_df, emotion_columns)