class Deviner::Match

Public Class Methods

new(weight=nil, options={}) click to toggle source
# File lib/deviner/match.rb, line 8
def initialize(weight=nil, options={})
  @weights=weight
  self.options.merge(options)
end

Public Instance Methods

cache() click to toggle source
# File lib/deviner/match.rb, line 80
def cache
  @cache||={}
end
clear_cache() click to toggle source
# File lib/deviner/match.rb, line 84
def clear_cache
  @cache={}
end
constrains(key) click to toggle source
# File lib/deviner/match.rb, line 14
def constrains key
  if @weights.present?
    return {weight: Picky::Weights::Constant.new(@weights[key].to_i)}
  else
    return {weight: Weights::Constant.new()}
  end
end
index(model, keys) click to toggle source
# File lib/deviner/match.rb, line 32
def index(model, keys)
  myoptions = options
  myconstrains = proc {|e| constrains(e) }
  index = Picky::Index.new :model do
    indexing stems_with: Lingua::Stemmer.new(language: myoptions[:language]),
             substitutes_characters_with: Picky::CharacterSubstituters::WestEuropean.new,
             stopwords: myoptions[:stopwords],
             splits_text_on: myoptions[:split_text_on],
             rejects_token_if: lambda { |token| token.size < myoptions[:minimal_token_size] }

    for key in keys
      category key, myconstrains.call(key)
    end
  end
  index.add model
  index
end
match(categories) click to toggle source

Return nil if no matches found

# File lib/deviner/match.rb, line 58
def match(categories)
  result = []
  for category in categories
      score = score(category)
      result << {value: score,  category: category}
  end

  highest_value = result.map{|x| x[:value]}.sort.last
  selected_category = nil
  if highest_value > 0
    result.each do |hash|
      if hash[:value] == highest_value
        selected_category = hash[:category]
      end
    end
  end

  return selected_category

end
model(model, keys) click to toggle source
# File lib/deviner/match.rb, line 50
def model(model, keys)
  @index = index(model, keys)
  @keys = keys
  clear_cache
end
options() click to toggle source
# File lib/deviner/match.rb, line 22
def options
  {language: 'de',
   query_method: :name,
   parent_method: :category,
   stopwords: /\b(aber|alle|allem|allen|aller|alles|als|also|am|an|ander|andere|anderem|anderen|anderer|anderes|anderm|andern|anderr|anders|auch|auf|aus|bei|bin|bis|bist|da|damit|dann|der|den|des|dem|die|das|daß|dass|derselbe|derselben|denselben|desselben|demselben|dieselbe|dieselben|dasselbe|dazu|dein|deine|deinem|deinen|deiner|deines|denn|derer|dessen|dich|dir|du|dies|diese|diesem|diesen|dieser|dieses|doch|dort|durch|ein|eine|einem|einen|einer|eines|einig|einige|einigem|einigen|einiger|einiges|einmal|er|ihn|ihm|es|etwas|euer|eure|eurem|euren|eurer|eures|für|gegen|gewesen|hab|habe|haben|hat|hatte|hatten|hier|hin|hinter|ich|mich|mir|ihr|ihre|ihrem|ihren|ihrer|ihres|euch|im|in|indem|ins|ist|jede|jedem|jeden|jeder|jedes|jene|jenem|jenen|jener|jenes|jetzt|kann|kein|keine|keinem|keinen|keiner|keines|können|könnte|machen|man|manche|manchem|manchen|mancher|manches|mein|meine|meinem|meinen|meiner|meines|mit|muss|musste|nach|nicht|nichts|noch|nun|nur|ob|oder|ohne|sehr|sein|seine|seinem|seinen|seiner|seines|selbst|sich|sie|ihnen|sind|so|solche|solchem|solchen|solcher|solches|soll|sollte|sondern|sonst|über|um|und|uns|unse|unsem|unsen|unser|unses|unter|viel|vom|von|vor|während|war|waren|warst|was|weg|weil|weiter|welche|welchem|welchen|welcher|welches|wenn|werde|werden|wie|wieder|will|wir|wird|wirst|wo|wollen|wollte|würde|würden|zu|zum|zur|zwar|zwischen)\b/i,
   minimal_token_size: 2,
   split_text_on: /[\s\/\-\_\:\"\&\/]/,
   has_parent: true}
end
prepare_query(query) click to toggle source
# File lib/deviner/match.rb, line 108
def prepare_query query
  query.gsub(",", " ").
        gsub("&", " ").
        gsub("ü", "ue").
        gsub("ö", "oe").
        gsub("ä", "ae").
        gsub("Ü", "Ue").
        gsub("Ö", "Oe").
        gsub("Ä", "Ae").
        gsub("  ", " ")
end
score(category) click to toggle source
# File lib/deviner/match.rb, line 88
def score(category)
  return 0 if category == nil
  query = category.send(options[:query_method])
  query = prepare_query(query)
  return  cache[query] if cache[query] != nil
  search = Picky::Search.new @index
  subqueries = query.split(" ")
  total = 0
  for subquery in subqueries
    result = search.search(query)
    total+=result.total
  end
  if options[:has_parent]
    parent = category.send(options[:parent_method])
  else
    parent = nil
  end
  cache[query] = total + score(parent)
end