기술 회고

맞춤 추천 게시글 시스템 구축 - 이론편

Stitchhhh 2025. 4. 17. 01:22

요즘 많은 서비스가 사용자 맞춤 추천을 통해 관심 있는 콘텐츠를 효과적으로 제공하고 있습니다. 이번 글에서는 간단한 방법으로 맞춤 추천 게시글 시스템을 구축하는 기본 개념과 구현 방법에 대해 살펴보겠습니다.

 

이번 포스팅에서는 이론적인 부분에 대해서 집중적으로 정리해보겠습니다.

 

대표적인 추천 방식

추천 방식의 대표적인 방식으로는 컨텐츠 기반 추천 시스템과 협업 필터링 추천 시스템이 있습니다. 해당 방식의 장점과 단점을 테이블로 정리를 해보겠습니다.

 

구분 장점 단점
컨텐츠 기반 추천 시스템 • 신규 사용자·아이템에도 강함(콜드 스타트 완화)

• 외부 사용자 데이터 필요 없음 → 프라이버시 이슈 적음

• 추천 근거(아이템 특징) 설명이 쉬움
• 아이템 특징 추출·정규화가 필요(텍스트 전처리, 태그 관리 등)

• 사용자가 이미 본 유사한 범주에 갇혀 다양성 부족

• 메타데이터가 부실하거나 동질적이면 품질 저하
협업 필터링 추천 시스템 • 메타데이터가 부족해도 행동 로그만 있으면 학습 가능

• 새로운 취향(예: 전혀 다른 장르)도 이웃을 통해 발견 → 다양성·서프라이즈 효과 ↑

• 대개 컨텐츠 기반보다 정확도가 높음(충분한 데이터일 때)
콜드 스타트: 신규 사용자·아이템에 약함

• 대규모 데이터에서 계산 복잡도(O(N²))·성능 이슈

• 인기 편향·군집 편향 발생 가능

• 개인 정보 활용 시 프라이버시 고려 필요

 

위 내용을 기반으로 다양한 상황에서 선택할 수 있는 방식은 다음과 같이 정리해보았습니다.

상황 접근
서비스 초기로 사용자·행동 데이터가 부족 컨텐츠 기반(또는 인기/룰 기반)으로 시작
아이템 설명이 부실하거나 유저 로그가 풍부 협업 필터링(특히 아이템 기반 CF)
정확도보다 설명 가능성·프라이버시가 중요 컨텐츠 기반
다양성·개인화를 극대화하고 싶음, 대규모 로그 보유 협업 필터링 + 하이브리드
콜드 스타트·인기 편향 모두 해결하고 싶음 두 방식을 하이브리드로 결합(예: 초기엔 컨텐츠, 데이터가 쌓이면 CF 가중)

 

추천 시스템을 정할 때 위 테이블을 보고 참고를 해서 정하면 좋을 것 같습니다. 저는 협업 필터링 추천 시스템을 기반으로 진행을 해보겠습니다.

1. 사용자 별 게시글 가중치 구하기

가장 먼저 사용자별 게시글에 상호작용(좋아요, 조회수 등) 가중치를 계산해주어야 합니다. 그리고 결과값을 벡터로 정의할 수 있는데, 다음과 같습니다. [w_{u,1}, w_{u,2}, w_{u,3}, …, w_{u,N}]

 

예를 들어 좋아요의 가중치가 5, 조회수의 가중치가 1인 경우에 사용자 A가 게시글 10개 중 1번을 좋아요, 3번을 조회했다면 A의 벡터는 w_{A,1} = 5, w_{A,3} = 1이고 나머지는 0이 됩니다.

 

가중치 부여에는 다양한 케이스가 있습니다. 구현편에서 다룰 가중치 부여 세부사항은 다음과 같습니다.

  • 좋아요 가중치 : 10
  • 조회수 가중치 : MIN(5, 조회수)

 

2. 사용자 유사도 계산 방식

1번 과정을 통해 사용자 별 게시글 가중치를 구할 수 있었습니다. 그렇다면 이제 나와 비슷한 사용자를 사용자 유사도 계산을 통해 구할 수 있습니다. 협업 필터링 추천 시스템에서 많이 사용되는 유사도 지표 2가지는 다음과 같습니다.

  • 코사인 유사도 : 두 벡터 간의 방향 유사도를 계산하여 사용자나 아이템 간의 평점 패턴이 얼마나 일치하는지를 평가합니다.

  • 피어슨 상관계수 : 두 변수(예를 들어 사용자 평점 벡터)의 선형 상관 관계를 측정하며, 각 사용자의 평균 평점 차이를 반영하여 유사도를 계산합니다.

 

(갑자기 수학은 당황스러워요) 요약하면, 코사인 유사도는 구현이 간단하고 빠르게 계산할 수 있는 반면, 피어슨 상관계수는 사용자 간 평가 기준의 차이를 보정해 주어 정밀한 유사도 측정이 가능하지만 계산 과정이 복잡합니다. 그러므로 이번 에는 상대적으로 간단한 코사인 유사도를 활용하여 진행해보겠습니다.

계산 과정

내적 계산 : 두 벡터의 각 원소를 곱한 후 모두 더합니다.

벡터 크기 계산 : 각 벡터의 크기를 구합니다.

코사인 유사도 계산 : 내적 값을 두 벡터의 크기의 곱으로 나눕니다.

예시

예를 들어, 사용자 A와 사용자 B가 각각 영화에 대해 아래와 같은 평점을 준다고 가정해보겠습니다.

이처럼 계산된 코사인 유사도 값은 0.96으로, 두 사용자의 평점 패턴이 매우 유사함을 나타냅니다.

3. Top-N 유사 사용자 선정 및 추천 생성

모든 사용자 쌍의 유사도를 구했다면, 각 사용자에 대해 유사도 상위 N명의 이웃(neighbors)을 선택합니다. 여기서 N은 5~10 정도로 설정하며, 적절한 이웃 수를 통해 추천 품질을 높입니다. 각 사용자 u에 대하여 다음을 수행합니다:

  1. 사용자 u를 제외한 모든 다른 사용자 v에 대해 sim(𝑢,𝑣)를 계산합니다 (앞서 정의한 코사인 유사도).
  2. 유사도 값이 높은 순으로 정렬하여 Top-N 사용자 리스트를 얻습니다. 예를 들어 N=5인 경우 유사도가 가장 높은 5명을 선택합니다.
  3. 만약 유사도 값이 동률이거나 매우 비슷한 경우라도 임의로 N명을 맞추거나, 필요하면 N을 유연하게 조정합니다.

 

4. 이웃 기반 추천 생성 로직

이제 각 사용자에 대해, 그 이웃들의 행동을 바탕으로 추천 게시글을 생성합니다. 구체적인 구현 방법은 아래와 같습니다.

  1. 이웃들의 아이템 모으기: 앞서 선정된 Top-N 이웃 사용자들의 상호작용이 높은 게시글 목록을 모두 수집합니다.
  2. 자신이 본 항목 제외: 후보 목록에서 현재 사용자가 이미 조회했거나 좋아요한 게시글은 추천 후보에서 제거합니다. 이는 이미 소비한 아이템을 중복 추천하지 않기 위함입니다. (만약 조회만 했지만 좋아요하지 않은 게시글을 추천에 다시 포함시킬지 여부는 선택 사항입니다. 일반적으로 추천에서는 사용자가 이미 본 콘텐츠는 선호 여부와 관계없이 제외하는 것이 좋습니다. 따라서 본 설계에서는 사용자가 한 번이라도 본 게시글은 추천 목록에서 제외합니다.)
  3. 추천 후보 점수 계산: 남은 후보 게시글들에 대해 추천 점수를 계산합니다. 이웃 여러 명이 겹쳐서 좋아요한 게시글일수록, 혹은 더 유사도가 높은 이웃이 좋아요한 게시글일수록 가중치를 더 높게 부여합니다
  4. 추천 후보 정렬 및 상위 선택: 계산된 점수를 기준으로 후보 게시글들을 내림차순 정렬합니다. 상위 몇 개의 게시글을 최종 추천 결과로 선택할지는 비즈니스 요구에 따라 결정합니다. 일반적으로 사용자에게 노출할 추천 갯수(예: 10개)를 정해두고 Top-10을 선택합니다. (만약 점수 동률 등이 있다면 임의 순서나 부가 정렬 기준을 적용하면 됩니다.)