2013-11-02 3 views
3

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

Нечто подобное (но с гораздо большим набором данных):

{ 
    "item": { 
     "description":"thing", 
     "tags": ["a","b","c","e","f"] 
    }, 
    "item": { 
     "description":"thing", 
     "tags": ["a","b"] 
    }, 
    "item": { 
     "description":"thing", 
     "tags": ["a","c"] 
    }, 
    "item": { 
     "description":"thing", 
     "tags": ["b","c"] 
    } 
} 

Две вещей я пытался до сих пор:

Первого было прямым пересечением между тегами на отдельной позиции, и другие элементы, имеющие один или несколько тегов. Это хорошо работает, но в тех случаях, когда тег несколько общий (думаю, помечен чем-то вроде «музыки», где все они - музыкальные предметы), количество возвращенных предметов огромно.

Вторая была немного сумасшедшей идеей, где я превратил массив тегов в строку и вычислил разницу levenshtein. Это работает для предметов, длина которых примерно одинаковая или большая, но неуклюжая. Тем не менее, он обрезал много жира, что первый подход вернулся. Это не правильный путь, но я хотел показать, к чему я стремлюсь. Реализовано это следующим образом:

// snip: this is inside a BB collection 

    getSimilarByTag: function(tags, ignore){ 
      var hits = []; 

      if (tags) { 

       this.filter(function(item){ 

        if (item.get('cat') === ignore){ 
         return; // no need to include 
        }; 

        var itemTags = item.get('tags'); 
        var result = _.intersection(tags, itemTags); 

        if (result.length) { 
         // calc levenshtein distance between the intersection and the search array 
         var dist = _.str.levenshtein(result.join(' '), tags.join(' ')); 
         if (Math.log(dist) < 1.5) { // this value needs tuning? 
          hits.push(item.toJSON()); 
         } else { 
          // based on our magic number above, ignore this 
         } 
        }; 
       }); 
      } 

      return hits; 
     } 

Я делаю все мой код в JavaScript, используя позвоночник и подчеркивания. Однако язык не так важен - просто любопытно, какой метод или алгоритм может дать лучший набор результатов.

+0

Есть ли возможность использовать категории, а также теги? Таким образом, «музыка» будет категорией, а теги могут быть «классическими», «панками» ... таким образом, вы можете просто отбросить все, что не входит в одну категорию, а затем выбрать элементы в соответствии с пересечением (переменный минимум количество) тегов. –

+0

К сожалению, нет - и на самом деле категории можно было бы рассматривать как своего рода «мастер-тег», который на самом деле меня не намного больше. Спасибо за ввод! – dmp

+0

Если возвращаемый набор данных может быть большим, мы обычно (как вам хорошо известно) возвращают набор в куски, т. Е. Лимит sql. Почему бы не рассмотреть возможность внедрения такой методики? Кажется, что вы запрашиваете невозможное, множество данных - это множество данных, независимо от того, какой язык он есть. –

ответ

1

Простая процедура для большинства применимых данных может быть, возвращает совпадения в порядке размера пересечения тегов с ограниченным количеством возвратов. Если вы могли бы весить определенные теги как более важные, вы можете использовать это, чтобы настроить возвращенный заказ. Например, если пользователь ранее купил предметы из каталога, то теги, связанные с их покупками, могут иметь увеличенный балл в алгоритме заказа.

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