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:
- Etapa 3a: Gerar frases base a partir de características do produto usando permutações e regras específicas por característica
- 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:
- Carregamos os embeddings existentes
- Embedamos apenas as novas frases
- 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:
- Chega uma consulta: "mini pc com 16gb de ram"
- Extrai frases: ["mini pc", "16gb ram", "mini", "pc", "16gb", "ram"]
- Correlaciona frases aos filtros usando os mapeamentos
- 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:
- Etapa 0: Incorporar Dados de Origem - Produtos, peças, artigos
- Etapa 1: Buscar Consultas - GSC, Google Ads, ao vivo, Algolia
- Etapa 2: Combinar Consultas - Mesclar todas as fontes
- Etapa 3a: Gerar Mapeamentos de Frase Base ← Você está aqui
- Etapa 3b: Incorporar Consultas - Converter em vetores
- Etapa 4: Expandir Mapeamentos de Frase ← Você está aqui
- Etapa 5: Agrupar Consultas - Agrupar em páginas
- Etapa 6: Corresponder Produtos - Correspondência consulta-produto
- Etapa 7: Construir Páginas de Consulta - Gerar HTML
- Etapa 8: Gerar Pesquisas Relacionadas - Encontrar consultas relacionadas
- 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
-
Permutation - Wikipedia
-
Cosine Similarity - Wikipedia
-
N-gram - Wikipedia
-
NumPy - Documentação oficial
-
BLAS - Wikipedia
Documentação do Modelo
-
all-mpnet-base-v2 - Hugging Face
-
Sentence Transformers - Documentação oficial
Artigos Relacionados
-
Estratégia de Embedding - Como geramos embeddings
-
Algoritmo de Extração de Filtros - Usando mapeamentos para extrair filtros
-
Visão Geral do Pipeline de SEO - Arquitetura completa do pipeline
-
Agrupamento de Consultas - Agrupando consultas semelhantes
-
Correspondência de Produtos - Correspondência semântica
Resumo
Geramos mapeamentos de frase para filtro em duas etapas:
Etapa 3a (Geração Base):
- Ger