Mapeamentos de Frases para Filtros: Busca Semântica para Filtros de Produtos

Este artigo explica como geramos e expandimos mapeamentos de frase para filtro que alimentam nosso sistema de extração de filtros. Esses mapeamentos conectam frases em linguagem natural de consultas de pesquisa a filtros estruturados de produtos.

O Problema: Extrair Filtros da Linguagem Natural

Quando usuários pesquisam por "mini pc com 16gb de ram", precisamos extrair:

  • Form Factor: Mini PC

  • Main Memory: 16

Mas os usuários expressam a mesma intenção de muitas maneiras:

  • "mini pc com 16gb de ram"

  • "computador mini 16 gb de memória"

  • "pc pequeno 16gb"

  • "desktop compacto com 16 gigas"

Precisamos de um sistema que mapeie todas essas variações de frase para os valores de filtro corretos.

Processo em Duas Etapas

Geramos mapeamentos de frases em duas etapas:

  1. Etapa 3a: Gerar frases base a partir de características do produto usando permutações e regras específicas por característica
  2. Etapa 4: Expandir com similaridade semântica usando embeddings

Essa abordagem híbrida combina a precisão baseada em regras com a flexibilidade semântica.

Etapa 3a: Geração de Frases Base

Metadados da Característica

Cada característica de produto tem metadados na sequência de características:

  • Heading: Nome da categoria (ex: "Processing" para características do processador)

  • Unit: Unidade de medida (ex: "GB" para memória, "GHz" para frequência)

Esses metadados orientam a geração de frases.

Geração Baseada em Permutação

Para cada valor de característica, geramos todas as permutações de:

  • Heading: "processor"

  • Feature key: "series"

  • Value: "i5"

  • Unit: (nenhuma para series)

Isso produz:

  • "processor series i5"

  • "series processor i5"

  • "i5 processor series"

  • "i5 series processor"

  • "processor i5"

  • "series i5"

  • "i5"

Todas as permutações garantem que correspondamos às consultas, independentemente da ordem das palavras.

Combinações de Valor + Unidade

Para características com unidades (memória, armazenamento, frequência), geramos ambas as variantes: com espaço e sem espaço:

  • "16 gb" (com espaço)

  • "16gb" (sem espaço)

Essas se combinam com outros componentes:

  • "16gb ram"

  • "ram 16gb"

  • "processor 16gb"

Regras de Sufixo de Porta

Para características de conectividade (USB, HDMI, DisplayPort), adicionamos sufixos de porta:

  • "usb port"

  • "usb ports"

  • "2 usb ports"

  • "hdmi port"

Isso corresponde a consultas como "mini pc com 2 portas hdmi".

Regras Específicas por Característica

Cada tipo de característica tem geração de frase personalizada:

Série do Processador (i3, i5, N-series):

  • Designações de processador Core geram variantes: nome do fabricante, marca Core, formas combinadas

  • Processadores N-series (N100, etc.) criam combinações de padrão semelhante

  • Cada um gera múltiplas permutações com "processor"

Memória Principal (Main Memory):

  • Valores numéricos geram variantes de GB com e sem espaço ("16gb", "16 gb")

  • São automaticamente acrescidos dos qualificadores "ram" e "memory" ("16gb memory", "16 gb ram")

Armazenamento SSD (SSD Storage):

  • Valores numéricos geram variantes de GB ("512gb", "512 gb")

  • Gera automaticamente variantes de TB para valores ≥ 1024 (ex: 1024GB → 1TB)

  • É automaticamente acrescido dos qualificadores "ssd" e "storage" ("512gb ssd", "512 gb storage")

Fator de Forma (Form Factor):

  • Mini PC → múltiplas variantes, incluindo forma sem espaço

  • All-in-One → "all in one", "aio", formas abreviadas

  • Thin Client → variantes com e sem espaço

  • Industrial PC → formas abreviadas e completas

Geração (Generation):

  • Valores de geração numérica se tornam: "12th gen", "12th generation", "gen 12"

Núcleos (Cores):

  • 2 → "dual core"

  • 4 → "quad core"

  • 6 → "hexa core"

  • 8 → "octa core"

  • Todos geram variantes de "[n] core processor"

Ethernet:

  • "1000" → ["gigabit ethernet", "gbe", "1gbps"]

  • "2500" → ["2.5gbe", "2.5 gigabit", "2.5gbps"]

Sistema Operacional (Operating System):

  • "Windows 11" → ["windows", "windows 11", "win 11"]

  • "Ubuntu" → ["linux", "ubuntu"]

  • "FreeDOS" → ["freedos", "no os", "without os"]

Lista Branca (Whitelist) para Valores Isolados

Apenas características específicas permitem correspondência de valor isolado para evitar falsas correspondências:

  • Série (Series): "i3", "i5", "N100" (mas não letras únicas)

  • Modelo do Processador (Processor Model): "N100", "1335U"

  • Sistema Operacional (Operating System): "Windows", "Linux", "Ubuntu"

  • Geração (Generation): "12th", "13th", "14th"

  • Marca do Processador (Processor Brand): "Intel", "ARM"

Por exemplo, "2" não deve corresponder a "2 cores" quando a consulta é "2 portas hdmi". A verificação de comprimento impede que letras únicas ou valores muito curtos e ambíguos sejam correspondidos de forma isolada. Características com componentes de unidade explícitos, como Ethernet ou portas, só geram combinações isoladas quando qualificadas com sua unidade.

Prevenção de Colisão

Os valores de memória e armazenamento se sobrepõem (ambos têm 64, 128, 256, etc.). A Etapa 4 aplica regras de intervalo de valor para desambiguar:

  • ≤ 64 GB: Memória Principal (RAM)

  • ≥ 128 GB: Armazenamento SSD

  • Intervalo 65-127 GB: Ignorado (ambíguo)

Frases com qualificadores explícitos ("ram"/"memory" ou "ssd"/"storage") substituem esta regra e podem corresponder a qualquer valor.

Além disso, termos gerais vagos que correspondem a muitos filtros não relacionados são excluídos durante a resolução de colisão via pós-processamento: termos como "connectivity", "audio", "display", "processor" e "physical" criam muita ambiguidade em múltiplas facetas.

Etapa 4: Expansão Semântica

Extração de N-gramas

Extraímos frases frequentes de consultas de pesquisa reais, variando de palavras únicas (1-gramas como "mini") a sequências mais longas (até 6-gramas como "mini pc com 16gb de ram ssd"). Apenas frases que aparecem pelo menos 3 vezes são mantidas. Essa abordagem de filtragem reduz ruído enquanto preserva padrões genuínos de linguagem do usuário.

Geração de Texto de Pesquisa para Filtro

Para cada valor de filtro, geramos textos de pesquisa:

Memória Principal: 16:

  • "16gb ram memory"

  • "16 main memory"

  • "main memory 16"

Armazenamento SSD: 512:

  • "512gb storage ssd"

  • "512 ssd storage"

  • "ssd storage 512"

Esses textos de pesquisa representam o filtro no espaço de embedding.

Embedding e Correspondência

Convertemos tanto as frases de consulta quanto os textos de pesquisa de filtro em embeddings, então calculamos a similaridade de cosseno entre eles. Frases com escores de similaridade acima de um limite configurado são adicionadas ao mapeamento daquele filtro.

Frases Semente Manuais

Injetamos frases semente manuais de alta confiança antes da expansão:

"Series:i5": [
    "i5",
    "core i5",
    "intel i5",
    "intel core i5",
    "i5 processor",
    "cpu i5",
]

Essas sementes representam frases centrais que sabemos serem corretas para cada filtro. Ao incluí-las com escores de similaridade máximos, elas guiam o algoritmo de expansão para encontrar frases relacionadas com significados semelhantes.Essas sementes sempre recebem similaridade 1.0 e orientam a expansão.

Embedding Incremental

Armazenamos em cache os embeddings para frases e textos de pesquisa de filtro. Quando novas consultas chegam:

  1. Carregamos os embeddings existentes
  2. Embedamos apenas as novas frases
  3. Anexamos ao cache

Isso evita re-embedding de dados não alterados. Veja Estratégia de Embedding para detalhes.

Resolução de Colisão

Após a correspondência de similaridade ser concluída, resolvemos colisões entre filtros de Memória e Armazenamento:

Desambiguação baseada em número:

  • Para frases ambíguas contendo números: se a frase tem valor ≤ 64, manter apenas para Memória; se > 64, manter apenas para Armazenamento

  • Isso impede que "16gb" corresponda a filtros de Armazenamento SSD e "512gb" corresponda a filtros de Memória

Regras de substituição de qualificadores explícitos:

  • Frases com palavras-chave "ram", "memory", "cpu", "processor" → Apenas Memória

  • Frases com palavras-chave "ssd", "storage", "disk", "nvme", "drive" → Apenas Armazenamento

  • Exemplo: "processor 8gb" mapeia para Memória, apesar de ser numérico

Termos Vagos:

  • Descarta frases como "connectivity", "audio", "display" que correspondem a múltiplos filtros não relacionados

Formato de Saída

Os mapeamentos finais são ordenados por similaridade (mais alta primeiro), depois por comprimento (mais curto primeiro):

{
  "Main Memory:16": [
    {"phrase": "16gb ram", "similarity": 1.0},
# ... (detalhes de implementação omitidos)

Integração com a Extração de Filtros

Esses mapeamentos alimentam o algoritmo de extração de filtros:

  1. Chega uma consulta: "mini pc com 16gb de ram"
  2. Extrai frases: ["mini pc", "16gb ram", "mini", "pc", "16gb", "ram"]
  3. Correlaciona frases aos filtros usando os mapeamentos
  4. Retorna os filtros: {"Form Factor": ["Mini PC"], "Main Memory": ["16"]}

Veja Algoritmo de Extração de Filtros para detalhes.

Armazenamento e Distribuição

Os mapeamentos de frases são persistidos como arquivos JSON e usados em todo o sistema:

  • Arquivo de mapeamentos base: Gerado na Etapa 3a, contém frases baseadas em regras

  • Arquivo de mapeamentos expandidos: Gerado na Etapa 4, contém resultados de expansão semântica

Os mapeamentos expandidos são consumidos por:

  • Geração de páginas de consulta: Extrai filtros do texto da consulta

  • Serviço de busca: API de extração de filtros em tempo real

  • Correspondência de produtos: Filtra produtos pelos filtros extraídos

Características de Desempenho

Geração Base (Etapa 3a):

  • O tempo de processamento escala com o número de valores de filtro

  • Gera um grande número de variantes de frases base

  • O uso de memória permanece moderado durante a geração

Expansão Semântica (Etapa 4):

  • O tempo de processamento escala com o volume de consultas e o tamanho do embedding

  • A saída contém significativamente mais frases do que a geração base

  • Os requisitos de memória aumentam devido ao armazenamento de embeddings

A expansão é limitada pela CPU devido à computação de similaridade. Usar NumPy com aceleração BLAS acelera significativamente as operações de matriz.

Integração com o Pipeline de SEO

A geração de mapeamento de frases são as Etapas 3a e 4 no pipeline de SEO:

  1. Etapa 0: Incorporar Dados de Origem - Produtos, peças, artigos
  2. Etapa 1: Buscar Consultas - GSC, Google Ads, ao vivo, Algolia
  3. Etapa 2: Combinar Consultas - Mesclar todas as fontes
  4. Etapa 3a: Gerar Mapeamentos de Frase Base ← Você está aqui
  5. Etapa 3b: Incorporar Consultas - Converter em vetores
  6. Etapa 4: Expandir Mapeamentos de Frase ← Você está aqui
  7. Etapa 5: Agrupar Consultas - Agrupar em páginas
  8. Etapa 6: Corresponder Produtos - Correspondência consulta-produto
  9. Etapa 7: Construir Páginas de Consulta - Gerar HTML
  10. Etapa 8: Gerar Pesquisas Relacionadas - Encontrar consultas relacionadas
  11. Etapa 11: Migrar para Valkey - Carregar no serviço de busca

Veja Visão Geral do Pipeline de SEO para o fluxo completo.

Por Que Duas Etapas?

Geração base (Etapa 3a) fornece:

  • Precisão: Frases baseadas em regras correspondem exatamente ao que esperamos

  • Cobertura: Permutações garantem que todas as ordens de palavras sejam cobertas

  • Controle: Regras específicas por característica lidam com conhecimento de domínio

Expansão semântica (Etapa 4) fornece:

  • Flexibilidade: Descobre frases que não antecipamos

  • Linguagem real do usuário: Aprende com consultas de pesquisa reais

  • Sinônimos: Encontra frases equivalentes ("16 gigas" para "16gb")

Juntas, elas equilibram precisão e recall.

Referências

Conceitos Técnicos

Documentação do Modelo

Artigos Relacionados

Resumo

Geramos mapeamentos de frase para filtro em duas etapas:

Etapa 3a (Geração Base):

  • Ger