Como começamos a criar cartões de produtos automaticamente

imagem

No meu último artigo, falei sobre como aprendemos a corresponder automaticamente produtos por nomes de produtos, ou seja, para entender, por exemplo, que
Fone de ouvido A4Tech Bloody G501 preto
e
A4 G501, preto (vermelho) {Fones de ouvido com microfone, 2,2 m}

- É o mesmo. Isso tornou possível automatizar tudo relacionado a preços e disponibilidade. Neste artigo, mostrarei como fomos além e automatizamos o trabalho com as características e imagens dos produtos.

Esta é uma continuação lógica do desenvolvimento do produto, dada a operação confiável da correspondência automática de mercadorias por nome. Alocamos o projeto de automação para uma empresa separada, e eu falo sobre o projeto usando o exemplo de um de nossos clientes e compartilhamos alguns dos dados do cliente com sua permissão. A seguir, apresentamos uma pequena introdução e falaremos sobre os algoritmos que usamos.

Por onde começamos


O estado inicial de um ano atrás era o seguinte: um catálogo de 120 mil mercadorias, das quais 70 mil estão em estoque. Após o lançamento da comparação e criação automáticas de mercadorias (como foi o último artigo), o catálogo rapidamente cresceu para um milhão com algumas mercadorias, das quais 600-650 mil estavam em estoque. Mas apenas 350 mil posições estavam disponíveis para compras no varejo, porque o restante não possuía características. Dependendo da categoria, para que um produto apareça à venda, uma certa porcentagem de características deve ser preenchida. Em algumas categorias, deve haver uma foto. Dos 350 mil produtos à venda, 120 mil não tinham imagens. Explicarei que os produtos que estão em estoque, mas não são vendidos no varejo, podem ser vendidos no atacado, é costume enviar arquivos do Excel com nomes e preços para lá. Mas o portal B2B com cartões é sem dúvida uma vantagem.Eles também podem ser colocados em agregadores, onde já há informações mais detalhadas sobre o produto.

Imagens e especificações foram preenchidas no modo semi-automático. Durante este ano, outros clientes apareceram e agora eu sei como o processo foi construído em uma dúzia ou duas lojas relativamente grandes, é mais ou menos padrão. O programador que mantém o site periodicamente grava analisadores de site sobre o assunto da loja. Além disso, o departamento de conteúdo no painel de administração compara os bens e produtos consumidos do catálogo, bem como as categorias na fonte e as categorias no catálogo. Em cada categoria, para cada propriedade, a correspondência, as substituições e a conversão de unidades são configuradas. Os cartões de alguns produtos são preenchidos completamente manualmente. Uma pequena parte das mercadorias é entregue a um contratado externo. O mesmo aconteceu com o nosso cliente.

Cerca de 6% do catálogo fica desatualizado por mês, ou seja, para vender 500 mil produtos em um site, é necessário criar 30 mil cartões por mês apenas para manter a quantidade no mesmo nível.

Decidimos abordar o problema da forma mais sistemática possível e automatizar o processo de criação de cartões de produtos, tanto quanto possível.

Onde obtemos os dados


A primeira pergunta que surge é onde obter os dados de origem e quanto podemos obter. Temos duas fontes principais:

  • arquivos e APIs de fornecedores
  • os dados que encontramos na Internet

O segundo ponto envolve a análise de sites. Criamos uma infraestrutura para a criação de analisadores, que permite configurar a análise do site em cerca de meia hora. Em seguida, foram feitos cerca de cem analisadores nessa infraestrutura, no momento em que eles já coletaram informações sobre 16 milhões de produtos e baixaram e carregaram 35 milhões de imagens e documentos (instruções, folha de dados) para a CDN. Como CDN, usamos uma Bunny CDN. Ao salvar imagens, consideramos seus hashes perceptivos para que possamos encontrar rapidamente duplicatas mais tarde, falaremos mais sobre isso abaixo. Idealmente, se o analisador em si, sem dicas e configurações, conseguir coletar informações sobre produtos em qualquer site, mas esses são planos distantes.

Como preenchemos o cartão do produto com imagens


Esta é a parte mais simples e mais óbvia. Já temos um mecanismo de correspondência de produtos por nome, que funciona com rapidez e precisão e, nesse caso, estamos interessados ​​em respostas falsas positivas, que são de cerca de 0,1%. Falso negativo praticamente não afeta o resultado, porque não há muita diferença, trabalhamos no final com 10 ou 11 fontes. A comparação funciona a uma velocidade de 5 a 6 mil produtos por segundo e todos os nossos 15 milhões de produtos são compatíveis com qualquer catálogo em menos de uma hora. Seria possível terminar com isso, pois após a comparação conhecemos todas as imagens dos produtos. Mas, na prática, eles são duplicados em sites diferentes, em combinações diferentes, e seria correto escolher a melhor qualidade em um conjunto de imagens semelhantes e deixar o restante como opções no caso de edição manual subsequente do cartão do produto.

A identificação de imagens semelhantes ocorre em duas etapas. No primeiro estágio, ao baixar um arquivo, para cada uma de nossas imagens, consideramos um hash perceptivo. Primeiro, remova o fundo sólido, corte os campos. Aplique o hash DCT na imagem resultante. Sobre esse algoritmo, uma vez que houve um artigo sobre Habré .

Após a comparação para cada produto, temos um conjunto de imagens com hashes já calculados, e precisamos dividi-lo em clusters e, em seguida, selecionar a imagem da mais alta qualidade de cada cluster. O tamanho desse conjunto pode variar de várias unidades a várias centenas de unidades, um valor típico é de 10 a 40. Nesse tamanho, você pode aplicar o algoritmo de complexidade quadrática, a operação principal - calcular a distância de Hamming - é muito rápida.

Dividimos as imagens em clusters da seguinte maneira:

  1. a primeira imagem do conjunto forma o primeiro cluster
  2. cada próxima imagem é comparada com a primeira imagem de cada cluster
  3. se o maior coeficiente de similaridade for maior que o valor limite, adicione a imagem ao cluster existente
  4. caso contrário, criamos um novo cluster a partir de uma imagem

Depois disso, obtemos a imagem da mais alta qualidade de cada cluster. Numa primeira aproximação, a qualidade é determinada pelo tamanho e resolução da imagem. Quanto maior o tamanho e a resolução, melhor, mas a proporção entre tamanho e resolução deve estar dentro de limites razoáveis. Tal análise é suficiente na prática.

Além disso, há mais uma nuance. Encontramos as fotos dos produtos automaticamente, mas, no entanto, até agora a pessoa é mais importante. E se uma pessoa decidisse mudar a sequência de imagens, deveria ter essa oportunidade. Mas, ao mesmo tempo, não gostamos da ideia de "congelar" o cartão após a edição manual, queremos melhorar os algoritmos, encontrar novas imagens e melhorar automaticamente o cartão no futuro.

Com isso em mente, essa abordagem acabou sendo uma opção de trabalho: todas as imagens que foram alteradas manualmente (e uma alteração aqui significa o conjunto de ações mais amplo possível: confirmação, exclusão, alteração de ordem) sempre permanecerão no local. Todas as outras imagens que podemos mudar no futuro no modo automático.

Como preencher um cartão de produto com propriedades


Com propriedades, as coisas são um pouco mais complicadas do que com imagens. Em fontes diferentes, a mesma propriedade pode ser chamada de maneira diferente, pode ser expressa em unidades diferentes, pode não ter uma correspondência explícita (por exemplo, HDMI: sim e Interfaces: HDMI, USB).

Começamos definindo propriedades e criamos os seguintes tipos:

  • bem não
  • número + unidade
  • escolha única
  • múltipla escolha
  • linha

Além disso, usarei os termos “ dimensão ” e “ unidade de medida ”, eles têm significados diferentes.

Eles descreveram as unidades de medida e como convertê-las. No momento, já existem mais de cem, de metros a decibéis. Todos eles são divididos em grupos, dependendo da dimensão, e dentro do grupo podem ser reunidos. Por exemplo, a potência pode ser convertida em watts e lúmens em metros newton - é impossível.

Em seguida, tentamos quebrar o processo de preenchimento das propriedades em etapas independentes, para que cada etapa pudesse ser aprimorada e testada separadamente das demais. Para cada produto do catálogo, realizamos as seguintes operações:

  1. comparamos mercadorias com mercadorias de fontes por nome (temos um processo complexo, descrito em detalhes em um artigo anterior )
  2. formar uma lista de definições de propriedades a serem preenchidas
  3. formamos uma lista de propriedades de todos os produtos relacionados
  4. associamos a cada definição da cláusula 2 uma lista de valores da cláusula 3
  5. converter a lista em um único valor

Vamos considerar com mais detalhes, como exemplo, os dois últimos pontos. Suponha que tenhamos uma definição de propriedade como esta:
Nome: “Potência”
Tipo: Número (6, 0)
Unidade: Watt
e essa lista de valores (na verdade, é muito maior):
Comprimento (mm): 220
Comprimento: 0,22 m
Potência (kW): 1,8
Potência: 1,8 kW
Potência nominal: 1800 W
Potência: 2 kW
Potência: 1800
Para começar, precisamos entender quais valores valem a pena considerar em princípio. Uma versão funcional, mas não final, tem a seguinte aparência:

  • ( )
  • ( )
  • .

Temos esses pontos implementados como algoritmos independentes para cada caso, para que cada um possa ser aprimorado separadamente dos outros. No parágrafo com sinônimos, inserimos manualmente alguns dos pares mais óbvios e adiamos para tempos melhores. Além disso, talvez, tentaremos selecionar sinônimos automaticamente, usando dados das propriedades preenchidas. Além disso, podemos usar apenas um valor de uma fonte, para que cada um dos algoritmos tenha uma prioridade, ele determina a ordem de execução dos algoritmos.

Após esta operação, teremos o seguinte conjunto de valores:
Potência (kW): 1.8
Potência: 1.8 kW
Potência nominal: 1800 W
Potência: 2 kW
Potência: 1800
Sabemos que esse conjunto deve ser reduzido a um número de uma determinada dimensão. Para cada tipo, temos um algoritmo independente. No caso do número e unidade de medida, fazemos o seguinte:

para cada valor, tentamos determinar a unidade de medida. Se isso falhar ou sua dimensão não coincidir com a dimensão da propriedade, ignore esse valor no futuro. Teremos o seguinte conjunto de valores:
Potência (kW): 1.8
Potência: 1.8 kW
Potência nominal: 1800 W
Potência: 2 kW
Tentamos converter cada um dos valores em um número e levar à unidade de medida desejada. Aqui tentamos levar em consideração todos os formatos possíveis: com uma vírgula e um ponto para separar as partes inteiras e fracionárias, com vírgulas e espaços para separar os milhares, abreviações como milhares e assim por diante. Acontece o seguinte:
1800 W
1800 W
1800 W
2000 W
Este conjunto deve ser reduzido para um único valor. No caso de um único valor no conjunto, use-o. Se os valores forem mais de um e coincidirem, melhor ainda. Se os valores forem mais de um e não coincidirem, adotamos o mais comum. Se não for esse o caso, não preencha a propriedade automaticamente.

Este foi um exemplo para uma propriedade de um tipo numérico; para outros tipos, as últimas etapas são diferentes e levam em consideração seus recursos.

Quanto à edição manual, lidamos com as propriedades exatamente da mesma maneira que nas imagens. Qualquer coisa que tenha sido alterada ou confirmada manualmente não poderá mais mudar automaticamente. Tudo o resto pode.

Como testamos um projeto


Este projeto tem uma característica notável: o núcleo é uma tecnologia que consiste inteiramente de tarefas de otimização. Além disso, a maioria dessas tarefas não possui uma solução exata e, para elas, criamos nossos próprios critérios que levam em consideração a velocidade e a precisão. É aqui que os testes são realmente necessários.

A arquitetura do projeto é projetada de forma que algoritmos complexos, na medida do possível, sejam divididos em etapas simples. Para cada etapa, há um critério de otimização e um conjunto de testes. Ênfase na precisão, mas também na velocidade. No mínimo, estávamos cuidando de cada mudança. Cada uma dessas etapas se assemelha à tarefa de programação esportiva e temos a oportunidade de comparar os resultados após cada alteração.

resultados


Será possível avaliar com mais precisão os resultados após alguns meses de trabalho na produção. Menos de uma semana se passou até agora. Nesse período, adicionamos ao site cerca de 110 mil produtos que não foram vendidos anteriormente devido à falta de propriedades ou imagens.
O objetivo para o futuro é abandonar completamente o trabalho manual para preencher o catálogo. Na primeira etapa, um bom resultado seria reduzir seu volume em 70%. Penso que pelos resultados de vários meses conseguiremos isso.

All Articles