2016-02-20 4 views
0

я пытаюсь написать алгоритм рубина, который будет работать следующим образом:Рубин Алгоритм классификации продуктов

  • Пользователь создает «поиск запросов», которые присваивают продукты по категориям на основе определенных критериев (например, если продукт имеет " красным "в названии, сценарий присваивает продукт идентификатору категории # 20, если в названии продукта есть« стекло », сценарий присваивает продукт категории id # 40 и т. д. и т. д.). Продукты могут принадлежать к нескольким категориям
  • Каждый так часто, скрипт будет работать и присвоить продукты их соответствующим категориям и нажмите обновленные категории для электронной коммерции платформы с помощью API

Я изо всех сил, потому что я не могу понять, наиболее эффективный способ сделать это. Я хочу ограничить количество запросов API на платформу электронной торговли и только «нажимать» обновленные категории, когда они действительно изменились.

Первоначально я думал, что буду запускать каждый продукт один за другим, видеть, какие правила/категории он соответствует, а затем нажимать новые категории продуктов на платформу электронной торговли только в том случае, если есть фактическое изменение. Проблема с этим подходом заключается в том, что я должен запускать 3000 продуктов каждый раз при создании нового правила.

Альтернатива будет каждый раз, когда будет создано новое правило, чтобы снова запустить все правила и обновить категории в локальной базе данных, но как я могу проверить, действительно ли категории изменились?

Любые указатели были бы очень благодарны ... Я сохраняю категории в базе данных как массив (т. Е. 29,20,38,27) для каждого продукта.

+0

Это немного расплывчатым вопрос, но если бы это было мне, я буду начните с изучения этого [алгоритмов] (https://en.wikipedia.org/wiki/String_searching_algorithm) – bjhaid

ответ

1

Возможно, что-то вроде этого.

key_to_category = { "red"=>1, "blue"=>2, "green"=>3, "pink"=>2 } 
keys = key_to_category.keys 
    #=> ["red", "blue", "green", "pink"] 
cats = key_to_category.values.uniq 
    #=> [1, 2, 3] 

products = [ 
    "Red and Green Gummies", 
    "Sky-Blue Thingamajigs", 
    "Dead Fred", 
    "Green Glue", 
    "Blue and Green Whatchamacallits" 
] 

r =/
    \b     # match word break 
    #{Regexp.union(keys)} # match any key 
    \b     # match word break 
    /x     # extended/free-spacing regex definition mode 
    #=>/
     \b 
     (?-mix:red|blue|green|pink) 
     \b 
     /x 

products.each_with_object(Hash.new { |h,k| h[k] = [] }) do |prod, h| 
    prod.downcase.scan(r).each { |key| h[key_to_category[key]] << prod } 
end 
    #=> {1=>["Red and Green Gummies"], 
    # 3=>["Red and Green Gummies", "Green Glue", 
    #  "Blue and Green Whatchamacallits"], 
    # 2=>["Sky-Blue Thingamajigs", "Blue and Green Whatchamacallits"]} 

Затем пройдите через хэш, чтобы выполнить обновление.

Альтернативно, шаг через таблицу продукта, получить product_name, вычислить

product_name = "Red and Green Gummies" 
key_to_category.values_at(*product_name.downcase.scan(r)) 
    #=> [1, 3] 

, а затем обновить категории 1 и 3.

+0

У меня есть один из продуктов, который я считаю очень полезным, поскольку я всегда ищу ручку или карандаш. –

+0

Спасибо за ваш совет. Продукты находятся в базе данных в виде записей (рельсы и postgres). Разве это повлияет на подход? Особенно учитывая, что у меня есть 3k + продукты ... –

+0

Также это дает мне каждую категорию с ее продуктами. К сожалению, я не могу обновлять категории продуктов в API по категориям. Я должен обновить, обновив один продукт ... –

Смежные вопросы