Создание значимых предложений на основе массива тегов

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

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

{
    "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"]
    }
}

До сих пор я попробовал две вещи:

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

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

// 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, используя основы и подчеркивание. Тем не менее, язык не так важен - просто любопытно, какая техника или алгоритм может дать лучший набор результатов.

1 ответ

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

Другие вопросы по тегам