Class: Deviner::Match
- Inherits:
-
Object
- Object
- Deviner::Match
- Defined in:
- lib/deviner/match.rb
Instance Method Summary collapse
- #cache ⇒ Object
- #clear_cache ⇒ Object
- #constrains(key) ⇒ Object
- #index(model, keys) ⇒ Object
-
#initialize(weight = nil, options = {}) ⇒ Match
constructor
A new instance of Match.
-
#match(categories) ⇒ Object
Return nil if no matches found.
- #model(model, keys) ⇒ Object
- #options ⇒ Object
- #prepare_query(query) ⇒ Object
- #score(category) ⇒ Object
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, ={}) @weights=weight self..merge() end |
Instance Method Details
#cache ⇒ Object
80 81 82 |
# File 'lib/deviner/match.rb', line 80 def cache @cache||={} end |
#clear_cache ⇒ Object
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) = myconstrains = proc {|e| constrains(e) } index = Picky::Index.new :model do indexing stems_with: Lingua::Stemmer.new(language: [:language]), substitutes_characters_with: Picky::CharacterSubstituters::WestEuropean.new, stopwords: [:stopwords], splits_text_on: [:split_text_on], rejects_token_if: lambda { |token| token.size < [: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 |
#options ⇒ Object
22 23 24 25 26 27 28 29 30 |
# File 'lib/deviner/match.rb', line 22 def {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([: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 [:has_parent] parent = category.send([:parent_method]) else parent = nil end cache[query] = total + score(parent) end |