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で学ぶ教師なし学習

記事のバージョン

  • 同一文書の別バージョンは同じトピック比率
  • …ただし特徴量は一致しないことがある!
  • 例:ある版は無意味語が多い
  • しかしいずれも原点を通る同一直線上にある

散布図: トピックpets vs トピックdanger。強い版と弱い版が原点を通る同一直線上にある

Pythonで学ぶ教師なし学習

コサイン類似度

  • ベクトル間の角度を利用
  • 値が大きいほど類似
  • 角度0度で最大1

散布図: 文書AとBに原点から異なる角度の2本の直線

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で学ぶ教師なし学習

¡Vamos a practicar!

Pythonで学ぶ教師なし学習

Preparing Video For Download...