[카카오 아레나] 쇼핑몰 상품 카테고리 분류 대회 리뷰 Part 1 — 전처리

조금 과장하자면 NLP 문제에서 전처리(pre-processing)는 가장 중요한 부분이라고 합니다. 특히 전문가의 손을 거치지 않고 온라인상에서 작성된 데이터라면 전처리에 따라서 전체 성능에 영향을 줄 확률이 높아집니다.
이번 대회는 온라인 쇼핑몰에서 수집된 데이터를 사용하기 때문에 위와 같은 이유로 전처리가 중요하다고 할 수 있습니다. 전처리에도 여러 방법론이 있지만 대회에서 사용했던 주요 전처리에 대해서 소개하겠습니다.
전처리
1) 특수문자 제거
가장 기본적인 전처리 과정입니다. 인스타그램을 예로 들면,
#먹스타그램 #먹방 #혼밥 #혼술
라는 텍스트를 이해하는 것과 특수문자 #이 제거된
먹스타그램 먹방 혼밥 혼술
를 이해하는 것은 한국인에게는 같은 문제/난이도처럼 느껴집니다. 이처럼 컴퓨터에게 쉬운 텍스트를 전달함으로써 성능을 향상시킬 수 있습니다. 텍스트가 짧아져서 스토리지/메모리를 절약할 수 있는 장점도 있습니다. 물론 어떤 특수문자를 제거하느냐에 따라서 의미가 달라지고 성능이 떨어지기도 합니다(e.g. 아이패드 12.9인치 -> 아이패드 12 9인치).
다음은 대회에서 사용한 특수문자와 특수문자 제거 코드입니다.
2) 토큰화(Tokenization)
문장을 의미 단위로 나누는 과정을 토큰화라고 부릅니다. 띄어쓰기(whitespace) 단위로 나누는 방법부터 형태소 단위로 나누는 등 다양한 방법이 있습니다. 특수문자가 제거된 텍스트를 한 번 더 컴퓨터가 이해하기 쉽게 바꿔주는 과정이라고 생각하시면 됩니다.
이번 대회에서는 open-korean-text
(github)라는 한글 형태소 분석기를 사용했고 명사, 알파벳, 외국어(중국어, 일본어 등)만 선택해서 텍스트를 재구성했습니다.
3) 사전 생성
전처리가 된 텍스트라고 하더라도 컴퓨터는 텍스트를 있는 그대로 이해할 수 없습니다. 텍스트를 숫자로 바꿔주는 과정이 필요합니다. 예를 들면,
위의 예시처럼 단어 -> 숫자로 바꿔주는 과정을 ‘사전을 만든다’고 합니다. 대회에서는 크기 150,000개의 사전을 사용했습니다. 각 문장에서 최대 20 단어만 사용하고 한 문장에서 단어는 최대 한 번만 사용하게 제한했습니다. 대회에서 주어지는 product
, brand
, model
칼럼만 사용했습니다.
4) 라벨 전처리
대분류, 중분류, 소분류, 세분류 총 4개의 카테고리를 예측해야합니다. 하나의 카테고리만 예측하는 MNIST, CIFAR 10과는 다른 문제죠.
- 대분류 카테고리 57개
- 중분류 카테고리 552개
- 소분류 카테고리 3190개
- 세분류 카테고리 404개
4개의 정답을 예측해야하지만 각 정답간에 계측적(hierarchical) 상하관계가 있습니다. 예를 들어, 중분류 CPU
는 대분류 ‘데스크탑/모니터/PC부품’에 속하지 ‘향수/바디/헤어’에 속하지 않습니다.
관계를 무시하고 카테고리를 예측하려고 하면 총 40549544640개라는 어마무시한 경우의 수가 나오는데 관계를 고려한다면 4215개로 경우의 수가 크게 줄어듭니다. 대회측에서 제공한 코드에서도 관계를 고려한 카테고리를 사용하고 있습니다.
정리하자면 대, 중, 소, 세분류를 각각 예측하는 문제에서 대-중-소-세분류를 하나만 예측하는 문제로 변형한 것입니다.
5) 기타
이번 포스트에서는 다루지 않지만
- 전처리 속도 최적화
- 소분류, 세분류가 빈(empty) 값인 상품의 처리
등 대회에 맞게 구현한 내용은 코드를 참고해주세요. 이번 시리즈의 다른 글은 아래 링크에서 확인하실 수 있습니다!