Sha256: a19d867ea602a96eb9d83457598cc386132ff3622ebd86619110c62532a144a2

Contents?: true

Size: 1.77 KB

Versions: 11

Compression:

Stored size: 1.77 KB

Contents

module MESH
  class Classifier
    def classify(weighted_matches)

      weighted_headings = []
      weighted_matches.each do |wm|
        wm[:matches].each do |match|
          weighted_headings << [wm[:weight], match[:heading]]
        end
      end

      root_groups = {}
      weighted_headings.each do |weight, heading|
        heading.roots.each do |root|
          root_groups[root] ||= []
          root_groups[root] << [weight, heading]
        end
      end

      chosen = {}

      root_groups.each do |root, weighted_headings|
        scored = {}
        weighted_headings.each do |weight, heading|
          calculate_scores(scored, root, heading, weight)
        end
        scored.each { |h,s| scored[h] = s.round(3) }
        scored.delete_if { |h,s| s == 0 }
        best_score, best_connected = scored.reduce({}) { |h, (k, v)| (h[v] ||= []) << k; h }.max
        most_specific = best_connected.max_by { |h| h.deepest_position(root) }
        chosen[root] = [best_score, scored]
      end

      chosen

    end

    def calculate_scores(scored, root, heading, weight)
      scored[heading] ||= 0
      scored[heading] += weight
      heading.parents.each do |p|
        if p.roots.include? root
          calculate_scores(scored, root, p, weight / 3.0)
        end
      end
    end

    private

    def calculate_connections(root, headings, weight)
      connections = {}
      headings.each do |h|
        add_connection(connections, root, h, weight)
      end
      connections
    end

    def add_connection(connections, root, heading, weight)
      return unless heading.roots.include? root
      connections[heading] ||= 0
      connections[heading] += weight
      heading.parents.each do |p|
        connections[p] ||= 0
        connections[p] += weight
      end
    end

  end

end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
mesh-medical-subject-headings-3.0.0 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.3.0 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.2.1 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.2.0 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.1.0 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.0.6 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.0.5 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.0.4 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.0.3 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.0.2 lib/MESH/classifier.rb
mesh-medical-subject-headings-2.0.1 lib/MESH/classifier.rb