SentiWordNet과 감성분석

Posted by 적분 ∫2tdt=t²+c
2017.05.25 02:25 수업노트

이 포스팅은 2017년 1학기 <빅데이터 분석기법의 이해와 활용> 수업에서 사용한 발표자료를 정리하여 작성하였습니다.


감성 분석(Opinion Mining)이란

사람이 작성하는 텍스트 안에는 그 글의 주요 대상이 되는 주제(Topic)가 있을 것이고, 그 주제에 대한 글쓴이의 의견(Opinion)이 있게 마련입니다. 글의 대상이 되는 주제를 찾아내는 작업을 토픽 모델링(Topic Modeling)이라고 하며 이전에 다루었던 LDA와 같은 방법이 널리 쓰이지요. 이 기술은 자동적으로 텍스트가 다루는 주제가 무엇인지 계산해내는 방법을 제공합니다. 마찬가지로 그 주제에 대한 글쓴이의 의견을 파악하는 것을 감성 분석(Opinion Mining, 또는 감성분류, sentiment classification)이라고 합니다. 이 기술을 이용하면 어떤 글에 저자의 주관적인 의견이 반영되었는지, 아니면 객관적인 글인지, 만약 주관적이라면 긍정적인지 부정적인지를 판단해 낼 수 있습니다. 토픽 모델링과 마찬가지로 굉장히 넓은 분야에 활용할 수 있는 잠재력이 있는 기술이라고 할 수 있습니다.


감성 분석의 3가지 주요과제를 꼽자면 다음과 같은데요

  1. 텍스트의 주관-객관 극성 판단: 텍스트가 주관적인지 객관적인지 판단함
  2. 텍스트의 긍정-부정 극성 판단: 텍스트가 주관적일 경우, 긍정적인지 부정적인지 판별함
  3. 텍스트의 긍정-부정 강도 판단: 텍스트가 긍정/부정적일 경우 강하게 긍정/부정적인지, 약하게 그런지 그 강도를 판별함
이를 위해서는 어떤 표현이 긍정적인지 부정적인지를 정리해둔 사전이 반드시 필요하게 됩니다. '이런 단어가 있으면 글쓴이가 그것을 좋아하는 거다, 저런 단어가 있으면 글쓴이가 그것을 싫어하는거다'와 같이 컴퓨터에서 감성을 가르쳐줄 수 있는 가장 단순하면서도 효과 좋은 방법이기 때문이죠. 하지만 사람이 사용하는 수많은 단어를 일일히 수작업으로 긍정인지 부정인지 정리할 수는 없겠죠. 그래서 이 작업을 위해 Esuli와 Sebastiani는 기발한 아이디어를 바탕으로 SentiWordNet을 만들었습니다.

SentiWordNet을 소개합니다

SentiWordNet은 반지도학습 기법을 바탕으로 WordNet의 Synset에 감성스코어를 매긴 어휘사전입니다. 감성스코어는 긍정(P), 부정(N), 중립(O)으로 구성되는데요 한 synset에 대해 P + N + O = 1 이 됩니다. 만약 P = 1이면 그 synset은 강렬하게 긍정적인 의미인것이고, 반대로 N = 1이면 강렬하게 부정적인 의미겠지요. P =0, N = 0이라면 O=1일테니 그 synset은 완전 중립적인 것이구요.

POS

ID

Pos. Score

Neg. Score

Synset Terms

a

00001740

0.125

0

able#1

a

00002098

0

0.75

unable#1

a

00002312

0

0

dorsal#2 abaxial#1

a

00005599

0.5

0.5

unquestioning#2 implicit#2

어휘사전을 받아보면 위의 표와 같은 형식으로 구성되어 있다는 것을 알 수 있습니다. http://sentiwordnet.isti.cnr.it/ 에서 CC BY-SA 라이센스에 따라 자유롭게 배포되고 있습니다. Esuli 등이 이를 어떻게 구축하였는지 살펴보려면 먼저 WordNet에 대해서 알아봐야겠군요.


WordNet이 뭔가요?

WordNet은 1985년 프린스턴 대학에서 시작된 영어 의미 어휘목록 구축 프로젝트입니다. 현재 3.1버전까지 개발되었고 http://wordnetweb.princeton.edu/perl/webwn 에서 확인해볼 수 있죠. 쉽게 풀어 설명하자면 거의 어지간한 영어 단어들을 같은뜻별로 묶어서 synset이라는 것을 만들고 그 synset들 간의 관계를 정리해놓은 사전입니다.


위 그림을 보시면 민트색 사각형들이 각각 하나의 synset입니다. 영단어 형용사 good을 예로 들자면 이는 단순히 '좋다'는 뜻 말고도 '건강하다, 건전하다' 등 여러가지 의미가 있을 수 있습니다. good이 어떤 의미인지 명확히 하기 위해 그것과 같은 의미를 가지는 동의어들을 묶어서 synset으로 만들고, 거기에 뜻풀이를 매겨놓죠. 위의 홀로 있는 good Synset은 '좋다'는 의미고, good, sound synset은 '건전하다'는 의미겠죠? 그리고 그 synset이 다른 synset과 어떤 관계가 있는지 다 연결해줍니다. 예를 들어 유사한 의미나 반의어도 있겠고, 상위어/하위어나 부분어 등도 표현합니다. 이로써 하나의 synset은 명확한 의미를 가지게 되고, 그 의미와 관계가 있는 다른 의미들도 쉽게 찾을 수 있게 됩니다. 현재 3.1버전에서는 명사, 형용사, 동사, 부사를 대상으로 약 11만개의 synset이 구축되어 있습니다.

(이 좋은 녀석을 구축해준 프린스턴 대학에 감사를 드릴뿐이죠)


그래서 SentiWordNet을 어떻게 만들었나요?

Esuli와 Sebastiani의 전략은 다음과 같습니다.[각주:1]

  1. synset 중 일부를 사람이 긍정/부정/중립으로 라벨링한다
  2. WordNet의 관계를 활용해 긍정/부정/중립 synset 목록을 확장한다
  3. 긍정/부정/중립 synset의 뜻풀이(gloss)를 스테밍하고 벡터화한다
  4. synset의 벡터를 입력으로, 긍정/부정/중립을 출력으로 하여 분류기를 학습니다.
  5. 이 분류기를 전체 synset에 적용하여 모든 synset을 긍정/부정/중립으로 분류한다.

11만개의 synset마다 일일히 수작업으로 감성 스코어를 매기는 것은 불가능한 일입니다. 대신 일부 synset만 정확하게 긍정/부정을 매기고, WordNet의 synset 관계를 이용해 긍정/부정 단어 집합을 자동적으로 확장해보면 어떨까요?


편의를 위해 을 최초 긍정 단어 집합, 을 최초 부정 단어 집합이라고 하겠습니다. i번 확장을 거친 긍정 / 부정 단어 집합은 

라고 할게요.

확장 과정은 다음과 같이 정의할 수 있습니다.

확장된 긍정 단어 집합 = 기존 긍정 단어 집합 + 기존 긍정 단어들의 유의어들 + 기존 부정 단어들의 반의어들

긍정적인 의미의 단어와 유의한 단어 역시 긍정적인 단어일것이고, 반대로 부정적인 단어의 반의어 또한 긍정적이겠죠. 이를 이용하여 긍정 단어 집합을 확장시키는 것입니다. 마찬가지로 부정 단어 집합도 확장시킬 수 있습니다.

이를 수식으로 쓰면 아래와 같겠죠.

이 확장과정을 여러번 거칠수록 전체 긍정 단어, 부정 단어 목록은 늘어날 것입니다. 대신 그 정확도는 조금 떨어질수도 있겠죠.

자 이제 중립인 단어 집합을 구해봅시다. 가장 간단한 것은 전체 synset 중에서 어느 쪽에도 속하지 않은 여집합들을 모두 중립이라고 정의할 수 있을 겁니다. Esuli 등은 여기에 General Inquirer lexicon에서 긍/부정 어디에도 분류되지 않은 어휘목록도 추가하여 중립 단어 집합을 구축했다고 하네요.


이렇게 최종적으로 긍정 단어 집합, 부정 단어 집합, 중립 단어 집합을 구했으니, 분류기를 생성할 차례입니다. 하나의 단어를 긍정/부정/중립 중 하나로 분류해야 하므로 다음과 같은 전략 중 하나를 고려해볼 수 있겠죠.

  1. 중립/비중립을 분류하는 이항 분류기 + 비중립일 경우 긍정/부정을 분류하는 이항 분류기
  2. 긍정/비긍정을 분류하는 이항 분류기 + 부정/비부정을 분류하는 이항 분류기 (긍정+부정 또는 비긍정+비부정으로 분류된 경우 중립이라고 처리함)
  3. 긍정/부정/중립을 분류하는 다항 분류기
실험 결과 2번이 가장 좋은 결과를 냈다고 하네요. 분류기에 사용할 입력값은 어떻게 만들었을까요? 각 synset에는 그 synset의 의미를 설명해주는 간략한 gloss(뜻풀이)가 달려 있습니다. 뜻풀이라는 특성 상 너무 어렵거나 다양한 단어가 잘 안 쓰이고, 문장도 단순하다는 특징이 있겠죠. 따라서 이 gloss를 가지고 정보검색 분야에서 흔히 사용하는 stemming, 불용어 제거 후 tf-idf 가중치를 이용해 벡터화하였다고 합니다. 최종적으로 모든 synset의 gloss이 tf-idf를 통해 벡터로 변환되었고, 그 중 긍정/부정/중립으로 매겨진 synset을 가지고 분류기를 학습할 수 있겠죠. 이렇게 학습된 분류기를 모든 synset에 적용해서 모든 synset이 긍정/부정/중립 중 한 곳으로 분류해냈습니다.

자 문제는 단어 집합을 몇번이나 확장할 것인지, 분류기 학습 모델로 무엇을 사용할 것인지를 정해야합니다. 앞서 언급했듯이 확장과정을 거칠수록 긍/부정 분류의 정확도는 낮아지지만, 전체 재현율은 높아지고, 확장 과정을 거치지 않을수록 재현율은 낮지면 정확도는 높아집니다. 분류기도 SVM이냐 NB냐 Rocchio냐에 따라 긍부정 분류 비율에 영향을 미쳤다고 하네요.
저자들은 이 문제에 대해 의외로 쿨한 해결책을 내놓았는데 확장 횟수는 0, 2, 4, 6번, 분류기는 Rocchio, SVM인 경우를 모두 반영하기로 했습니다. 즉 확장횟수 4가지, 분류기 2가지이므로 총 8가지의 조합이 나오고, 이 8가지 분류기의 결과가 예를 들어 긍정 5번 부정 1번 중립 2번으로 나온다면 감성 스코어를 (P, N, O) = (0.625, 0.125, 0.25) 로 매기기로 한 것입니다.


이 방법이 엄밀한지는 모르겠지만, 나쁘지 않은 발상인듯합니다.


SentiWordNet 3.0 업데이트

WordNet이 업데이트됨에 따라 SentiWordNet도 같이 업데이트되었는데, 3.0버전에서 새로 도입한 방법이 아주 신박합니다. 기본적으로 위에서 제시한 방법을 사용하되, Random Walk Model을 이용한 긍정/부정 점수 전파 방법을 병행했습니다.[각주:2] 앞서 언급했듯이 WordNet의 synset들은 뜻풀이를 가지고 있습니다.

bad : having undesirable or negative qualities

bad synset의 뜻풀이는 위와 같습니다. 여기서 bad는 정의당하는 항이므로 피정의항(definiendum)이라고 하고, having undesirable~~ 은 정의하는 항이므로 정의항(definiens)이라고 한답니다. (어려운 영어단어처럼 보이시겠지만 사실 라틴어 어미를 잘보면 의미가 뻔하게 보이는 단순한 라틴어 분사일뿐입니다 ^^) 여기서 재밌는 가정을 도입하는데요

  • 정의항에 긍정적인 단어가 많을수록 피정의항이 긍정적인 단어일 확률이 높다
  • 정의항에 부정적인 단어가 많을수록 피정의항이 부정적인 단어일 확률이 높다

그럴싸합니다. 이를 다르게 표현하면 정의항 -> 피정의항으로 향하는 네트워크를 그릴 경우 긍정/부정 점수는 정의항->피정의항으로 연결되는 링크를 타고 흐른다는 것이죠. 네트워크 이론을 공부하신 분들은 감이 오실겁니다. 어디선가 많이 본 그 모델. Random Walk Model(or Random Surfer Model)이죠. 이에 속하는 대표적인 것에는 PageRank(이전글을 참조)가 있고, 실제로 Esuli 등은 정의항 -> 피정의항으로 연결한 그래프에서 긍/부정 스코어를 전파하는 과정이 PageRank 변형의 일종이라는 것을 증명해냈습니다.[각주:3]


다만 gloss는 단어로 구성되어있지 synset으로 구성되어 있는 것이 아니므로 정의항(synset) - > 피정의항(synset)으로의 그래프를 그리는데 바로 사용할 수가 없었습니다. 그래서 synset의 gloss도 synset으로 분석되어 있는 eXtended WordNet을 이용해 정의항 -> 피정의항으로 연결되는 그래프를 그릴 수 있었다고 합니다.


이렇게 얻은 synset 간 그래프를 바탕으로 긍정적인 단어에 대해서 한 번, 부정적인 단어에 대해서 한 번 PageRank를 계산함으로써 긍정 가중치 / 부정 가중치를 구할수 있겠죠. 하지만 널리 알려져 있다시피 PageRank로 구한 가중치 값은 멱법칙을 따르고, 또한 모든 노드의 가중치 합이 1이 되기 때문에, 각각의 노드들의 가중치는 1에 비하면 터무니 없이 작다는 것이죠. 이 값을 그대로 사용할 경우 대부분의 synset들은 중립으로 치우치게 결과가 나올 수 있으므로, 적절한 수치가 되도록 긍정 가중치 및 부정 가중치를 정규화했다고 합니다.


마무리: 한국어는..?

SentiWordNet은 위와 같은 방법대로 WordNet의 특성을 최대한 활용해서 효율적이면서 높은 품질의 감성 사전을 구축할 수 있었습니다. 논문 읽으면서 '같은 방법을 한국어 감성 사전 구축에 적용할수는 없을까?' 고민해보았는데요, 그전에 한국어에는 영어의 WordNet처럼 범용적이면서도 검증된 의미 어휘 사전이 부족해서 쉽지 않을 것 같습니다. 표준국어대사전을 날로 사용하기에는 어려움이 많을듯하구요, 한국어 NLP의 갈 길은 멀고도 험하다는 생각을 하며(하지만 그래서 할 일이 많다는 생각을 하며!!) 논문 읽기를 마치게 되었답니다.

  1. Esuli, Andrea, and Fabrizio Sebastiani. "SENTIWORDNET: A high-coverage lexical resource for opinion mining." Evaluation (2007): 1-26. [본문으로]
  2. Baccianella, Stefano, Andrea Esuli, and Fabrizio Sebastiani. "SentiWordNet 3.0: An Enhanced Lexical Resource for Sentiment Analysis and Opinion Mining." LREC. Vol. 10. 2010. [본문으로]
  3. Esuli, Andrea, and Fabrizio Sebastiani. "Random-walk models of term semantics: An application to opinion-related properties." Proceedings of LTC 2007 (2007): 221-225. [본문으로]
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Tags
이 댓글을 비밀 댓글로
    • 2017.06.03 11:26
    비밀댓글입니다
    • 네 어휘들에 대해서 감성점수를 얻고, 이를 긍/부정의 의미로 쓸수는 있겠죠.
      다만 SentiWordNet은 WordNet Synset에 감성점수를 부여한것이다보니 해당 어휘가 먼저 어느 synset에 속하는지를 변별하는 과정이 필요합니다.
      사실 한국어->영어로 번역하는 과정에서 이를 얼마나 정확한 synset으로 번역해낼수 있는지가 관건이 될거같네요.
      • 2017.06.03 20:16
      비밀댓글입니다
    • 네 말씀하신대로 gloss는 그 synset의 의미를 설명한 것일뿐(원래 WordNet Synset에 포함되어있어서 SentiWordNet에도 그대로 들어있는듯 합니다.), 실제 감정 스코어 계산시에는 Pos, Neg Score를 사용합니다.
    • 민철리
    • 2017.06.12 16:26 신고
    매우 유용한 정보입니다 퍼가요~♡

티스토리 툴바