Skip to content
JunHyuk Kwon edited this page Feb 12, 2023 · 31 revisions

데이터 개요

  • 오늘의집 사이트에서 유저들이 인테리어를 소개하는 글이 있음.
  • 인테리어 소개글에 포함된 아이템들을, 해당 오늘의집 유저가 선호하는 아이템으로 간주 (user-item interaction으로 간주)
  • 수집한 데이터를 통해 데이터셋을 구성 (ERD를 참고해주세요.)

데이터 수집 방법 및 업데이트

크롤링 가능 여부

  • 크롤링 가능 여부를 robots.txt를 통해 확인

데이터 수집 파이프라인

  • 데이터 수집 소요시간을 단축하기 위해 데이터 수집 파이프라인 설계

데이터 수집 방법

  • 유저가 작성한 인테리어 글을 모아 둔 링크에서 Interior 고유번호를 먼저 수집
  • Interior 고유번호에 포함된, 연관된 이미지와 상품의 고유번호를 수집
  • 이후 수집된 고유번호를 활용하여 데이터에 대한 세부 정보를 수집

데이터 수집 자동화를 위한 데이터 업데이트 코드

  1. 새로 등록된 글은 [New] 라벨과 함께 상단에 노출
  2. 인테리어 모아보기 페이지의 최상단의 3개만 탐색하여 새로 등록된 글이 있는지 먼저 확인
  3. 새로 등록된 글이 있다면, 해당 글에서 새롭게 발견된 Item, Card에 대해서만 데이터 수집 진행

데이터의 특성

Extremely High Sparsity

  • 수집된 데이터의 경우 가능한 모든 상호 작용 중에서 관측치의 비율이 99.96%로 매우 spare한 데이터
  • 위 이미지는 전체 아이템 중 10%에 해당하는 아이템들에 대해 99.96%의 sparsity를 시각화한 이미지

Extremely Long Tail Problem

  • 수집된 데이터는 0.41%의 소수 아이템들이 다른 아이템들과 비교해서 상대적으로 많은 interaction을 차지하고 있음.
  • 아이템별로 interaction의 불균형이 존재하기 때문에, 모델 학습 시 소수의 인기 아이템에 편향되서 개인화 추천이 어려운 문제가 발생할 수 있음.

데이터의 전처리

전처리

문자열 전처리 적용, Konlpy, keras의 text_to_word_sequence 적용해서 가공하기 쉬운 형태로 변환

상품명 클러스터링

상품명 클러스터링 개괄

상품명의 특징

  • 상품명이 유사한데 색상, 크기, 형태만 다른 경우가 있음.

상품명 vectorzie (text to vector)

  • 상품명 text의 평균 길이: 19
  • 짧은 text가 많기 때문에 tf-idf, bag-of-words, word2vec과 같은 ML 기법으로 vectorize가 잘 안됨.
  • 게슈탈트 패턴 매칭 알고리즘을 통해 text 간의 유사도를 character 단위로 계산해서 numerical value로 변환(vectorize)

상품명 유사도 계산 - 시간복잡도 줄이기

  • 게슈탈트 패턴 매칭 알고리즘으로 vectorize할 경우 모든 아이템과 비교하려면 O(n^2)의 시간복잡도가 요구됨. (15시간 소요)
  • Sliding Window 알고리즘 적용: 상품명 기준으로 정렬 후 근방의 K개 상품명만 비교하면 O(n*k)의 시간복잡도가 요구됨. (10분 소요)

유사도 기반 상품명 클러스터링

  • 아이템별로 유사한 상품들끼리를 같은 클러스터로 묶일 수 있도록 BFS 알고리즘 사용
  • 너무 먼 이웃의 노드는 클러스터에 포함되지 않도록 함. (트리의 depth 제한 적용)
  • 양방향 그래프를 구성해서 노드들이 빠짐없이 클러스터링

실제 서비스 적용 결과 이미지

상품명 클러스터링 검증하기

클러스터링 결과 요약

  • 수치

    • 2개 이상의 그룹으로 묶인 총 아이템 개수: 6008개
    • 2개 이상의 그룹으로 묶인 총 클러스터 개수: 2630
    • 클러스터 그룹별 평균 아이템 개수: 2.284
  • 예시 (5개로 클러스터링된 아이템들 중 일부)

  • 사진

클러스터링 검증을 위해 도입한 feature

  • 상품들의 category 특징:

    • 대분류부터 소분류까지 있음
    • 총 개수가 1003개
    • 이들을 multi-hot으로 둠
    • 클러스터 내에서, 다른 카테고리인데 이름이 유사해서 분류된 경우가 있음
      • 이것들은 같은 카테고리의 상품들이 아님.
  • 상품들의 seller 특징:

    • 같은 클러스터 내의 상품들은 대체로 같은 seller가 판매함.
    • 같은 클러스터 내의 상품들이어도 seller가 다른 경우가 존재하긴 함.
    • 이들을 one-hot
    • 총 12000개 있음

클러스터링 검증을 위해 도입한 방법

  • category와 seller를 feature로 활용해서 이와 같이 분류할 수 있음.

  • random forest regressor 사용

    • 라벨에 가깝게 예측할 경우 정답 라벨로 간주
    • label을 0과 1만 사용 (이진 분류 모델: 검증하고자하는 클러스터 vs 검증에 활용된 클러스터)
  • 근데 feature가 12000개의 multi-hot으로 되어 있고 매우 sparse하기 때문에, 이것들을 autoencoder로 차원축소 (100차원으로 축소)

    MSE Loss: 0.000100418 → 매우 잘 복원됨.

클러스터링 검증 방법

  1. 검증하고자하는 클러스터와 같은 개수의 아이템을 가지는 클러스터와 비교
  2. 검증하고자하는 클러스터의 아이템들과 대조군 클러스터 아이템들을 random forest로 train함.
    1. 그래서 검증하려는 클러스터들을 test set으로 지정
    2. 회귀 예측값이 0.5 미만인 예측이 포함될 경우 오답이 포함된 클러스터로 간주

클러스터링 검증 결과 요약

  • 수치

    • 2개 이상의 그룹으로 묶인 총 클러스터 개수: 2630개
    • 2개 이상의 그룹으로 묶인 총 아이템 개수: 6008개
    • 2개 이상의 그룹으로 묶인 오답이 포함된 클러스터 개수: 81
    • 2개 이상의 그룹으로 묶인 오답이 포함된 클러스터에 포함된 아이템 개수: 425
    • 오답이 포함된 클러스터 비율: 3.080%
      • 클러스터링이 잘됐다고 볼 수 있음.
  • 오답이 포함된 클러스터 확인하기 예시1

    • 실제 사진:
  • 오답이 포함된 클러스터 확인하기 예시2

    • 실제 사진:
  • 해당 클러스터들을 제거해주면 됨

ERD

Clone this wiki locally