-
Notifications
You must be signed in to change notification settings - Fork 7
Jisoo edited this page Feb 7, 2023
·
31 revisions
- 오늘의집 사이트에서 유저들이 인테리어를 소개하는 글이 있음.
- 인테리어 소개글에 포함된 아이템들을, 해당 오늘의집 유저가 선호하는 아이템으로 간주 (user-item interaction으로 간주)
- 수집한 데이터를 통해 데이터셋을 구성 (ERD를 참고해주세요.)
- 데이터 수집 소요시간을 단축하기 위해 데이터 수집 파이프라인 설계
- 유저가 작성한 인테리어 글을 모아 둔 링크에서 Interior 고유번호를 먼저 수집
- Interior 고유번호에 포함된, 연관된 이미지와 상품의 고유번호를 수집
- 이후 수집된 고유번호를 활용하여 데이터에 대한 세부 정보를 수집
- 새로 등록된 글은 [New] 라벨과 함께 상단에 노출
- 인테리어 모아보기 페이지의 최상단의 3개만 탐색하여 새로 등록된 글이 있는지 먼저 확인
- 새로 등록된 글이 있다면, 해당 글에서 새롭게 발견된 Item, Card에 대해서만 데이터 수집 진행
- 크롤링 가능 여부를 robots.txt를 통해 확인
- 수집된 데이터의 경우 가능한 모든 상호 작용 중에서 관측치의 비율이 99.96%로 매우 spare한 데이터
- 위 이미지는 전체 아이템 중 10%에 해당하는 아이템들에 대해 99.96%의 sparsity를 시각화한 이미지
- 수집된 데이터는 0.41%의 소수 아이템들이 다른 아이템들과 비교해서 상대적으로 많은 interaction을 차지하고 있음.
- 아이템별로 interaction의 불균형이 존재하기 때문에, 모델 학습 시 소수의 인기 아이템에 편향되서 개인화 추천이 어려운 문제가 발생할 수 있음.
문자열 전처리 적용, Konlpy, keras의 text_to_word_sequence 적용해서 가공하기 쉬운 형태로 변환
- 상품명이 유사한데 색상, 크기, 형태만 다른 경우가 있음.
- 상품명 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 제한 적용)
- 양방향 그래프를 구성해서 노드들이 빠짐없이 클러스터링