Class: SentimentInsights::Insights::KeyPhrases

Inherits:
Object
  • Object
show all
Defined in:
lib/sentiment_insights/insights/key_phrases.rb

Overview

Extracts and summarizes key phrases from survey responses

Instance Method Summary collapse

Constructor Details

#initialize(provider: nil, provider_client: nil) ⇒ KeyPhrases

Returns a new instance of KeyPhrases.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/sentiment_insights/insights/key_phrases.rb', line 10

def initialize(provider: nil, provider_client: nil)
  effective_provider = provider || SentimentInsights.configuration&.provider || :sentimental

  @provider_client = provider_client || case effective_provider
                                        when :openai
                                          Clients::KeyPhrases::OpenAIClient.new
                                        when :claude
                                          Clients::KeyPhrases::ClaudeClient.new
                                        when :aws
                                          Clients::KeyPhrases::AwsClient.new
                                        when :sentimental
                                          raise NotImplementedError, "Key phrase extraction is not supported for the 'sentimental' provider"
                                        else
                                          raise ArgumentError, "Unsupported provider: #{effective_provider}"
                                        end
end

Instance Method Details

#extract(entries, question: nil, key_phrase_prompt: nil, sentiment_prompt: nil) ⇒ Hash

Extract key phrases and build a normalized, summarized output

Parameters:

  • entries (Array<Hash>)

    each with :answer and optional :segment

  • question (String, nil) (defaults to: nil)

    optional context

Returns:

  • (Hash)

    { phrases: […], responses: […] }



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/sentiment_insights/insights/key_phrases.rb', line 31

def extract(entries, question: nil, key_phrase_prompt: nil, sentiment_prompt: nil)
  entries = entries.to_a
  raw_result = @provider_client.extract_batch(entries, question: question, key_phrase_prompt: key_phrase_prompt, sentiment_prompt: sentiment_prompt)

  responses = raw_result[:responses] || []
  phrases  = raw_result[:phrases] || []
  puts "phrases = #{phrases}"

  puts "responses = #{responses}"
  # Index responses by id for lookup
  response_index = {}
  responses.each do |r|
    response_index[r[:id]] = r
  end

  enriched_phrases = phrases.map do |phrase_entry|
    mentions = phrase_entry[:mentions] || []
    mention_responses = mentions.map { |id| response_index[id] }.compact

    sentiment_dist = Hash.new(0)
    segment_dist = Hash.new { |h, k| h[k] = Hash.new(0) }

    mention_responses.each do |resp|
      sentiment = resp[:sentiment] || :neutral
      sentiment_dist[sentiment] += 1

      (resp[:segment] || {}).each do |seg_key, seg_val|
        segment_dist[seg_key][seg_val] += 1
      end
    end

    {
      phrase: phrase_entry[:phrase],
      mentions: mentions,
      summary: {
        total_mentions: mentions.size,
        sentiment_distribution: {
          positive: sentiment_dist[:positive],
          negative: sentiment_dist[:negative],
          neutral:  sentiment_dist[:neutral]
        },
        segment_distribution: segment_dist
      }
    }
  end

  SentimentInsights::Export::Result.wrap({
    phrases: enriched_phrases,
    responses: responses
  })
end