프로필사진

Odyssey Logbook

[Early project] 소비자의 리뷰에 근거한 제품 특성별 랭킹 산출

다각 2020. 3. 2. 16:46
  • 이 글은 다음의 논문에 근거하여 작성되었습니다 [논문 링크]
Kunpeng Zhang, Ramanathan Narayanan, and Alok Choudhary,
Voice of the Customers: Mining Online Customer Reviews for Product Feature-based Ranking, June 2010.

목차

  1. 기존 랭킹 시스템의 한계와 특성 기반의 랭킹이 필요한 이유
  2. 프로젝트 개요
  3. PageRank 알고리즘
  4. pRank 알고리즘
  5. 프로젝트에서 어려웠던 점과 보완 방향

1. 기존 랭킹 시스템의 한계와 특성 기반의 랭킹이 필요한 이유

많은 온라인 소매업체에서는 '인기순' 정렬 기능을을 제공하고 있다. 잘 팔리고 평이 좋은 제품을 우선적으로 노출해서 소비자의 선택을 도와주는 것이다. 하지만 그게 최선일까?

예를 들어, 나는 화장품을 고를 때 제일 먼저 보는 것은 '성분'이다. 민감성 피부이기 때문에 이게 나에게 트러블을 일으킬 지 안 일으킬 지가 주된 관심사이다. BB크림을 산다 할 때도 예외는 아니다. 하지만 대부분의 사람들을 BB크림을 살 때 커버력, 지속성, 발림성 등을 체크한다. 즉, 많은 사람들의 선호하는 제품의 특징과 개인이 선호하는 제품의 특징이 꼭 일치하지는 않는다는 얘기다.

또한, 화장품 성분표만으로는 이게 내 피부에 트러블을 일으킬 지 아닐 지 판단하기 어렵기 때문에, 나와 피부 타입이 같은 고객의 리뷰를 참고하여 최종 결정한다. 즉, 판매자가 제공하는 판매 페이지에 나온 정보보다 나와 같은 입장의 소비자가 쓴 리뷰를 훨씬 비중있게 반영하여 구매 결정을 한다는 얘기이다. 하지만 모든 리뷰를 다 읽기는 어렵고, 따라서 내가 원하는 특성에 맞는, 리뷰에 기반한 랭킹이 필요하게 된다.

이에 논문에서는, (1) 고객 리뷰 기반이라는 새로운 랭킹 산출 방식과 (2) 선호하는 제품 특성에 따라 달라지는 소비자 선호도를 구하는 방법을 제시한다.

고객 리뷰 기반으로 랭킹을 산출함으로, 고객 친화적이고 신뢰도 높은 랭킹을 얻어낸다.
제품의 특성, 기능에 따른 소비자 선호도를 반영하여 세분화되고 고객 맞춤형인 랭킹을 제공한다.

 

2. 프로젝트 개요

2-(1) 프로젝트의 흐름

  1. 특정 제품군에 대한 리뷰(코퍼스) 수집
  2. 제품군의 특성 식별
  3. 주관적인 견해를 밝히거나, 다른 제품과 비교하는 리뷰들을 추출하여 긍정/부정 라벨링 수행. (글이 주관적인지 아닌지 판가름하는 기준은 논문을 따름)
  4. 그래프를 그린다. 노드는 각각의 제품이며, 엣지는 제품 간 비교를 언급한 문장을 이용한다.
  5. 노드들의 스코어와 노드 간 엣지의 가중치를 구하고, 반복적인 연산을 수행한다. 논문의 pRank 알고리즘을 따른다.
  6. 제품 특성에 따른 각 노드들의 스코어, 즉 각 제품들의 스코어를 통해 상대적 품질을 알아낸다.

2-(2) 각 단계에서 쓰인 자료나 모듈

제품군을 '디지털 카메라'로 정하고, 아마존의 리뷰를 수집했다.

  • 데이터셋 준비
    . Amazon Review : Amazon Digital Camera Section에 있는 리뷰를 Scrapy를 활용하여 39,603개의 리뷰 크롤링
    . Julian McAuley Data : Julian McAuley Dataset에서 카메라에 관한 리뷰만을 필터링하여 58,281개의 리뷰를 추출 (다음과 같은 카테고리를 이용: Point & Shoot Digital Camera/ DSLR Cameras/ Mirror-less Camera)
    . 위의 두 데이터를 병합하고 중복을 제거하여 92,600 개의 리뷰 획득
    . NLTK를 활용하여 리뷰들의 문장들을 562,816개의 문장으로 분리
  • 제품군의 특성(Feature) 식별
    . 논문에서 제시된 카메라의 10개의 feature 준비
    . 시대의 변화를 고려한 5개의 추가적인 feature 고안 (많은 카메라의 소개 페이지를 보고 결정)
    . 리뷰에서 모델명이름을 찾아내는 과정에서는 정규표현식을 이용
  • 비교형 문장 식별 (CS/SS 감성 분석)
    . NLTK POS Tagging 이용, 비교형 POS인 JJR, JJS, RBR, RBS로 문장 필터링
        (JJR: Adjective, comparative/ JJS: Adjective, superlative/
         RBR: Adverb, comparative/ RBS: Adverb, superlative)
    . 비교형을 나타내는 54개의 키워드 이용 : Bing Liu가 제시한 63개의 비교형 단어에서 너무 일반적인 단어는 제외시킴
    . 결과적으로 약 150K개의 비교형 문장을 얻을 수 있었다. 이외에는 SS(주관형 문장)으로 분류
  • 긍정/부정 감성 분석
    . VADER sentiment analyzer를 이용 (논문에서 제시한 MPQA나 NLTK sentiment analyzer와 비교했을 때 정확도가 높은 편)

 

3. PageRank 알고리즘

이번 프로젝트에서 나온 pRank 알고리즘은 구글의 1998년에 제안한 PageRank 알고리즘에서 비롯되었다. (참고: PageRank 논문) PageRank의 기본 전제는, 하이퍼링크로 서로 연결되어 있는 문서에서, 인용과 참조를 많이 받을 수록 더 중요한 페이지다라는 것이다. (마치 논문의 피인용 횟수가 많으면 중요한 논문이라 여겨지는 것과 같이)


재귀적인(반복적인) 연산을 통해 PageRank score가 점점 수렴하는데, 이렇게 수렴된 각각의 노드들의 score로 순위를 매길 수 있다.


PageRank에 대해 쉬운 예제는 다음과 같다. (참고: eyeballs's blog)


PageRank의 수식은 다음과 같다.
$$
PR(A) = (1-d) + d(\frac{PR(T_1)}{C(T_1)}+ ... + \frac{PR(T_n)}{C(T_n)})
$$
여기서 $PR(A)$는 A라는 웹페이지(노드)에서의 페이지 랭크이며, $T_1, ... T_n$은 그 페이지를 가리키는 (인용하는) 다른 페이지들이다. d는 'Damping Factor'이며 일종의 bias라고 생각하면 된다. 보통 0.85로 계산한다. $C(T_1)$은 $T_1$페이지가 가지고 있는 링크의 총 갯수를 의미한다.

 

4. pRank 알고리즘

pRank 알고리즘은 제품에 대한 긍정적/부정적인 반응을 노드와 엣지의 가중치로 넣어준 알고리즘으로, 제품의 선호도 정보를 반영하여 랭킹을 산출하는 데에 용이하다. (이 선호도에 따른 가중치의 여부가 PageRank와의 차이점이다)
문에서는 다음과 같은 그림의 예시를 통해 pRank를 소개한다.

여기서 노드의 A, B, C, D는 A제품, B제품, C제품, D제품을 뜻한다. 

 

노드의 가중치는 SS(주관형 문장)에서 (긍정적인 문장의 총 개수)/(부정적인 문장의 총 개수)로 결정되며,
엣지의 가중치는 CS(비교형 문장)에서의 (긍정적인 문장의 총 개수)/(부정적인 문장의 총 개수)로 결정된다.


가중치를 계산할 때 n(부정적인 문장)==0일 경우 긍정적인 문장의 총 개수만을 세어 그것을 가중치로 결정한다.
엣지에서의 +/-는 비교 우위에 놓인 것을 + (positive)로 결정한다.


pRank 식은 다음과 같다.
$$
pRank(P) = [(1-d) + d \cdot \sum_{i=1}^{n}{1_{(P_i, P)}} \cdot pRank(P_i) \cdot C_e(P_i)] \times C_v(P)
$$
여기서 $C_e(P_i)$는 $P_i$에 대한 outbound link를 뜻하며, $C_v(P)$는 $P$제품 노드의 가중치를 뜻한다.

$1_{(P_i, P)}$는 $P_i$로부터 $P$ 방향으로 향하는 엣지가 있을 때 '1'의 값을 갖고 나머지는 '0'의 값을 갖는, 일종의 활성화 함수이다.

 

5. 프로젝트에서 어려웠던 점과 보완 방향

이 프로젝트에서는 '긍정/부정 감성'이나 '비교/주관'을 얼마나 잘 파악하느냐도 중요하지만 (이걸 잘해야 데이터가 많이 확보되니까) 리뷰에서 '특성'을 얼마나 잘 추출하냐도 중요하다. 어쨌든 '특성에 따른 순위'를 산출하는 게 목적인 프로젝트이기 때문이다. 논문에서는 10가지 특성을 제시하고, 그에 따른 동의어를 제공하고 있다.  

  

하지만 논문은 10여 년 전에 쓰여졌고, 이전에는 없거나 축소되었던 기능들이 카메라에 적극 탑재되기 시작했다 (예를 들면 영상 기능이나 모드 설정). 또한 예전에는 중요하게 여기지 않았는데 현대에서는 중요하게 여기는 특성들도 있었다 (카메라의 무게 등).

  

이에 5가지의 특성을 추가하여 모델링했다. 문제는, 기존의 특성에 대한 동의어는 논문 저자가 제공해줬는데 새롭게 추가된 특성은 동의어가 없다는 것이었다! 동의어 사전이 없을 경우 관련 특성이 리뷰에 등장해도 다른 단어라고 판단해서 빠트릴 수가 있다. 예를 들면, focus(초점) 기능이 리뷰에서 언급될 때는 다음의 단어들로도 언급된다. 'exposure', 'focus point', 'auto focus', 'face detect', 'manual focus', 'AF', 'evening', 'night'. 즉, "face detect를 잘해요."라고 얘기해도 이걸 'focus'와 연관 짓지 못한다는 것이다. 프로젝트 진행 당시에는 일일이 손으로 다 추가를 해줬지만(domain 지식이 필요한 일이었다), 부정확할 수 있는 방법이다. 이에 자연어처리(NLP)를 이용해 이 상황을 해결해보면 어떨까 한다. 리뷰에 나온 토큰들을 밀집 벡터로 표시하는 것이다. 다음과 같이 진행할 수 있을 것이다.  

  1. 리뷰를 토큰화+포스 태깅
  2. word2vec으로 임베딩
  3. 각 특성을 나타내는 대표 단어('focus', 'zoom', 'resolution' 등)의 밀집 벡터 확인
  4. 대표 단어들을 기점으로 클러스터링 (코사인 유사도를 기준으로)
  5. 클러스터링에서 일정 반경 내에 있는 n-gram을 특성을 나타내는 토큰으로 간주 (이 과정에서 '일정 반경'을 정하는 supervised-learning을 시행할 수 있다면 좋겠다)

특성을 정확히 찾아낸다면 코퍼스(문장)을 더 많이 확보할 수 있고, 그만큼 더 정확한 '제품 특성에 따른 랭킹 산출'이 가능하다.

 


 

정리
PageRank의 식과 비교해봤을 때 pRank는 각 엣지뿐만 아니라 노드 자체의 가중치도 가진다.
실제로 프로젝트를 수행하며 자기 자신으로 들어오는 엣지를 그려서, 그것을 노드 자체의 가중치라고 이해했을 때 알고리즘 설계가 더 용이했다.
PageRank 알고리즘을 응용한 또 다른 알고리즘으로는 TextRank(2004)가 있다. 키워드 추출이나 핵심 문장 추출에 쓰이는 알고리즘이다. 이에 대해서는 후에 문서 요약 (Text summarization) Task에 대해 얘기할 때 언급할 일이 있을 것이다.  

 

추가적으로, 랭킹을 산출했을 때 모델을 평가할 근거가 없다는 점이 아쉽다. 객관적인 평가 기준도 생각해봐야할 부분이다.