class FamilyReunion::FuzzyMatcher

Public Class Methods

new(family_reunion) click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 5
def initialize(family_reunion)
  @fr = family_reunion
  @tw = FamilyReunion::TaxamatchWrapper.new
end

Public Instance Methods

get_synonym_to_synonym_matches() click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 39
def get_synonym_to_synonym_matches
  primary_names = @fr.primary_synonyms_set - @fr.secondary_synonyms_set
  secondary_names = @fr.secondary_synonyms_set - @fr.primary_synonyms_set
  make_match(primary_names, secondary_names, :synonym, :synonym)
end
get_synonym_to_valid_matches() click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 33
def get_synonym_to_valid_matches
  primary_names = @fr.primary_synonyms_set - @fr.secondary_valid_names_set
  secondary_names = @fr.secondary_valid_names_set - @fr.primary_synonyms_set
  make_match(primary_names, secondary_names, :synonym, :valid_name)
end
get_valid_matches() click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 21
def get_valid_matches
  primary_names = @fr.primary_valid_names_set - @fr.secondary_valid_names_set
  secondary_names = @fr.secondary_valid_names_set - @fr.primary_valid_names_set
  make_match(primary_names, secondary_names, :valid_name, :valid_name)
end
get_valid_to_synonym_matches() click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 27
def get_valid_to_synonym_matches
  primary_names = @fr.primary_valid_names_set - @fr.secondary_synonyms_set
  secondary_names = @fr.secondary_synonyms_set - @fr.primary_valid_names_set
  make_match(primary_names, secondary_names, :valid_name, :synonym)
end
merge() click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 10
def merge
  FamilyReunion.logger_write(@fr.object_id, "Merging fuzzy matches of accepted names")
  add_matches(get_valid_matches, :fuzzy_valid_to_valid)
  FamilyReunion.logger_write(@fr.object_id, "Merging fuzzy matches of accepted names to synonyms")
  add_matches(get_valid_to_synonym_matches, :fuzzy_valid_to_synonym)
  FamilyReunion.logger_write(@fr.object_id, "Merging fuzzy matches of synonyms to accepted names")
  add_matches(get_synonym_to_valid_matches, :fuzzy_synonym_to_valid)
  FamilyReunion.logger_write(@fr.object_id, "Merging fuzzy matches of synonyms")
  add_matches(get_synonym_to_synonym_matches, :fuzzy_synonym_to_synonym)
end

Private Instance Methods

add_matches(matched_nodes, merge_type) click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 47
def add_matches(matched_nodes, merge_type)
  matched_nodes.each do |primary_node, secondary_nodes|
    primary_id = primary_node[:id].to_s.to_sym
    secondary_ids = secondary_nodes.map { |n| n[:id].to_s.to_sym }
    secondary_id_matches = format_secondary_id_for_merge(secondary_ids, merge_type)
    add_record_to_merges(primary_id, secondary_id_matches)
  end
end
append_nodes(nodes, primary_nodes, secondary_nodes) click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 75
def append_nodes(nodes, primary_nodes, secondary_nodes)
  secondary_nodes = secondary_nodes.flatten.uniq
  primary_nodes.each do |primary_node|
    nodes << [primary_node, secondary_nodes]
  end
end
get_nodes_from_canonicals(canonical_matches, primary_name_type, secondary_name_type) click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 63
def get_nodes_from_canonicals(canonical_matches, primary_name_type, secondary_name_type)
  res = []
  canonical_matches.each do |primary_name, secondary_names|
    primary_nodes = self.send("get_#{primary_name_type}_node", @fr.primary_node, primary_name)
    secondary_nodes = secondary_names.map do |secondary_name|
      self.send("get_#{secondary_name_type}_node", @fr.secondary_node, secondary_name)
    end
    append_nodes(res, primary_nodes, secondary_nodes)
  end
  res
end
get_synonym_node(top_node, name) click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 88
def get_synonym_node(top_node, name)
  nodes = top_node.synonyms_hash[name]
  nodes.each do |n|
    synonym_name = n[:synonyms].select { |s| s[:canonical_name] == name }.first[:name]
    n.merge!({ :name_to_match => synonym_name })
  end
end
get_valid_name_node(top_node, name) click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 82
def get_valid_name_node(top_node, name)
  node = top_node.valid_names_hash[name]
  node.merge!({ :name_to_match => node[:valid_name][:name] })
  [node]
end
make_match(primary_names, secondary_names, primary_name_type, secondary_name_type) click to toggle source
# File lib/family-reunion/fuzzy_matcher.rb, line 57
def make_match(primary_names, secondary_names, primary_name_type, secondary_name_type)
  canonical_matches = @tw.match_canonicals_lists(primary_names, secondary_names)
  match_nodes_candidates = get_nodes_from_canonicals(canonical_matches, primary_name_type, secondary_name_type)
  @tw.match_nodes(match_nodes_candidates)
end