From a4440c507b2c551bd6e73a2382e386661f42e449 Mon Sep 17 00:00:00 2001 From: Keegan George Date: Thu, 12 Dec 2024 02:13:18 +0900 Subject: [PATCH] UX: Make sentiment trends more readable (#1018) Instead of a stacked chart showing a separate series for positive and negative, this PR introduces a simplification to the overall sentiment dashboard. It comprises the sentiment into a single series of the difference between `positive - negative` instead. This should allow for the data to be more easy to scan and look for trends --- config/locales/server.en.yml | 4 +-- lib/sentiment/sentiment_dashboard_report.rb | 29 ++++++++----------- .../lib/modules/sentiment/entry_point_spec.rb | 7 ++--- 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index dca9e309..ea8aeed7 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -400,9 +400,7 @@ en: sentiment: reports: - overall_sentiment: - positive: "Positive" - negative: "Negative" + overall_sentiment: "Overall sentiment (Positive - Negative)" post_emotion: sadness: "Sadness 😢" surprise: "Surprise 😱" diff --git a/lib/sentiment/sentiment_dashboard_report.rb b/lib/sentiment/sentiment_dashboard_report.rb index 1f2297df..3101126a 100644 --- a/lib/sentiment/sentiment_dashboard_report.rb +++ b/lib/sentiment/sentiment_dashboard_report.rb @@ -11,7 +11,7 @@ module DiscourseAi sentiment_count_sql = Proc.new { |sentiment| <<~SQL } COUNT( CASE WHEN (cr.classification::jsonb->'#{sentiment}')::float > :threshold THEN 1 ELSE NULL END - ) AS #{sentiment}_count + ) SQL grouped_sentiments = @@ -19,8 +19,7 @@ module DiscourseAi <<~SQL, SELECT DATE_TRUNC('day', p.created_at)::DATE AS posted_at, - #{sentiment_count_sql.call("positive")}, - -#{sentiment_count_sql.call("negative")} + #{sentiment_count_sql.call("positive")} - #{sentiment_count_sql.call("negative")} AS sentiment_count FROM classification_results AS cr INNER JOIN posts p ON p.id = cr.target_id AND cr.target_type = 'Post' @@ -32,28 +31,24 @@ module DiscourseAi cr.model_used = 'cardiffnlp/twitter-roberta-base-sentiment-latest' AND (p.created_at > :report_start AND p.created_at < :report_end) GROUP BY DATE_TRUNC('day', p.created_at) + ORDER BY 1 ASC SQL report_start: report.start_date, report_end: report.end_date, threshold: threshold, ) - data_points = %w[positive negative] - return report if grouped_sentiments.empty? - report.data = - data_points.map do |point| - { - req: "sentiment_#{point}", - color: point == "positive" ? report.colors[:lime] : report.colors[:purple], - label: I18n.t("discourse_ai.sentiment.reports.overall_sentiment.#{point}"), - data: - grouped_sentiments.map do |gs| - { x: gs.posted_at, y: gs.public_send("#{point}_count") } - end, - } - end + report.data = { + req: "overall_sentiment", + color: report.colors[:lime], + label: I18n.t("discourse_ai.sentiment.reports.overall_sentiment"), + data: + grouped_sentiments.map do |gs| + { x: gs.posted_at, y: gs.public_send("sentiment_count") } + end, + } end end end diff --git a/spec/lib/modules/sentiment/entry_point_spec.rb b/spec/lib/modules/sentiment/entry_point_spec.rb index 8cfc2e13..3b8f56c8 100644 --- a/spec/lib/modules/sentiment/entry_point_spec.rb +++ b/spec/lib/modules/sentiment/entry_point_spec.rb @@ -77,11 +77,8 @@ RSpec.describe DiscourseAi::Sentiment::EntryPoint do sentiment_classification(pm, positive_classification) report = Report.find("overall_sentiment") - positive_data_point = report.data[0][:data].first[:y].to_i - negative_data_point = report.data[1][:data].first[:y].to_i - - expect(positive_data_point).to eq(1) - expect(negative_data_point).to eq(-1) + overall_sentiment = report.data[:data][0][:y].to_i + expect(overall_sentiment).to eq(0) end end