Aвтоматический подбор категорий для товара

Shurik

Новичок
Доброго времени суток!

Есть задача:
существует каталог товаров, необходимо обрабатывать выгрузки (xml каталог товаров) и автоматически распределять их по категориям которые наиболее подходят по параметрам (название, бренд, модель и прочее.) по типу яндекс маркет, price.ru и т.п.

первое что сделал - разбил названия имеющихся товаров на слова и вставил их в таблицу products_tags. далее беру название нового товара, забиваю на слова и проверяю совпадения в таблице products_tags

$str = 'Пуловер Бежевый';
$str = explode(' ', $str);

$tags = array();
foreach($str as $w)
{
if(mb_strlen($w)>1)
{
$tags[] = mb_strtolower($w, mb_detect_encoding($w));
}
}

$tags_filter = array();
foreach($tags as $feature=>$value)
$tags_filter[] = 'pt.tag LIKE "'.$value.'"';
$tags_filter = implode(' OR ', $tags_filter);

$query = $this->db->placehold("SELECT c.name, p.category_id, pt.tag, count(p.category_id) as count FROM products_tags pt
LEFT JOIN products p ON p.id =pt.product_id
LEFT JOIN categories c ON c.id =p.category_id
WHERE $tags_filter
GROUP BY pt.tag, p.category_id
ORDER BY count DESC");
$this->db->query($query);
$tags_categories = $this->db->results();

mysql

SELECT c.name, p.category_id, pt.tag, count(p.category_id) as count
FROM c_products_tags pt
LEFT JOIN c_products p ON p.id =pt.product_id
LEFT JOIN categories c ON c.id =p.category_id
WHERE pt.tag LIKE "пуловер" OR pt.tag LIKE "бежевый"
GROUP BY pt.tag, p.category_id
ORDER BY count DESC

во многих случаях получается определить категорию по первому очевидному признаку - количество. но это не верный подсчет. к примеру есть результат:

Array
(
[0] => stdClass Object
(
[name] => Ламинат
[category_id] => 3035
[tag] => бежевый
[count] => 4
)

[1] => stdClass Object
(
[name] => Пуловеры
[category_id] => 3059
[tag] => бежевый
[count] => 1
)

[2] => stdClass Object
(
[name] => Пуловеры
[category_id] => 3059
[tag] => пуловер
[count] => 1
)
)

куда двигаться дальше и верный ли подход с тегами? подскажите! возможно есть алгоритмы?
 
Последнее редактирование:

antson

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

fixxxer

К.О.
Партнер клуба
Нейросеть можно попробовать обучить данными из яндекс-маркета :)
 

Shurik

Новичок
получил определенные результаты

Код:
$query = $this->db->placehold("SELECT c.name, p.category_id, count(distinct pt.tag) as count
                               FROM products_tags pt
                               LEFT JOIN products p ON p.id =pt.product_id
                               LEFT JOIN categories c ON c.id =p.category_id
                               WHERE $tags_filter
                               GROUP BY p.category_id
                               ORDER BY count DESC");

$this->db->query($query);
$tags_categories = $this->db->results();

if(!empty($tags_categories))
{
    $categories = array();
    foreach($tags_categories as $c)
    {
        // совпадение более 50%
        if($c->count/count($tags)*100 > 50)
        {
            $categories[] = array('name'=>$c->name,'percent'=>$c->count/count($tags)*100 . '%');
        }
    }
}
смысл в том что бы определить количество совпадений. собственно достаточно разложить название товара на теги. Дополнительно можно избавится от склонений.

возможно я ошибаюсь но тут http://price.ru/search/?query=щетка очень похожие результаты выходят

товары для которых не находится категория разбрасываются ручками и в последствии подобные товары попадают в туже категорию. по идее... как минимум получаем полуавтоматический режим сортировки товаров по каталогу
 
Последнее редактирование:

Shurik

Новичок
в данном случае, с тегами, смущает объем таблицы с тегами. собственно мне не доводилось сталкиваться с подобной тематикой, возможно это нормально для агрегатора.
В итоге этот "примитивный" алгоритм показывает те же результаты что на выдаче поиска price.ru. Хотелось бы предположить что решение относительна верное :) (крайне оптимистическое предположение)

если подсмотреть в админку tiu.ru, при заполнении названия товара автоматически выводятся категории которые предположительно подходят для публикации данной позиции. все тот же принцип подбора категории по названию товара.

вопрос - решение совсем топорное или имеет право на дальнейшую доработку?
 
Последнее редактирование:

antson

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

приводим к словоформам
"белый" "рубашка"

лучше переложить на сфинкс поигравшись с весовой функцией
вернет список вариантов

ну или

прогоняем первое слово
краски - водоэмульсионные - встретилось 100 раз из 500 товаров
краски - масляные 80 из 300
и т.д.
возможно даже что -то из одежды

прогоняем рубашка
одежда- женская - блузки
и т.д.

а вот модератору нужно вернуть разумное число вариантов.

артикул полная фигня для анализа . EAN13 - вещь , но нужно подключиться к каталогу,
в этом случае нужно будет только один раз классифицировать товар

можно учитывать цену( соотнося с диапазоном на слово) но не сильно поможет
 

antson

Новичок
Партнер клуба
бренд - он же вендор . может помочь отсечь только явный бред

и опять же разные написания ;(

модель - нормализовать и поможет только после накопления статистики
 
Сверху