본문 바로가기
Data

[NLP] 플랫폼 구현에 활용되는 짧은 길이의 자연어 처리 기술

by hyemjjang 2021. 8. 11.

현재 실습을 진행하고 있는 회사에서는 자연어 처리 기술을 기반으로 플랫폼을 구현하고자 하며, 이 중 내가 맡아서 공부한 부분은 짧은 길이의 자연어 처리 기술 구현이다. NLP라는 것은 상당히 큰 개념이기에 구체적으로 뭘 하고 싶은지에 따라 방향성이 완전히 달라지고, 그렇기에 내게 주어진 상황에 따라 어떤 기술이 필요할지 정리가 필요하다고 판단하였다. 분량상 구체적인 개념에 대한 내용은 취급하지 않으며, 단순히 전체적인 관점에서 어떤 식으로 찾아봐야 할 지 그 여정을 제시하기 위함이다. 

 

모든 기술은 상품명 데이터를 취급한다고 가정한다. 해당 데이터의 특징은 다음과 같다. 

1. 길이가 짧음 (문장과 달리 맥락이 존재하지 않음)

2. 학습되지 않은 새로운 단어가 많이 등장

3. 한국어

 

내가 가지고 있는 데이터는 두 가지 변수를 지닌다

1. 상품명

2. 카테고리 (대분류-중분류-소분류로 나누어짐)

 

과제는 크게 두 가지로 나뉘었다. 기능의 측면에서 나눈 것이다. 

1. 사용자가 입력한 키워드를 통해 자동 카테고라이징

(ex) 당근마켓에서 사용자가 판매상품 키워드를 입력할 때, 자동으로 추천 카테고리가 3개 노출됨 

2. 사용자가 선택한 문장 데이터와 유사한 문장 데이터 추출 

-> 딥러닝 기반 챗봇 개발에도 많이 사용된다 (사용자가 문장 입력시 -> 유사한 문장 추출)

-> 이 과정에서 수행되는 유사도 분석은 자동 카테고라이징 과정 등에 활용되는 기반 기술이다

 

유사도 분석에 대한 사담

더보기

자연어 처리 방식은 단어 간 유사도를 계산할 수 있는지, 없는지에 따라 구분될 수도 있다. 벡터화 과정에서 단순히 빈도수만을 채택하기에 유사도를 계산할 수 없는 tf-idf도 그렇고, pre-training 과정에서 마스킹된 단어를 독립적으로 판단하기 때문에 앞/뒤 단어의 의존관계를 고려하지 못하는 AE도 그렇다. 

즉, 유사도를 분석해서 이를 기반으로 카테고라이징을 구현하는 방법도 있고, 유사도와 관계 없이 카테고라이징시키는 방법도 있다는 것이다. 물론 BERT로도 유사도 분석을 할 수 있다.. 다만 유사도를 먼저 분석하여 이를 모델에 활용하는 방식과, 해당 모델에서 벡터화된 내용을 토대로 유사도 분석이 가능한 형태는 분명 다른 것이라고 생각한다. (생각보다 복잡해서 내가 잘못 이해한 것일 수도 있음..)

 

암튼 사실 회사에서 요구한 것은 "유사도 분석"이었다. 여기서 문제는 어떤 기능을 위해 유사도 분석을 구현해야 하는지에 대한 설명이 부족하다는 것이다. 처음에는 상품명 데이터를 주고 해당 데이터를 군집분석하여 라벨링하라는 황당한 과제를 주었다. 왜 이미 라벨링 되어 있는 데이터를 비지도학습으로 구하는 것인지 이해가 되지 않아 결국 지도학습으로 바꿨지만,,, 결론적으로는 PLM을 활용하여 상품명 데이터를 자동으로 카테고라이징 하는 방식을 탐색했다. 그 이후 나온 추가과제가 유사도분석이다. 도대체 전에 했던 과제와 어떤 연관이 있는지 아직도 모르겠다. (군집분석에 너무 꽂히신 듯) 

 

내가 추론한 바에 따르면 회사는 두 가지 기능을 고려하고 있는 것 같다

1. 추천 검색어 (사용자가 입력한 키워드와 유사한 검색 키워드 추천)

2. 검색으로 도출된 데이터에서, 사용자가 하나의 결과 데이터를 클릭하면 (인풋) 해당 데이터와 비슷한 다른 결과 데이터를 동시에 노출시키는 형태 (아웃풋) 

 

굳이 유사도분석을 따로 빼서 강조한 이유는 이러한 기능 때문이 아닐까..? 후자가 더 중요한 기능일 것이라 생각한다. 그러므로 유사도 분석 측면에서는 지금까지 했던 짧은 글(키워드) 단위가 아니라 '문장단위'로 그 범위를 달리해야겠다. 


 

막상 해보면 알겠지만 대부분의 (semantic) text classification 문제가 혼재되어 있기에 굉장히 헷갈린다. 

생각해보면, 자연어를 분석하여 핵심적인 내용(빈도수가 높거나, 나오는 형식이 보편적이라던가 등)을 추출하는 거나 내용이 비슷한 단어를 묶는 거나 한 끗 차이이다. 


자연어 처리 방법은 크게 4가지 단계로 이루어진다.  (전체 flow의 정리가 잘 되어 있는 링크)

 

EDA 및 전처리 -> 벡터화 & 토큰화 -> 모델 학습 (hyperparameter tuning 포함) -> 평가

 

이때 요즘 자연어처리에서 활발히 사용되는 PLM (Pre-training Language Model)의 경우 제공하는 해당 모델에 적절한 형태로 벡터화&토큰화시키는 과정이 필수적으로 포함되다 보니 벡터화와 모델학습 부분이 섞인 것처럼 느껴지기도 한다. 또 PLM을 다른 분류기로 추가 학습시키는 것이 가능하다고는 하지만 워낙 모델이 크다 보니 효율이 안 좋고..  

 

그렇기 때문에 내가 구현하고자 하는 목적에 집중하여 해당 목적을 구현하기 위해 어떤 과정이 필요하고, 해당 과정에서 가장 성능이 좋은 방식이 무엇인지 찾아보는 것이 가장 중요하다고 생각한다. 문제가 복잡할수록 재정의를 통해 관점을 단순화시키는 태도가 필요하다. 

 

사실 나도 아직 배우는 학생이고, 이 회사는 얼레벌레 회사라 누군가에게 배우는 형식이 아니라 내가 알아서 찾아 배우고 구현하고 보여줘야 하는 시스템이다. 그렇기 때문에 잘못된 내용이 있을 수 있다. 그러므로 지적은 언제나 감사합니다. 


1. 사용자가 입력한 키워드를 통해 카테고라이징

  • 키워드는 짧은 (2-10) 길이의 자연어이다
  • 사용자는 '상품명'을 입력하고, 이는 자동으로 카테고라이징된다 
  • 학습 데이터는 이미 카테고리별로 라벨링되어 있다

현재 설명하는 내용은 기본적으로 캐글코리아 챗방의 현업자 분들의 이야기에서 많은 도움을 얻었다

현업에서 자주 사용되는 것은 기본적으로 TF-IDF, Sent2vec, fasttext, Sentence BERT 라고 한다

 

단순 빈도수인 TF-IDF는 다양한 분류기에 적용하여 성능을 개선할 수 있다. 매우 간편함

 

Sent2vec은 Word2vec의 CBOW를 변형한 것으로, 서브샘플링을 하지 않고, 다이나믹 컨텍스트 윈도우를 사용하지 않는다는 차이점이 있다. Sent2vec 설명

Word2vec은 대표적인 word embeding 모형으로, 사실상 NLP의 가장 기본적인 개념이라고도 볼 수 있다. 사실 당연하다.. 컴퓨터가 자연어를 이해하게 만들기 위해서는 이를 숫자로 바꿔주는 벡터화 과정이 필요하고 semantic word embeding(의미를 담아 벡터화하는 형태) 모델의 대표주자가 바로 word2vec이다. 

 

fasttext는 word embeding 및 sentence classification을 위해 facebook에서 만든 라이브러리이다. 비교적 짧은 단어에도 적용 가능하고, 157개국의 다국어 학습 모델을 지원하여 한국어로도 성능이 좋다는 장점이 있다. 

 

Sentence BERT는 BERT에 siamese, triplet 구조를 적용하여 연산량의 한계를 극복한 모델이다. (large scale 데이터 처리 가능) 추가적으로 해당 모델의 경우 컴퓨팅 비용이 너무 많이 든다는 단점이 있는데 최근 이를 개선한 Augmented SBERT를 개발했다고 한다. 잘 설명된 블로그

BERT의 경우 성능은 좋지만 모델이 너무 무거워 꾸준히 업데이트하기 쉽지 않다

 

  • 하지만 그럼에도 짧은 상품명에 대한 성능은 좋지 않다
  • 특히 Word2vec은 아예 모르는 단어에 대해 대응이 불가능하여 추가적인 모델링이 필요하다

그렇기 때문에 ELECTRA를 사용하는 경우도 있다고 한다 (몇몇 경우에서 XLNet보다 성능이 좋았다)

ELECTRA란 masking 대신 generator network를 통해 token을 적절한 대안으로 대체하는 방식으로 노이즈를 부여한다

자세한 내용은 논문을 참고하자

 

  • 제목 키워드만으로 추천할 경우 사실 제목이 같거나, 제목이 비슷한 상품만 추천될 가능성이 크다
  • 키워드 자체가 너무 짧고, 담고 있는 정보가 많이 없기 때문이다
  • 그렇기 때문에 카테고리 정보/태그 등의 메타정보를 추가적으로 사용하는 경우가 많다

 

결론적으로, 이 기능을 구현하기 위해 사용할 수 있는 모델들을 살펴보았다. 

 

상품명, 카테고리가 필수적으로 포함되어 있는 데이터셋을(여기에 추가정보 포함되어 있을수록 좋다) 전처리하여 모델에 훈련시키고 해당 모델을 서비스에 활용하여 사용자의 입력값을 그대로 모델에 넣으면 된다..


2. 사용자가 선택한 문장 데이터와 유사한 문장 데이터 추출

  • 문장 데이터는 Sentence Classification 및 각종 리뷰 분석 데이터에서 사용되는 정도의 길이라고 가정한다
  • 유사도분석을 통해 유사도가 높은 상위 데이터를 추출한다
  • 지도학습 (PLM) 및 비지도학습 (군집분석) 모두를 고려한다

여기서 군집분석이 고려되는 이유는 시각화를 위함이다. 유사도를 시각적으로 살펴보기 위해 군집방식을 고려한다. 단순히 '유사도가 높은' 결과값을 추출하기 때문에 군집분석 방식을 사용하는 것이다. 적어도 난 그렇게 생각한다...

 

단순히 유사도를 분석하기 위해 사용되는 기본 개념은 자카드 유사도, 코사인 유사도 , 유클라디언 유사도, 맨하탄 유사도이다. 하지만 이건 말 그대로 기본 개념이고 성능을 개선하기 위해서는 다양한 방식을 활용할 필요가 있다. 

+ 해당 개념을 활용하여 군집분석 하는 것도 가능하다. 이때 텍스트 분류에는 K-means 군집화가 많이 사용되는데 scikit learn에서 제공하는 K-means 함수는 유클라디안 거리를 활용한다. 하지만 이 블로그에 따르면, 자연어와 같은 고차원 데이터 처리를 위해서는 K-means를 코사인 유사도에 따라 계산해야 한다고 한다. 그렇기 때문에 Spherical K-means를 활용하도록 하자

 

앞서 설명했던 PLM 모델 및 word2vec을 통해 유사도를 계산하여 가장 유사한 텍스트 데이터를 도출할 수 있다. 

즉 Word2Vec, Sent2vec, Doc2vec, fasttext, 심지어 BERT로도 유사도를 도출할 수 있다. 

 

결국 유사도 분석은 어떤 식으로 벡터화를 하는지가 중요하기 때문에 이 부분을 찾아보아야 한다. BoW처럼 단순 빈도수만을 고려하는 것이 아닌, 속에 담긴 의미와 맥락을 고려하여 벡터화를 해야 이를 정확한 수치의 유사도로 계산해낼 수 있다. 

 

벡터화하여 유사도를 분석하고, 상위 n번째의 raw data를 표출하면 된다. 이 때 사용자가 새로 입력한 데이터 또한 벡터화하는 과정이 수식에 포함되어야 한다. 


추가 과제?

더보기

추가적으로 과제가 주어질 여지가 있다. 이는 구현하고자 하는 플랫폼의 형식을 보고 내가 추측한 필요 기능이다.

 


3. 긴 문장(raw data)에서 핵심 키워드 추출

(ex) 네이버 뉴스에서 제공하는 뉴스 3줄요약 서비스 

-> 긴 문장에서 키워드를 추출하고, 해당 키워드를 사용자의 검색어와 매칭하는 방법이 있고
상품데이터의 경우 상품의 설명글 데이터나, 사용자가 입력한 데이터에서 키워드를 추출하여 이를 태그로 이용하는 방법이 있다
이를 통해 검색 자체의 성능을 향상시킬 수 있을 듯

 

이 경우 Textrank를 활용할 수도 있고, BERT나 fasttext도 사용할 수 있다. 

과거 대학 졸업프로젝트로 도서 description 데이터에서 키워드를 추출하는 작업을 했는데, 그 때는 tf-idf로 단순 빈도수 기반 추출 방식을 사용했다 ... 성능은 나쁘지 않았다. 무엇보다 너무 간단해서 좋았음

 

만약 이 과제가 주어진다면 이에 대해서도 자세히 작성하려 한다. 지금은 스킵 ..^^



사실 추가적으로 내가 사용해보고 싶은 모델은 XLNet이다.. 일단 성능이 좋고,,, 또 한국에 관련 자료가 없어서 한 번 내가 공부해보고자 하는 욕심이 크다. 하지만 생각보다 시간은 없고... 그러므로 시간이 남으면 XLNet을 적용해보아야 겠다.