Module: RubyTestStudentGrader::Similarity

Defined in:
lib/ruby_test_student_grader/similarity.rb

Class Method Summary collapse

Class Method Details

.jaccard(text_a, text_b, k: 5) ⇒ Object

Calcula similitud de Jaccard sobre shingles de tokens simples. text_a, text_b: String k: tamaño de shingle (por defecto 5 tokens)



10
11
12
13
14
15
16
17
18
# File 'lib/ruby_test_student_grader/similarity.rb', line 10

def jaccard(text_a, text_b, k: 5)
  a = shingles(tokenize(text_a.to_s), k)
  b = shingles(tokenize(text_b.to_s), k)
  return 1.0 if a.empty? && b.empty?
  inter = (a & b).size.to_f
  union = (a | b).size.to_f
  return 0.0 if union.zero?
  (inter / union).round(4)
end

.shingles(tokens, k) ⇒ Object



24
25
26
27
# File 'lib/ruby_test_student_grader/similarity.rb', line 24

def shingles(tokens, k)
  return [] if tokens.size < k
  (0..tokens.size - k).map { |i| tokens[i, k].join(" ") }.uniq
end

.tokenize(text) ⇒ Object



20
21
22
# File 'lib/ruby_test_student_grader/similarity.rb', line 20

def tokenize(text)
  text.downcase.gsub(/[^a-z0-9_]+/, " ").split
end