컨텐츠 기반 추천
컨텐츠 기반 추천 (Content-based Recommendation)
한 유저가 과거에 선호한 아이템과 비슷한 아이템을 그 유저에게 추천
예시
- 영화: 배우, 감독, 영화 장르
- 음악: 아티스트, 장르, 리듬, 무드
장점
1. 유저에게 추천을 할 때 다른 유저의 데이터가 필요하지 않음
2. 새로운 아이템 혹은 인기도가 낮은 아이템을 추천할 수 없음
3. 추천 아이템에 대한 설명이 가능함
단점
1. 아이템의 적합한 피쳐를 찾는 것이 어려움
→ 아이템의 종류별로 부가 정보가 달라서 각각에 맞는 feature processing이 달라짐
2. 한 분야/장르의 추천 결과만 계속 나올 수 있음 (overspecialization
3. 다른 유저의 데이터를 활용할 수 없음
TF-IDF
TF-IDF (Term Frequency - Inverse Document Frequency)
Item Profile
추천 대상이 되는 아이템의 feature들로 구성된 것
예시)
- 영화 - 작가, 제목, 배우, 장르
- 이미지 - 메타데이터, 태그, 업로드한 사람
이 feature들을 vector로 표현하면 됨 (binary 혹은 실수값으로 구성)
문서 d에 등장하는 단어 w에 대해,
TF: 단어 w가 문서 d에 얼마나 많이 등장
IDF: 단어 w가 전체 문서(D)에서 얼마나 적게 등장
내용을 요약해보면, TF가 높고 IDF가 높으면 단어 w는 문서 d를 설명하는 중요한 feature!
(단어 w가 해당 문서 d에서는 많이 등장하고, 전체 문서(D)로 보면 적게 등장하면 해당 문서에 대해 당연히 중요하겠지?)
$$ \text{TF-IDF} = TF(w, d) \cdot IDF(w) $$
TF: 단어 w가 문서 d에 등장하는 횟수
$ TF(w, d) = freq_{w, d} $
$ TF(w, d) = \cfrac{(freq_{w, d})}{ \max_{k} (freq_{k, d}) } $
→ 문서의 길이가 각각 다를 경우를 대비해서 normalize 하는 것!
IDF: 전체 문서 가운데 단어 w가 등장한 비율의 역수
$ IDF(w) = \log \cfrac{N}{n_w} $
($ N $: 전체 문서 개수, $ n_w $: w가 등장한 문서 개수)
→ IDF 값은 변화가 크니까 logarithm!
TF-IDF 예시
w: 각 단어, d: 각 문서일 때,
등장한 단어 횟수
w1 | w2 | w3 | w4 | w5 | w6 | |
d1 | 2 | 2 | 1 | 3 | 0 | 2 |
d2 | 0 | 0 | 0 | 1 | 0 | 3 |
d3 | 0 | 0 | 1 | 1 | 0 | 2 |
d4 | 2 | 0 | 2 | 1 | 2 | 3 |
IDF | log(4/2) | logt(4/1) | log(4/3) | log(4/4) | log(4/1) | log(4/4) |
$ TFIDF(w1, d1) = 2 \cdot \log \frac{4}{2} = 0.6 $
$ TFIDF(w2, d1) = 2 \cdot \log \frac{4}{1} = 1.2 $
$ TFIDF(w3, d1) = 1 \cdot \log \frac{4}{3} = 0.12 $
$ TFIDF(w4, d1) = 3 \cdot \log \frac{4}{4} = 0 $
$ TFIDF(w5, d1) = 0 \cdot \log \frac{4}{1} = 0 $
$ TFIDF(w6, d1) = 2 \cdot \log \frac{4}{4} = 0 $
$ v_{d1} = (0.6, 1.2, 0.12, 0, 0, 0) $
이게 단어 d1 (item)에 대한 item profile vector
User Profile
유저에게 아이템을 추천하기 위해서는 User Profile 구축까지 필요함
User Profile
- 유저가 과거에 선호했던 Item list가 있고, 개별 Item은 TF-IDF를 통해 벡터로 표현
- 각 유저의 Item List 안에 있는 Item의 vector들을 통합하면 그게 User Profile
통합하는 방법
1. Simple: 유저가 선호한 Item Vecor의 단순한 평균값
2. Variant: 유저가 아이템에 내린 선호도로 정규화한 평균값 사용 (Weighted mean)
예시)
유저가 d1, d3을 선호한다고 가정했을 때, User Profile
$ \text{Simple Vector} = \cfrac{v_{d1} + v_{d3}}{2} $
$ \text{Variant Vector} = \cfrac{r_{d1}v_{d1} + r_{d3}v_{d3}}{r_{d1} + r_{d3}} $
Cosine Similarity
두 벡터에 $ X, Y $에 대해
$$ \cos (\theta ) = \dfrac {X \cdot Y} {\left\| X\right\| _{2}\left\| Y\right\| _{2}} $$
두 벡터의 방향이 비슷할수록 1에 가깝고, 반대일 때 -1에 가까워짐
<참고>
유저 벡터는 아이템 벡터의 합으로 표현했으니까, 두 벡터의 차원은 자동으로 같아짐
$$ score(u, i) = \cos (u, i) = \dfrac {u \cdot i} {\left\| u\right\| _{2}\left\| i\right\| _{2}} $$
- 유사도가 클수록 해당 아이템이 유저에게 관련성이 높음!
- 해당 유저와 가장 유사한 아이템 ($ score(u, i) $가 가장 높은 아이템)부터 유저에게 추천함
Rating (선호도) 예측
새로운 Item에 대해 선호도를 예측해보자
유저 $ u $가 선호하는 아이템 $ I = {i_1, \ldots , i_N} $의 Item Vector는 $ V = {v_1, \ldots , v_N} $, 평점은 $ r_{u, i} $ 일 때, 새로운 아이템 $ i' $ 에 대해서 평점 예측하기
$ I $에 속한 아이템 $ i $ 와 $ i' $의 유사도
(과거의 선호했던 아이템의 선호도와 새로운 아이템의 유사도 계산)
$$ sim(i, i') = \cos (v_i, v_{i'}) $$
$ sim(i, i') $ 를 가중치로 사용하여 $ i' $의 평점 추론
$$ prediction(i') = \cfrac{\sum_{i=1}^{N} sim(i, i') \cdot r_{u, i} } { \sum_{i=1}{N} sim(i, i') } $$
'boostcamp AI Tech > 추천 시스템' 카테고리의 다른 글
[RecSys] Item2Vec and ANN (0) | 2023.03.31 |
---|---|
[RecSys] 추천 시스템 - 협업 필터링 (Collaborative Filtering) - MBCF (0) | 2023.03.29 |
[RecSys] 추천 시스템 - 협업 필터링 (Collaborative Filtering) - NBCF (0) | 2023.03.27 |
[RecSys] 추천 시스템 - 연관 분석 (Association Analysis) (0) | 2023.03.27 |
[RecSys] 추천 시스템 (Recommender System) 이론 (0) | 2023.03.27 |