Criando recomendadores com NMF

Unsupervised Learning em Python

Benjamin Wilson

Director of Research at lateral.io

Encontrando artigos semelhantes

  • Engenheiro(a) em um grande jornal online
  • Tarefa: recomendar artigos semelhantes ao que o cliente lê
  • Artigos semelhantes têm tópicos parecidos
Unsupervised Learning em Python

Estratégia

  • Aplique NMF ao array de frequências de palavras
  • Os valores das features NMF descrevem os tópicos
  • ... então documentos semelhantes têm features NMF parecidas
  • Como comparar as features NMF?
Unsupervised Learning em Python

Aplique NMF ao array de frequências

  • articles é um array de frequência de palavras
from sklearn.decomposition import NMF
nmf = NMF(n_components=6)
nmf_features = nmf.fit_transform(articles)
Unsupervised Learning em Python

Estratégia

  • Aplique NMF ao array de frequências de palavras
  • Os valores das features NMF descrevem os tópicos
  • ... então documentos semelhantes têm features NMF parecidas
  • Como comparar as features NMF?
Unsupervised Learning em Python

Versões de artigos

  • Versões diferentes do mesmo documento têm as mesmas proporções de tópicos
  • ... mas os valores exatos das features podem mudar!
  •  
  •  

Versão forte: Cachorro morde homem! Ataque por terrível canino deixa homem paralisado...

Unsupervised Learning em Python

Versões de artigos

  • Versões diferentes do mesmo documento têm as mesmas proporções de tópicos
  • ... mas os valores exatos das features podem mudar!
  • Ex.: uma versão usa muitas palavras sem sentido
  •  

Versão fraca: Você pode ter ouvido, infelizmente parece que um cachorro talvez tenha mordido um homem...

Unsupervised Learning em Python

Versões de artigos

  • Versões diferentes do mesmo documento têm as mesmas proporções de tópicos
  • ... mas os valores exatos das features podem mudar!
  • Ex.: uma versão usa muitas palavras sem sentido
  • Mas todas as versões ficam na mesma linha passando pela origem

Dispersão: tópico pets vs. tópico perigo, com versões forte e fraca na mesma linha pela origem

Unsupervised Learning em Python

Similaridade do cosseno

  • Usa o ângulo entre as linhas
  • Valores maiores = mais similar
  • Máximo é 1, quando o ângulo é 0°

Dispersão dos documentos A e B, com 2 linhas em ângulos diferentes a partir da origem

Unsupervised Learning em Python

Calculando as similaridades por cosseno

from sklearn.preprocessing import normalize

norm_features = normalize(nmf_features)
# if has index 23 current_article = norm_features[23,:] similarities = norm_features.dot(current_article)
print(similarities)
[ 0.7150569   0.26349967 ..., 0.20323616  0.05047817]
Unsupervised Learning em Python

DataFrames e rótulos

  • Rotule as similaridades com os títulos via DataFrame
  • Títulos em uma lista: titles
import pandas as pd

norm_features = normalize(nmf_features)
df = pd.DataFrame(norm_features, index=titles)
current_article = df.loc['Dog bites man']
similarities = df.dot(current_article)
Unsupervised Learning em Python

DataFrames e rótulos

print(similarities.nlargest())
Dog bites man                            1.000000
Hound mauls cat                          0.979946
Pets go wild!                            0.979708
Dachshunds are dangerous                 0.949641
Our streets are no longer safe           0.900474
dtype: float64
Unsupervised Learning em Python

Vamos praticar!

Unsupervised Learning em Python

Preparing Video For Download...