NMF로 추천 시스템 구축

Python으로 배우는 Unsupervised Learning

Benjamin Wilson

Director of Research at lateral.io

유사한 기사 찾기

  • 대형 온라인 신문사의 엔지니어
  • 작업: 사용자가 읽는 기사와 유사한 기사 추천
  • 유사한 기사는 유사한 주제를 가짐
Python으로 배우는 Unsupervised Learning

전략

  • 단어-빈도 배열에 NMF 적용
  • NMF 특성 값은 주제를 설명
  • ... 따라서 유사 문서는 유사한 NMF 특성 값을 가짐
  • NMF 특성 값을 비교?
Python으로 배우는 Unsupervised Learning

단어-빈도 배열에 NMF 적용

  • articles는 단어 빈도 배열
from sklearn.decomposition import NMF
nmf = NMF(n_components=6)
nmf_features = nmf.fit_transform(articles)
Python으로 배우는 Unsupervised Learning

전략

  • 단어-빈도 배열에 NMF 적용
  • NMF 특성 값은 주제를 설명
  • ... 따라서 유사 문서는 유사한 NMF 특성 값을 가짐
  • NMF 특성 값을 비교?
Python으로 배우는 Unsupervised Learning

기사의 버전들

  • 같은 문서의 다른 버전은 주제 비율이 같다
  • ... 단, 정확한 특성 값은 다를 수 있음!
  •  
  •  

강한 버전: 개가 남자를 물었다! 끔찍한 개의 공격으로 남성 마비...

Python으로 배우는 Unsupervised Learning

기사의 버전들

  • 같은 문서의 다른 버전은 주제 비율이 같다
  • ... 단, 정확한 특성 값은 다를 수 있음!
  • 예: 한 버전이 의미 없는 단어를 많이 사용한 경우
  •  

약한 버전: 들어보셨겠지만, 안타깝게도 개가 아마도 남자를 물었다는 소식이...

Python으로 배우는 Unsupervised Learning

기사의 버전들

  • 같은 문서의 다른 버전은 주제 비율이 같다
  • ... 단, 정확한 특성 값은 다를 수 있음!
  • 예: 한 버전이 의미 없는 단어를 많이 사용
  • 그러나 모든 버전은 원점을 지나는 같은 직선 위에 놓임

주제 pets 대 주제 danger 산점도. 강한/약한 버전이 원점을 지나는 같은 직선 위에 위치

Python으로 배우는 Unsupervised Learning

코사인 유사도

  • 선들 사이의 각도를 사용
  • 값이 클수록 더 유사함
  • 최대값은 1, 각도 0도일 때

문서 A와 문서 B의 산점도. 원점에서 다른 각도의 두 직선이 각 문서를 지남

Python으로 배우는 Unsupervised Learning

코사인 유사도 계산

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으로 배우는 Unsupervised Learning

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으로 배우는 Unsupervised Learning

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으로 배우는 Unsupervised Learning

Ayo berlatih!

Python으로 배우는 Unsupervised Learning

Preparing Video For Download...