본문 바로가기
NLP

다중 감성(multi-class sentiment) 분류 모델 개발일지 - 1

by 방구석 몽상가 2019. 3. 9.
2019-03-08-multi-sent-1

목차

  • 개발 목표
  • 진행 상황
  • 추후 계획 및 아이디어

 

개발 목표

주로 감정 분석(sentiment analysis)은 긍부정 형식으로 양극(polar)의 형태로 분류를 하는 경우가 대부분이다. 하지만 감정을 긍정과 부정만으로 나누기에는 한계점이 많다. 예를 들면, 슬픈 영화에 대한 댓글 중 "너무 슬퍼 ㅠㅠ", "영화 보는 내내 자꾸 눈물이 흘렀어요 ㅠㅠ" 와 같은 댓글이 있다고 하자. 이 댓글들은 당연히 부정으로 분류될 것이다. 그러나 슬픈 영화인 것을 감안하면 슬프다는 의미는 곧 칭찬이며 이 영화에 대해 긍정적인 평가를 하고 있다는 것을 알 수 있다.

그렇기 때문에 특정 한글 텍스트에 대해 여러 가지 감정으로 분류하고, 추가적으로 분류된 감정에 맞는 이모지(Emoji)를 보여주는 것을 개발하려 한다.

참고 자료 : Multi-class Sentiment Classification on Twitter using an Emoji Training Heuristic

 

진행 상황

1. 방향 설정


팀원들과의 첫 회의에서 목표를 확정지었고 Trello를 통해 프로젝트 관리를 진행하기로 했다. 위 참고 자료 논문에서는 Twitter 데이터를 사용했는데 라벨링을 하는 법이 신박했다. Tweet에 쓰여진 이모티콘을 통해 라벨링을 하는 것이었는데 이를 한국 tweet에도 적용할 수 있나 살펴보니 영어권만큼 이모티콘을 많이 사용하지 않아 이 방법을 적용할 수 없었다. 그래서 군산대 감정 사전을 이용하여 문장 점수를 매겨 분류하는 방법을 고안했다. 하지만 이 감정 사전은 형태소 분석이 되어있지 않고 되는대로 다 쓴 느낌이라 그대로 사용할 수 없어 전처리 과정을 거치기로 했다. 나는 한국어 형태소 분석에 대해 좀 더 알아보고 임베딩 방법을 생각하기로 했다.

2. 임베딩 아이디어

한국어 임베딩에 관한 정보를 찾아보니 많은 좋은 글들이 있었는데 그 중 한국어를 위한 어휘 임베딩의 개발 글이 내가 원하던 느낌이었다. 일단 1편에서는 왜 한국어 임베딩를 할 때 FastText가 좋은지 설명하고 있다. 결론만 정리하면 Word2Vec에 비해 다양한 언어에서 어휘의 구문적(syntactic) 변화 규칙을 잘 잡아내고 더 적은 양의 텍스트 데이터 상에서도 효과적이며, 학습 시 나타나지 않았던 어휘들에 대해서도 양질의 임베딩 벡터를 만들어낼 수 있다. 2편에서 FastText를 사용하여 한국어 특성에 잘 맞는 임베딩을 하는 방법을 설명하고 있다.

예시로 "먹었다" 라는 단어를 보자.

먼저, 단어를 자모로 구분하고 종성이 없는 글자는 종성 자리에 'e' 를 채워넣는다. 이는 종성의 부재를 나타낸다. 그리고 양 끝에 단어의 시작과 끝을 나타내는 기호를 추가한다.

<, ㅁ, ㅓ, ㄱ, ㅇ, ㅓ, ㅆ, ㄷ, ㅏ, e, >

이제 이 배열에 FastText를 적용하면 되는데 일반적인 FastText와 달리 두 가지 종류의 자모 n-gram을 고려한다.

첫 번째는 글자 수준 n-gram이다. 종성의 부재를 나타내는 'e'를 추가했기 때문에 3개씩 끊어내면 글자 수준 n-gram이 된다. 예를 들어 unigram과 bigram을 추출하면 다음과 같이 된다.

(ㅁ, ㅓ, ㄱ), (ㅇ, ㅓ, ㅆ), (ㄷ, ㅏ, e), (ㅁ, ㅓ, ㄱ, ㅇ, ㅓ, ㅆ), (ㅇ, ㅓ, ㅆ, ㄷ, ㅏ, e)

두 번째는 인접한 글자들 사이에서 걸쳐있는 자모 수준 n-gram이다. 이러한 종류의 n-gram은 한국어 문법 규칙을 학습하기 위해 추가되었다고 한다. 예를 tri-gram을 추출하면 다음과 같이 된다.

(<, ㅁ, ㅓ), (ㅓ, ㄱ, ㅇ), (ㄱ, ㅇ, ㅓ), (ㅓ, ㅆ, ㄷ), (ㅆ, ㄷ, ㅏ), (ㅏ, e, >)

다행히도 이를 구현한 오픈소스가 github에 올라와있었다. > 오픈 소스

논문을 보면 네이버 영화 긍부정 리뷰 데이터를 통해 classifier를 구현했다고 나와있어 논문에 나와있는 것처럼 LSTM을 사용하여 분류 모델을 만들면 되지 않을까 하고 생각 중이다.

일단은 되는지 간단하게 테스트를 위해 위키피디아 한국어 데이터를 통해 임베딩 모델을 학습하기로 했다.

3. 임베딩 구현과정

위키피디아 한국어 덤프 파일 다운로드 (~articles.xml.bz2 사용)

덤프 파일을 추출하기 위해 wikiextractor 오픈소스를 사용했다.

위 명령문을 실행하면 여러 폴더 내 여러 문서로 나뉘어 저장되어 있는데 이를 copy 명령어를 통해 하나의 텍스트 파일로 합쳤다. copy를 실행할 때 인수를 상대 경로로 주니까 안 됐었다. 절대 경로로 주어야 한다.

하나의 파일로 합친 뒤에 해주어야 할게 있다.

각 문서마다 위와 같은 형식을 띄고 있어서 위 태그들을 지워주어야 한다.

그런 다음 논문의 FastText를 사용하기 위해 KoreanWordVectors를 clone 했다. Readme를 봤을 때 GNU make로 목적 파일을 만들어줘야 한다고 되어있지만 이미 오픈소스 내에 포함되어 있어 할 필요가 없었다.

위에 말한 자모로 학습하기 위해 스크립트를 실행했다.

하고나면 다음과 같은 결과를 얻을 수 있다.

참고 자료 : 한국어를 위한 어휘 임베딩의 개발, 딥러닝을 이용한 자연어 처리 입문

 

추후 계획 및 아이디어

일단 자모로 parsing 해놓기만 했기 때문에 오픈소스 내 FastText를 이용해서 .vec 파일을 만들고 Keras 모델에 가중치를 load할 생각이다. 이 코드를 참고할 생각인데 잘 될지 모르겠다.

대략적인 전체 모델의 구성을 생각해봤다.

모델 아이디어
wiki_kor dataset을 자모 데이터로 parsing
한국어를 고려한 FastText를 이용하여 Vector 생성
학습 모델 국
생성된 Vector를 Embedding Layer에 Load

대략적인 모델 구성은 위와 같이 하고 훈련 데이터는 tweet을 사용하는데 군산대 감정 사전을 통해 문장 점수를 매겨 해당 점수를 라벨로 사용하는 것을 생각하고 있다.


댓글