Todos os produtos
Search
Central de documentação

:Algoritmo Swing

Última atualização: Jun 28, 2026

O Swing é um algoritmo de recomendação item a item (I2I) desenvolvido pela Alibaba. Ele gera índices I2I que impulsionam recomendações de produtos em cenários de e-commerce, conteúdo e publicidade.

Como funciona

Algoritmos tradicionais de similaridade — como vizinhos comuns, Adamic/Adar, similaridade de cosseno, similaridade de Jaccard, cosseno e Rooted PageRank — medem diretamente a proximidade entre nós. O Swing adota uma abordagem diferente: considera a estrutura completa do grafo e estende o cálculo de similaridade para nós a dois saltos em um grafo de alta dimensão. Essa característica torna o algoritmo resistente a ruídos e significativamente mais preciso que os métodos tradicionais de filtragem colaborativa.

Por exemplo, o Swing identifica itens que os usuários costumam visualizar juntos durante uma sessão de compra — mesmo quando o sinal de coocorrência é esparso — e os exibe como recomendações nas páginas de detalhes do produto.

Os índices I2I do Swing são usados em cenários de recomendação no Taobao (mobile e PC) e em serviços de publicidade no TTPOD e Alimama.

Pré-requisitos

Antes de começar, verifique se você tem:

  • Um projeto PAI ativo com acesso a algo_public

  • Uma tabela MaxCompute contendo sequências de cliques dos usuários

  • Permissões para criar e gravar em tabelas MaxCompute

Configure as tabelas de entrada e saída

Tabela de entrada

A tabela de entrada armazena as sequências de cliques dos usuários. Crie-a com o seguinte esquema:

CREATE TABLE IF NOT EXISTS swing_test_input
(
  user_id   BIGINT,
  item_list STRING -- Mandatory. Contains the items clicked by a user, ordered from earliest to most recent.
)
LIFECYCLE 7;

O campo item_list é uma string delimitada por ponto e vírgula. Cada entrada de item contém pelo menos três subcampos:

Subcampo

Posição padrão

Tipo

Descrição

item_id

0 (fixo, deve ser o primeiro)

Numérico

Identificador do item. Deve ser do tipo numérico.

norm

1 (configurável via pos_norm)

Inteiro

Popularidade recente (número de cliques). Defina como 1 para todos os itens caso não seja utilizado.

timestamp

2 (configurável via pos_time)

String

Hora do clique no formato %Y%m%d%H%M%S. Defina o mesmo valor para todos os itens caso não seja utilizado.

Exemplo de valor para item_list:

1001,5,20250809120000;1002,3,20250809130000;1003,10,20250809140000

Liste os itens em ordem cronológica, do clique mais antigo ao mais recente.

O item_id deve ser do tipo numérico.

Tabela de saída

A tabela de saída armazena o índice I2I. Crie-a com o seguinte esquema:

CREATE TABLE IF NOT EXISTS swing_test_result
(
    item_id   BIGINT COMMENT 'Anchor item ID',
    item_list STRING COMMENT 'List of similar items'
)
LIFECYCLE 7;

A coluna item_list usa o seguinte formato:

item_id1,score1,coccur1,ori_score1;item_id2,score2,coccur2,ori_score2

Subcampo

Descrição

item_id

ID de um item similar

score

Pontuação de similaridade normalizada (normalização por valor máximo aplicada)

coccur

Número de coocorrências entre o item âncora e este item

ori_score

Pontuação de similaridade original (não normalizada)

Execute o comando PAI

Envie o job do Swing usando o comando PAI:

pai -name swing_rec_ext
    -project algo_public
    -DinputTable='swing_test_input/ds=20250809'
    -DoutputTable='swing_test_result/ds=20250809'
    -DmaxClickPerUser='500'
    -DmaxUserPerItem='600'
    -Dtopk='100'
    -Dalpha1='5'
    -Dalpha2='1'
    -Dbeta='0.3'

Use / para concatenar o nome da tabela e o valor da partição nos parâmetros inputTable e outputTable.

Parâmetros do algoritmo

Parâmetro

Descrição

Tipo

Padrão

inputTable

Tabela de entrada contendo as sequências de cliques dos usuários. Suporta tabelas particionadas e não particionadas.

String

outputTable

Tabela de saída para o índice I2I. Suporta tabelas particionadas e não particionadas.

String

maxClickPerUser

Número máximo de itens retidos na sequência de cliques de cada usuário. Se a sequência for maior, apenas os itens mais recentes são mantidos. Valores menores reduzem o ruído de comportamentos de cauda longa; valores maiores capturam interesses mais amplos do usuário.

Inteiro

600

maxTimeSpan

Número máximo de dias entre dois cliques para que os itens sejam considerados vizinhos. Defina como 1 para focar em coocorrências de curto prazo; aumente para sessões de navegação mais longas.

Inteiro

1

maxUserPerItem

Quantidade de usuários amostrados por item para o cálculo dos k-vizinhos mais próximos. Valores maiores melhoram a precisão, mas aumentam o tempo de computação.

Inteiro

700

topk

Número de vizinhos mais próximos a serem retidos para cada item gatilho na saída.

Inteiro

200

alpha1

Controla o peso atribuído a usuários com históricos longos de cliques. Aumentar alpha1 reduz a influência de usuários muito ativos. Consulte Fórmula.

Inteiro

5

alpha2

Controla a penalidade para pares de usuários com muitos itens em comum. Aumentar alpha2 reduz a pontuação de similaridade quando dois usuários compartilham muitos itens. Consulte Fórmula.

Inteiro

1

beta

Expoente que ajusta o efeito de suavização de alpha1. Valores mais próximos de 0 reduzem o efeito de amortecimento sobre usuários ativos; valores mais próximos de 1 o aumentam. Consulte Fórmula.

Número real

0.3

pos_time

Índice base zero do subcampo timestamp dentro de cada entrada de item em item_list.

Inteiro

2

pos_norm

Índice base zero do subcampo norm (popularidade do item) dentro de cada entrada de item em item_list.

Inteiro

1

Fórmula

O Swing calcula a similaridade entre itens usando a seguinte fórmula:

$$sim(i,j) = \sum_{u \in U(i) \cap U(j)} \sum_{\substack{v \in U(i) \cap U(j) \\ v \neq u}} \frac{1}{(|I(u)|+\alpha_1)^\beta \cdot (|I(v)|+\alpha_1)^\beta} \cdot \frac{1}{|I(u) \cap I(v)| + \alpha_2} \cdot \frac{1}{N_j}$$

Onde:

Símbolo

Descrição

$U(i)$

Conjunto de usuários que clicaram no item $i$

$I(u)$

Conjunto de itens clicados pelo usuário $u$

$N_j$

Fator de normalização para o item $j$

$\alpha_1$

Amortece a contribuição de usuários com históricos longos de cliques

$\alpha_2$

Penaliza pares de usuários que compartilham muitos itens em comum

$\beta$

Expoente que controla o efeito de suavização de $\alpha_1$