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_publicUma 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 |
|
|
0 (fixo, deve ser o primeiro) |
Numérico |
Identificador do item. Deve ser do tipo numérico. |
|
|
1 (configurável via |
Inteiro |
Popularidade recente (número de cliques). Defina como |
|
|
2 (configurável via |
String |
Hora do clique no formato |
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 |
|
|
ID de um item similar |
|
|
Pontuação de similaridade normalizada (normalização por valor máximo aplicada) |
|
|
Número de coocorrências entre o item âncora e este item |
|
|
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 |
|
|
Tabela de entrada contendo as sequências de cliques dos usuários. Suporta tabelas particionadas e não particionadas. |
String |
— |
|
|
Tabela de saída para o índice I2I. Suporta tabelas particionadas e não particionadas. |
String |
— |
|
|
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 |
|
|
Número máximo de dias entre dois cliques para que os itens sejam considerados vizinhos. Defina como |
Inteiro |
1 |
|
|
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 |
|
|
Número de vizinhos mais próximos a serem retidos para cada item gatilho na saída. |
Inteiro |
200 |
|
|
Controla o peso atribuído a usuários com históricos longos de cliques. Aumentar |
Inteiro |
5 |
|
|
Controla a penalidade para pares de usuários com muitos itens em comum. Aumentar |
Inteiro |
1 |
|
|
Expoente que ajusta o efeito de suavização de |
Número real |
0.3 |
|
|
Índice base zero do subcampo |
Inteiro |
2 |
|
|
Índice base zero do subcampo |
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$ |