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

Extended by:
JSON::Helper, Logging::Helper
Defined in:
lib/legion/extensions/apollo/helpers/similarity.rb

Class Method Summary collapse

Class Method Details

.above_corroboration_threshold?(similarity:) ⇒ Boolean

Returns:

  • (Boolean)


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

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

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



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

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



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

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

.parse_vector(vec) ⇒ Object



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

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

  json_parse(vec)
rescue StandardError => e
  handle_exception(e, level: :warn, operation: 'apollo.similarity.parse_vector')
  nil
end