Module: Legion::Extensions::Apollo::Helpers::Similarity
- Defined in:
- lib/legion/extensions/apollo/helpers/similarity.rb
Class Method Summary collapse
- .above_corroboration_threshold?(similarity:) ⇒ Boolean
- .classify_match(similarity:, same_content_type: true, contradicts: false) ⇒ Object
- .cosine_similarity(vec_a:, vec_b:) ⇒ Object
- .log ⇒ Object
- .parse_vector(vec) ⇒ Object
Class Method Details
.above_corroboration_threshold?(similarity:) ⇒ 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 |
.log ⇒ Object
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.}") nil end |