Module: Legion::Extensions::Apollo::Helpers::Similarity

Defined in:
lib/legion/extensions/apollo/helpers/similarity.rb

Class Method Summary collapse

Class Method Details

.above_corroboration_threshold?(similarity:) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/legion/extensions/apollo/helpers/similarity.rb', line 39

def above_corroboration_threshold?(similarity:, **)
  similarity >= Confidence::CORROBORATION_SIMILARITY_THRESHOLD
end

.classify_match(similarity:, same_content_type: true, contradicts: false) ⇒ Object



43
44
45
46
47
48
49
# File 'lib/legion/extensions/apollo/helpers/similarity.rb', line 43

def classify_match(similarity:, same_content_type: true, contradicts: false, **)
  if above_corroboration_threshold?(similarity: similarity) && same_content_type
    contradicts ? :contradiction : :corroboration
  else
    :novel
  end
end

.cosine_similarity(vec_a:, vec_b:) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/legion/extensions/apollo/helpers/similarity.rb', line 16

def cosine_similarity(vec_a:, vec_b:, **)
  vec_a = parse_vector(vec_a)
  vec_b = parse_vector(vec_b)
  return 0.0 unless vec_a.is_a?(Array) && vec_b.is_a?(Array)

  dot = vec_a.zip(vec_b).sum { |x, y| x * y }
  mag_a = Math.sqrt(vec_a.sum { |x| x**2 })
  mag_b = Math.sqrt(vec_b.sum { |x| x**2 })
  return 0.0 if mag_a.zero? || mag_b.zero?

  dot / (mag_a * mag_b)
end

.logObject



12
13
14
# File 'lib/legion/extensions/apollo/helpers/similarity.rb', line 12

def log
  Legion::Logging
end

.parse_vector(vec) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/legion/extensions/apollo/helpers/similarity.rb', line 29

def parse_vector(vec)
  return vec if vec.is_a?(Array)
  return nil unless vec.is_a?(String)

  ::JSON.parse(vec)
rescue StandardError => e
  log.warn("Apollo Similarity.parse_vector failed: #{e.message}")
  nil
end