Class: Stealth::Nlp::Luis::Result

Inherits:
Result
  • Object
show all
Defined in:
lib/stealth/nlp/luis/result.rb

Constant Summary collapse

ENTITY_MAP =
{
  'money' => :currency, 'number' => :number, 'email' => :email,
  'percentage' => :percentage, 'Calendar.Duration' => :duration,
  'geographyV2' => :geo, 'age' => :age, 'phonenumber' => :phone,
  'ordinalV2' => :ordinal, 'url' => :url, 'dimension' => :dimension,
  'temperature' => :temp, 'keyPhrase' => :key_phrase, 'name' => :name,
  'datetimeV2' => :datetime
}

Instance Method Summary collapse

Constructor Details

#initialize(result:) ⇒ Result

Returns a new instance of Result.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/stealth/nlp/luis/result.rb', line 17

def initialize(result:)
  @result = result
  if result.status.success?
    Stealth::Logger.l(
      topic: :nlp,
      message: 'NLP lookup successful'
    )
    parsed_result
  else
    Stealth::Logger.l(
      topic: :nlp,
      message: "NLP lookup FAILED: (#{result.status.code}) #{result.body.to_s}"
    )
  end
end

Instance Method Details

#entitiesObject



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/stealth/nlp/luis/result.rb', line 81

def entities
  return {} if raw_entities.blank?
  _entities = {}

  raw_entities.each do |type, values|
    if ENTITY_MAP[type]
      _entities[ENTITY_MAP[type]] = values
    else
      # A custom entity
      _entities[type.to_sym] = values
    end
  end

  _entities
end

#intentObject



69
70
71
# File 'lib/stealth/nlp/luis/result.rb', line 69

def intent
  top_intent&.to_sym
end

#intent_scoreObject



73
74
75
# File 'lib/stealth/nlp/luis/result.rb', line 73

def intent_score
  parsed_result&.dig('prediction', 'intents', top_intent, 'score')
end

#parsed_resultObject

Sample JSON result: {

"query": "I make between $5400 and $9600 per month",
"prediction": {
  "topIntent": "None",
  "intents": {
    "None": {
      "score": 0.5345857
    }
  },
  "entities": {
    "money": [
      {
        "number": 5400,
        "units": "Dollar"
      },
      {
        "number": 9600,
        "units": "Dollar"
      }
    ],
    "number": [
      5400,
      9600
    ]
  },
  "sentiment": {
    "label": "positive",
    "score": 0.7805586
  }
}

}



65
66
67
# File 'lib/stealth/nlp/luis/result.rb', line 65

def parsed_result
  @parsed_result ||= MultiJson.load(result.body.to_s)
end

#raw_entitiesObject



77
78
79
# File 'lib/stealth/nlp/luis/result.rb', line 77

def raw_entities
  parsed_result&.dig('prediction', 'entities')
end

#sentimentObject



101
102
103
# File 'lib/stealth/nlp/luis/result.rb', line 101

def sentiment
  parsed_result&.dig('prediction', 'sentiment', 'label')&.to_sym
end

#sentiment_scoreObject



97
98
99
# File 'lib/stealth/nlp/luis/result.rb', line 97

def sentiment_score
  parsed_result&.dig('prediction', 'sentiment', 'score')
end