Построение рекомендательных систем с помощью NMF

Обучение без учителя на Python

Benjamin Wilson

Director of Research at lateral.io

Поиск похожих статей

  • Инженер в крупной онлайн-газете
  • Задача: рекомендовать статьи, похожие на читаемую пользователем
  • Похожие статьи должны иметь схожие темы
Обучение без учителя на Python

Стратегия

  • Применяем NMF к матрице частот слов
  • Значения признаков NMF описывают темы
  • ... поэтому похожие документы имеют схожие значения признаков NMF
  • Сравниваем значения признаков NMF?
Обучение без учителя на Python

Применение NMF к матрице частот слов

  • articles — матрица частот слов
from sklearn.decomposition import NMF
nmf = NMF(n_components=6)
nmf_features = nmf.fit_transform(articles)
Обучение без учителя на Python

Стратегия

  • Применяем NMF к матрице частот слов
  • Значения признаков NMF описывают темы
  • ... поэтому похожие документы имеют схожие значения признаков NMF
  • Сравниваем значения признаков NMF?
Обучение без учителя на Python

Версии статей

  • Разные версии одного документа имеют одинаковые пропорции тем
  • ... но точные значения признаков могут различаться!
  •  
  •  

Сильная версия: Собака укусила мужчину! Нападение страшного пса оставило жертву парализованной...

Обучение без учителя на Python

Версии статей

  • Разные версии одного документа имеют одинаковые пропорции тем
  • ... но точные значения признаков могут различаться!
  • Например, если в одной версии много незначимых слов
  •  

Слабая версия: Возможно, вы слышали, что, судя по всему, некая собака, вероятно, укусила мужчину...

Обучение без учителя на Python

Версии статей

  • Разные версии одного документа имеют одинаковые пропорции тем
  • ... но точные значения признаков могут различаться!
  • Например, если в одной версии много незначимых слов
  • Но все версии лежат на одной прямой, проходящей через начало координат

Диаграмма рассеяния: тема «питомцы» против темы «опасность»; сильная и слабая версии лежат на одной прямой через начало координат

Обучение без учителя на Python

Косинусное сходство

  • Использует угол между прямыми
  • Чем выше значение, тем больше сходство
  • Максимальное значение — 1, при угле 0 градусов

Диаграмма рассеяния: документы A и B, каждый на своей прямой, проходящей через начало координат под разными углами

Обучение без учителя на Python

Вычисление косинусного сходства

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]
Обучение без учителя на Python

DataFrame и метки

  • Помечаем сходства заголовками статей с помощью DataFrame
  • Заголовки передаются в виде списка: 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)
Обучение без учителя на Python

DataFrame и метки

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
Обучение без учителя на Python

Давайте потренируемся!

Обучение без учителя на Python

Preparing Video For Download...