Class: Deviner::Match

Inherits:
Object
  • Object
show all
Defined in:
lib/deviner/match.rb

Instance Method Summary collapse

Constructor Details

#initialize(weight = nil, options = {}) ⇒ Match

Returns a new instance of Match.



8
9
10
11
# File 'lib/deviner/match.rb', line 8

def initialize(weight=nil, options={})
  @weights=weight
  self.options.merge(options)
end

Instance Method Details

#cacheObject



80
81
82
# File 'lib/deviner/match.rb', line 80

def cache
  @cache||={}
end

#clear_cacheObject



84
85
86
# File 'lib/deviner/match.rb', line 84

def clear_cache
  @cache={}
end

#constrains(key) ⇒ Object



14
15
16
17
18
19
20
# 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) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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) ⇒ Object

Return nil if no matches found



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 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) ⇒ Object



50
51
52
53
54
# File 'lib/deviner/match.rb', line 50

def model(model, keys)
  @index = index(model, keys)
  @keys = keys
  clear_cache
end

#optionsObject



22
23
24
25
26
27
28
29
30
# 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) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
# 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) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# 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