딥러닝으로 리뷰에서 제품 속성 정보 추출하기

 

안녕하세요, 화해팀 데이터 사이언티스트 윤성민입니다.

 

이번 포스트를 통해 리뷰에서 제품 속성 정보를 추출하게 된 배경과 사용된 기술 및 결과를 공유하고자 합니다. 콘텐츠는 아래의 순서로 진행하겠습니다.

 

  • 정보의 바다, 리뷰
  • One-input and Multi-outputs
  • 낚아챈 정보 살펴보기
  • 정리하며

 

 


 

정보의 바다, 리뷰

 

화해는 화장품 시장의 정보 비대칭 문제를 해결하기 위해 가격, 성분, 이미지 등 화장품에 관한 다양한 정보를 수집하여 사용자에게 제공하고 있습니다. 화해팀이 수집한 정보 이외에도 사용자가 작성한 제품 리뷰 또한 다른 사용자에게 중요한 정보가 되는데요. 작성된 리뷰에는 발림성, 색감, 세정력, 백탁 유무 등 사용 전에는 알 수 없는 제품의 속성을 포함하고 있어 제품에 대한 판단을 하는 데 큰 역할을 하게 됩니다. 이렇게 쌓인 리뷰가 화해에는 현재 600만 개가 넘어가고 있습니다. 화해 리뷰는 좋은 점, 아쉬운 점을 구분하여 작성되기 때문에 실질적으로는 1,200만 개 이상인 셈입니다.

 

 

 

 

굉장히 길게 작성된 리뷰와 리뷰 6만여 개가 쌓인 제품

 

 

 

 

작성된 리뷰는 정형화되어 있지 않기 때문에 끝까지 읽지 않는 이상 정보를 정확하게 파악하기 힘들고, 내용이 길다면 사용자는 읽기를 포기할 수 도 있습니다. 정말 많은 리뷰가 쌓여있지만, 사용자는 모든 리뷰를 소화하기 힘든 것이죠. 그래서 만약 리뷰에 쓰인 제품 속성을 추출하고 주요한 속성정보만 사용자에게 제공하면 더 좋은 고객 경험을 만들 수 있지 않을까? 그리고 추출한 제품 속성을 정량화한다면 기존에는 알기 힘들었던 제품의 특징으로 볼 수 있지 않을까? 라는 가설 하에 리뷰에서 제품 속성을 추출하는 작업을 시작하게 되었습니다.

 

 

 

 

우선 자연어처리 분야에서 ‘토픽’은 문서 내에 등장하는 ‘주제’라는 의미로 사용되는데, 화해 리뷰에서는 ‘끈적거려요’와 같은 제품에 대한 속성 정보를 토픽이라는 용어로 정의하였습니다. 처음에는 단순하게 리뷰가 ‘좋은 점’과 ‘아쉬운 점’이 구분되어 있어서 키워드만 잘 추출하면 문제를 해결할 수 있지 않을까 생각했었지만, 아래와 같은 몇 가지 문제점이 존재하였습니다.

 

  • 꼭 좋은 점, 아쉬운 점에 맞는 의견만을 작성하는 것이 아님
  • 개인의 취향으로 인해 특정 토픽은 좋은 점에 존재할 수도 있고 아쉬운 점에 존재할 수도 있음

 

예를 들어 ‘약간 끈적거리는 게 좋아요’와 ‘약간 끈적거려서 별로예요’는 둘 다 끈적거린다는 특성을 말하고 있지만 취향에 따라 전자는 좋은 점에, 후자는 아쉬운 점에 적힐 수 있습니다. 이러한 이유로 단순하게 키워드 추출로 문제를 해결하기는 어렵다는 판단을 하였고, 리뷰에서 제품 속성 정보를 End-to-End로 추출할 수 있는 딥러닝 모델을 개발하게 되었습니다.

 

 

 

 

추출해내야 하는 토픽 80여 개

 

 

 

 

One-input and Multi-outputs

 

결과적으로 모델 구조는 Tensorflow2를 활용하여 Multi-Outputs 구조 기반의 binary-classification으로 설계하였습니다. 해당 구조를 선택한 것은 아래의 조건 때문인데요.

 

 

 

 

모델을 설계하면서 설정하였던 분류 대상 토픽은 약 80여 개였습니다. 하지만 화장품의 특성은 그 이상으로 많고 앞으로 현업부서에서 필요한 토픽이 추가될 수 있기 때문에 위와 같은 조건이 필요하게 된 것인데요. 단순히 PLM에 MultiLabel Classifier를 붙여서 사용하게 되면 아래와 같은 문제점으로 인해 위의 조건을 달성하기가 꽤 까다로워지게 됩니다.

 

 

  1. 레이블링 된 학습데이터를 다시 한번 레이블링 해야 함

    결과적으로 150,000여 개의 데이터를 확보하여 모델을 학습하였는데, 만약 MultiLabel 방식이라면 새로운 클래스를 추가하기 위해서는 다시 전체 데이터를 스캔하여 해당 클래스에 대한 데이터가 있는지 재확인해야 합니다. 만약 데이터가 없다면 신규 데이터를 추가하여 기존의 클래스들에 대해 다시 레이블링을 진행해야 정상적인 학습이 가능해집니다. 즉, 엄청난 레이블링 리소스가 필요해집니다.

  2. 모델을 재학습시켜야 하기 때문에 Performance가 고정되지 못함

    클래스를 추가하게 된다면, 정확하게는 재학습이라기보다는 새로운 모델을 만드는 것이라고 볼 수 있습니다. 단지 하나의 클래스를 추가하기 위해 기존의 모델 Performance를 모두 버리고 새롭게 튜닝을 해야 하는 문제가 발생하는 겁니다. 즉, 지속적으로 많은 컴퓨팅 리소스와 시간이 필요해집니다.

  3. 만약 모델을 여러 개 만든다면 리소스 문제와 운영이슈가 발생함

    사실 문제를 해결하기 위해 각 클래스를 binary로 분류하는 여러 개의 모델을 만들 수도 있습니다. 하지만 PLM이라는 큰 사이즈의 모델을 사용하고 있기 때문에 여러 개의 downstream task 모델을 만든다면 엄청난 리소스가 필요해집니다. 또한 모델 파일도 여러 개 생성해야 하기 때문에 관리와 운영에도 큰 부담이 됩니다.

 

위의 문제점으로 인해 One-input and Multi-outputs 구조를 사용하게 되었는데요. 빌드된 모델의 모습은 마치 문어처럼 보이기도 합니다 🐙

 

 

 

 

Multi-Outputs 모델

 

 

 

Multi-Outputs 구조의 모델을 개발할 때 2가지 방법을 사용할 수 있었는데요. 이미 학습된 Layer는 Freezing 시키고 신규 Layer만 학습을 시키거나, 아예 따로 모델을 빌드하고 학습시켜 필요한 Layer만 떼내어 기존 모델에 붙이는 방식이 있었습니다. 개인적으로는 후자가 관리나 학습 차원에서 편리했던 것 같습니다.

def combine_model(base_model, add_model):
	# 추가할 토픽이 학습된 모델에서 PLM을 제외한 layer만을 가져옴
	for i in range(3,10):
	    print(add_model.layers[i])
	    if i == 3:
	        # 첫번째 레이어는 PLM에 붙이고
	        X = add_model.layers[i](base_model.layers[2].output[0])
	    else:
	        # 이후 레이어는 이전 레이어에 붙이자!
	        X = add_model.layers[i](X)
	
	outputs = base_model.outputs
	outputs.append(X)
	
	# 결합모델 생성
	combined_model = tf.keras.Model(inputs=base_model.input, outputs=outputs, name=MODEL_VER)
return combined_model

새로운 토픽이 학습된 layer를 기존 모델에 붙이기

 

 

Multi-Outputs 구조의 모델이 위의 문제점을 해결해주었지만 몇 가지 단점도 존재하였는데요. 대표적으로는 PLM 자체를 fine-tuning 할 수 없고 임베딩값만 활용해야 하는 점입니다. 하지만, 결과적으로 만족할만한 성능이 나왔기 때문에 큰 문제는 되지 않았습니다.

 

 

 

 

낚아챈 정보 살펴보기

 

개발된 모델은 꽤나 만족스러운 성능을 보였습니다. Classifier마다 조금씩 다르지만 약 0.85~0.95의 정확도를 기록하였습니다. 테스트를 위해 Slack에 연동하였고 이를 통해 화해팀 구성원들도 언제든 써보면서 새로운 아이디어를 얻을 수 있도록 하였습니다. 또한 추출 결과에 대하여 Feedback을 줄 수 있는 기능을 추가하여 모델 개선에 활용하였습니다.

 

 

 

 

Slack을 연동하여 낚아챈 정보를 쉽게 살펴볼 수 있도록 함

 

 

 

 

두 번째로 생각했던 활용방안인 제품 특징을 정의하는 것을 간단하게 검증해보았습니다. 바하(BHA) 성분은 대표적인 각질제거 성분으로 피부결 정돈을 위한 제품에 주로 사용됩니다. 비교를 위해 바하가 포함된 앰플 제품 하나와 포함되지 않은 제품 세 개를 선정하여 각 제품에 달린 리뷰들에 대해 토픽을 추출하였고, 이를 리뷰 수 대비 등장 비율로 살펴보았습니다.

 

 

 

 

 

 

 

위의 그래프에서 보시다시피 바하제품에는 다른 제품에 비해 각질이 제거된다는 의견이 압도적으로 많이 추출되었습니다. 또한, 각질제거로 인해 피부가 매끄러워졌다는 의미의 ‘매끄러운’ 토픽이 다른 제품에 비해 많이 추출되었습니다. 바하제품 특성상 다른 제품에 비해 ‘촉촉한’ 토픽은 상대적으로 적게 추출된 것을 확인할 수 있었습니다. 해당 검증을 통해 Metric 외의 정성적인 방식으로도 모델 성능을 다시 한번 확인하였고, 활용 가능성을 판단할 수 있었습니다.

 

 

 

 

정리하며

 

현재 화해팀에서는 해당 모델을 활용하여 사용자에게 더 많은 정보를 제공할 수 있는 기능을 개발하고 있고 곧 베타로 적용할 예정입니다. 이 외에도 리뷰검색, B2B 상품, 사용자 군집화 등 다양한 방면에 활용할 수 있도록 기획하고 개발 중입니다. 또한 모델을 고도화하기 위해 지속적으로 데이터를 수집할 수 있는 Pipeline 설계 및 PLM 고도화와 같은 작업을 진행하고 있습니다.

 

실제 모델을 개발할 때는 데이터 수집, 데이터 밸런싱, 데이터 augmentation 등 다양한 문제를 직면하였고, 이를 해결하기 위해 여러 노력을 하였는데요. 다음에 기회가 된다면 관련 내용들을 정리해보도록 하겠습니다.

 

감사합니다.

 

 

 


 

 

 

 

채용정보 확인하기

 

 

 

8
by nc nd