본문 바로가기

부스트캠프 AI Tech 3기/이론 : U-stage

[Day31] 추천 시스템 Basic 2-2 TF-IDF를 활용한 컨텐츠 기반 추천

컨텐츠 기반 추천 Content-based Recommendation

사용자가 과거에 선호한 아이템과 비슷한 아이템을 그 사용자에게 추천

ex) 같은 장르의 음악

 

장점 단점
다른 유저의 데이터가 필요하지 않음 아이템의 적합한 피쳐를 찾는 것이 어려움
:이미지냐 텍스트냐에 따라 feature preprocessing도 달라져 시간이 오래 걸린다.
새로운 아이템이나 인기도가 낮은 아이템을 추천할 수 있음 한 분야의 추천 결과가 계속 나온다 overspecialization
설명 가능 다른 유저의 데이터 활용 불가

Item Profile

item이 가진 부가정보로 feature를 찾아서 item profile을 만들어야 한다.

아이템이 가진 feature를 vector형태로 표현하는 것이 쉽다. 하나의 feature가 1개 이상의 vector dimensiondp 이진/실수 값으로 구성된다.

 

TF-IDF : Term Frequency - Inverse Document Frequency

text의 feature를 기본적인 개념인 TF-IDF에 대해서 알아보자

text는 단어들의 집합이고 단어가 문서의 특징을 나타내게 된다. 중요한 단어를 선정하는 score가 필요한데 이를 나타내는 방법이 바로 TF-IDF인 것이다.

 

TF(Term Frequency) : 단어w가 문서d에서 많이 등장한다

IDF(Inverse Document Frequency) : 단어w가 전체 문서D에서는 적게 등장한다.

->전체 문서에서는 적게 등장하는데 해당 문서d에 등장했다는 것은 단어w가 문서d를 잘 설명하는 중요한 단어라는 뜻이므로 TF와 IDF를 곱한 TF-IDF가 높게 된다.

 

$$TF-IDF(w,d)=TF(w,d)\cdot IDF(w)$$

  • TF : 단어w가 문서d에 등장하는 횟수
    $TF(w,d)=freq_{w,d}=\frac{freq_{w,d}}{\underset{k}{max}(freq_{k,d})}$
    max를 씌워 normalize할 수도 있다. 문서의 길이가 제각각 다르면 절대적인 문서의 길이에 따라 전체적인 term frequency 값이 커질 수 있다. 그럴 경우에 해당 문서에서 가장 많이 나온 단어의 갯수 $\underset{k}{max}(freq_{k,d})$로 나누어 준다.
  • IDF : 전체 문서 가운데 단어 w가 등장한 비율의 역수
    $IDF(w)=log\frac{N}{n_{w}}$
    ※ N : 전체 문서의 갯수, $n_{w}$ : 전체문서 N 가운데단어w가 등장한 문서 갯수
    IDF는 단어마다 정의되고 값의 변화가 크기 때문에 log를 사용한다.
  network read system apple
d1 2 1 3 0
d2 0 2 1 0

TF-IDF(network, d1)= 2$\cdot log \frac{2}{1}$ 와 같이 각각에 칸마다 TF-IDF를 계산할 수 있을 것이고

d1에 대한 vector $v_{d1}$은 [TF-IDF(network, d1), TF-IDF(read, d1), TF-IDF(system, d1), TF-IDF(apple, d1)]가 된다.

단어의 갯수가 총 4개이기 때문에 이 문서를 표현하는 item profile vector은 4차원 vector가 된다.

 

Build User Profile

Item profile뿐만 아니라 유저에게 아이템을 추천하기 위해서는 User Profile도 필요하다. 

 

User profile 생성 과정

  1. 과거에 유저가 선호했던 아이템 list
    아이템은 아까의 예시로 치면 문서d단위 이다.
    이제부터 유저의 선호 아이템 list=[d1,d3] 로 해보자
  2. 개별 item들은 TF-IDF를 통해 Item profile로 표현된다.
  3. 유저의 선호 아이템 list안에 있는 item들의 item vector을 통합하면 user profile이 완성
    통합하는 방법이 2가지가 있다. 
    1. simple
      유저가 선호한 item vector의 평균값 사용
      $simple\;vector=\frac{v_{d1}+v_{d3}}{2}$
      두 개의 아이템만 선호하기 때문에 2로 나누어 평균을 구해준다.
    2. variant
      유저가 아이템에 내린 선호도로 정규화한 평균값 사용
      예를 들어 user가 d1과 d2를 에 대해 평점을 각각 3($r_{d1}$),4($r_{d2}$) 로 선호도로써 매겼다면
      선호도 값을 가중치로 이용해 가중평균을 낼 수 있다.
      $variant\;vector=\frac{r_{d3}v_{d1}+r_{d3}v_{d3}}{r_{d1}+r_{d3}}$

User Profile기반 추천하기

Cosine Similarity

주어진 두 벡터 X,Y에 대해서 각 벡터의 각도가 같을수록 1 직교하면 0, 반대이면 -1을 가리킨다.

또한, 추천시스템에서 가장 많이 사용되는 유사도이다.

$$cos(\theta) = cos(X,Y)=\frac{X\cdot Y}{|X||Y|} = \frac{\Sigma^{N}_{i=1}X_{i}Y_{i}}{\sqrt{\Sigma^{N}_{i=1}X_{i}^{2}} \sqrt{\Sigma^{N}_{i=1}Y_{i}^{2}}}$$

 

이 cosine similarity를 이용해서 user vector와 item vector의 거리를 계산해보자

user vector는 item vector의 합으로 표현되어 있기 때문에 두 vector의 차원은 같다.

user vector와 item vector의 cosine similarity가 곧 이 유저가 item에 갖는 score여서 클수록 좋다.

$$score(u,i)=cos(u,i)=\frac{u\cdot i}{|u|\cdot|i|}$$

score가 큰 아이템부터 유저에게 추천할 수 있다. score가 큰 순서대로 N개를 추천한다면 그게 TopN 추천이 된다!

 

Rating 예측하기

유저가 특정 한 아이템에 가질 선호도(평점)을 예측하고 싶을 수도 있다. (예측문제)

user profile을 만들지 않고 user가 평점을 남긴 모든 item vector를 이용해서 평점을 예측한다.

 

  • 유저 1명
    u
  • 유저u가 평점을 남긴 아이템
    $I={i_{1}, \dotsb , i_{N}}$
  • Item Vector
    $V={v_{1}, \dotsb , v_{N}}$
  • 평점
    $r_{u,i_{n}}$
  • 평점을 예측할 새로운 아이템
    i'

일단 새로 예측할 i'과 선호했던 i들과의 유사도를 구한다.

$$sin(i,i') = cos(v_{i},v_{i'})$$

이 유사도를 가중치로 사용해서 과거에 선호했던 아이템들의 평점에 적용해 i'의 평점을 추론한다.