Class: SentimentInsights::Insights::KeyPhrases
- Inherits:
-
Object
- Object
- SentimentInsights::Insights::KeyPhrases
- Defined in:
- lib/sentiment_insights/insights/key_phrases.rb
Overview
Extracts and summarizes key phrases from survey responses
Instance Method Summary collapse
-
#extract(entries, question: nil, key_phrase_prompt: nil, sentiment_prompt: nil) ⇒ Hash
Extract key phrases and build a normalized, summarized output.
-
#initialize(provider: nil, provider_client: nil) ⇒ KeyPhrases
constructor
A new instance of KeyPhrases.
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
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 |