AI/정책 댓글 반응 NLP

[2] 감성어 사전 구축

eraser 2020. 4. 10. 19:45
반응형

 팀원 간 역할 분담을 통해 포털 사이트 뉴스 플랫폼(네이버, 다음), 유튜브, 커뮤니티(MLBPARK, 루리웹닷컴, 보배드림, 클리앙)에서 약 180만 건의 댓글 데이터를 확보했다. 0408 회의 이후, 데이터 취합 및 전처리, 감성어 사전 구축으로 인원을 분배하여 최대 3일 간 작업을 진행하기로 하였다. 나는 후자의 작업을 맡았다.

 

 해당 단계의 작업을 통해 얻고자 하는 결과물은, 문장별로 긍정/부정을 라벨링하기 위한 근거로서의, 형태소별로 구분된 긍정어/부정어 사전이다.

 

 


 

 

 

 

 

 

 

무조건, Narrow Down...

 

 

 

 

 

 

 


# 데이터

 

  인터넷 게시물, 댓글 데이터는 맞춤법이 제대로 지켜지지 않고, 신조어와 비속어가 많다. 우리 데이터의 특성을 고려한 감성어 사전을 구축해야 한다.

 

 그러나 180만 건의 데이터를 모두 형태소 단위로 분석하고 확인하는 것은 불가능한 일이다. 필터링이 필요하다.

 익명이고 상대적으로 짧은 길이로 작성할 수 있는 포털 사이트 뉴스 플랫폼이나 유튜브보다는, 활동 규정이 있고 길이 제한이 덜 한 커뮤니티의 게시글과 댓글이 형태소 분석에 용이할 것이라 보인다. 실제 크롤링한 데이터를 확인한 결과, 커뮤니티의 게시물에서 상대적으로(어디까지나, '상대적으로'임에 주의하자.) 띄어쓰기나 맞춤법이 잘 지켜지고 있음을 확인할 수 있었다. 따라서 커뮤니티 중에서 확보한 데이터 수가 가장 많은 MLBPARK와 클리앙의 게시물, 댓글을 형태소 단위로 쪼개고, 긍정과 부정을 나누어 사전 구축에 활용하기로 했다. 

 


# 형태소 분석기

 

 형태소 분석을 위해 형태소 분석기를 사용해야 한다. 파이썬에서 가장 유명한 한국어 처리 패키지는 KoNLPy이다. 이 패키지는 5가지의 형태소 분석기(Okt, Komoran, Kkma, Mecab, Hannanum)를 지원한다.

 

 각 형태소 분석기의 특징을 설명해 놓은 것은 많지만, 직접 부딪혀 보는 것이 제일 낫겠다 싶었다. MLBPARK와 클리앙에서 확보한 데이터를 5가지의 형태소 분석기를 모두 활용해 형태소 단위로 분석했다.

 

 데이터를 문장 단위로 나누어 각각의 형태소 분석기를 돌리고, 그 결과를 가나다 순으로 정렬했다. 

 

 우선, Komoran은 시간이 너무 오래 걸리고, 처리 과정에서 자꾸 오류가 나서 배제하기로 했다. 시간이 한정되어 있기 때문에, 분석기 선택 단계에서 오류를 일일이 찾아보고 해결할 수가 없다. 안녕.

 

 

 

 

 

 Hannanum 분석 결과

 

 

 

 

 다음으로, Hannanum을 배제한다. 시간이 오래 걸릴 뿐더러, 분석 결과에 이상한 문자열들이 나온다. 이모티콘인지, 한글 단어인지 알 수는 없지만, 역시 한정된 시간 속에서 저 요상한 문자열들이 무엇인지 분석하기에는 어려움이 있다. 나중에 더 자세히 살펴보기로 하고, 지금은 안녕.

 

Kkma 분석 결과
Mecab 분석 결과
Okt 분석 결과

 

 남은 세 가지의 분석기 중, 직관적으로 의미를 이해하기 좋은 것은 Okt이다. Kkma, Mecab에 비해 나누는 단위가 상대적으로 큼직(?)하다. 신조어, 인터넷 용어, 비속어 등을 파악하기 쉬울 것이라 보인다. 분석에 시간이 가장 적게 소요되는 것은 Mecab이다. 체감상 몇 분도 되지 않아 모든 처리가 완료된 것 같다🤭

 이에, Mecab과 분석 결과가 크게 다르지 않고, 시간이 오래 걸리는 Kkma는 배제하기로 했다.

 

 Okt와 Mecab으로 최종 후보를 추렸다. Okt는 의미를 직관적으로 파악할 수 있고, 결과 데이터의 크기가 더 작다. 다 좋았지만, 한 가지 치명적인 단점이 있었다. 분석 시간이 너무 오래 걸린다. 지금 단계에서도 분석 시간이 오래 걸리는데, 이후 단계에서 댓글 데이터를 모두 활용해 품사를 태깅해야 한다면, 분석에 소요되는 시간이 제일 중요한 판단 기준이 된다.

 

 따라서, Mecab으로 형태소를 분석하고, 사전을 구축하기로 한다.

 


 

# 활용할 품사

 

불용어 처리에 대한 고민

 원래는 형태소를 분석하고, 불용어 처리를 먼저 진행해야 한다. 그러나 불용어를 일일이 제거하기 보다는, 긍정/부정을 파악할 수 있는 품사를 선택하는 게 효율적이다. 말하자면, 사용할 품사만 선택하면 사용하지 않아도 되는 품사는 자동적으로 불용어가 되는 것이다. 따라서, (적어도 지금) 이 단계에서는 불용어 사전 구축을 고민하지 않는다.

 

 Mecab 형태소 분석기로 MLBPARK와 클리앙 데이터를 분석하면, 48000개 정도의 형태소가 나온다. 전부 다 확인할 수 없을 뿐더러, 모든 품사가 긍정어, 부정어 파악에 활용되는 것은 아니므로, 어떤 품사를 사전 구축에 활용할 것인지 결정해야 한다.

 

 

 Mecab의 품사 태그 분류는 다음에서 확인할 수 있다.

https://docs.google.com/spreadsheets/d/1OGAjUvalBuX-oZvZ_-9tEfYD2gQe7hTGsgUpiiBSXI8/edit#gid=0)

 

 우선, 긍정 지정사(VCP)와 부정 지정사(VCN)는 각각 긍정, 부정으로 태깅하기로 했다. 형태소 분석기로 돌린 결과가 긍정, 부정이니 객관적인 판단 근거가 될 수 있다.

 그리고 멘토링에서 들은 조언에 따라 부사(MAG), 형용사(VA), 동사(VV)를 포함하기로 했다. 한국어에서 사람의 판단이나 정서를 설명하는 단어가 많이 존재하는 품사군이다. 그리고 실제 필터링을 통해 분석 결과를 확인했을 때, 쉽게 긍/부정을 판단할 필요가 있는 단어가 많았때문이다.

 이후 모든 품사군을 하나씩 필터링해서 살펴 보며, 긍정과 부정을 판단할 수 있는 품사를 선택하기로 했다. ㅋ, ㅎ 등의 인터넷 용어나 비속어 등이 감탄사로 분류되기 때문에 감탄사(IC)를 포함했다. 또한 어근(XR)으로 분류된 것들 중에서도 긍정과 부정을 파악할 수 있는 단어가 많다고 생각해 어근을 분류 대상에 포함했다.

 가장 판단하기 어려웠던 품사는 명사였다. 명사라는 품사의 특성상, 긍정, 부정을 판단하기 어려운 형태소들이 대부분이다. 예컨대, '회사'는 긍정적인 단어인가, 부정적인 단어인가? '대통령'은? 이런 생각을 하면 명사는 배제하는 게 맞다. 그러나 모든 형태소 분석의 기본이 명사이고, 실제로 48000건 중 명사로 분류된 것만 18000건 정도일 정도로 명사가 많았기 때문에 함부로 배제하기도 어려웠다. 치열한 논의를 거친 끝에, 명사는 기본 모델링 + 단어 빈도 분석을 진행한 후 사전을 보완하는 단계에서 포함하기로 했다.

 

 따라서, 우리는 Mecab 기준 VCP, VCN, IC, MAG, VA, VV, XR으로 태깅되는 형태소들, 그리고 이 형태소가 포함되어 있는 태그들(예를 들어, VX+EC+VCP 등)을 감성어 사전에 포함시키기로 했다.

 

 이렇게 추리자, 총 13000개 정도(...)로 데이터의 범위를 줄일 수 있었다.

 

 

 

 

 

하하... 다 확인할 수 있겠지?

 

 

 

 

 


# 사전 구축 근거

 

 우리 팀만의 감성어 사전을 구축하기 앞서, 근거가 될 수 있는 사전이 필요하다고 판단했다. 자연어 처리, 그리고 감성어 분석은 언어학, 심리학 등 다양한 학문 분야에 걸쳐 방대한 양의 domain 지식이 기반이 되어야 하는 작업이다. 그러나 시간적인 한계로 인해 학술적 지식을 바탕으로 한국어를 분석하여 사전을 구축할 수 없기 때문에, 최소한의 근거가 될 사전 혹은 논문을 찾아봐야 겠다고 생각했다.

 

 그러나 웹 상에 공개되어 있는 한국어 감성어 사전은 많지 않았다. 한국어 자연어 처리에 많이 이용되는 감성어 corpus로 박은정 님의 네이버 영화 리뷰 데이터를 찾을 수 있었으나, 문장 단위로 라벨링되어 있기 때문에 우리 팀에서 의도하는 단어 단위 분석에는 적용하기 어려울 것이라 판단했다.

 학술 논문이나 오픈 API 서비스를 활용하려 했으나, 논문의 경우 유료인 경우가, 오픈 API 서비스의 경우 서비스 제공이 중단되거나 데이터 양이 많지 않았다는 어려움이 있었다.

 

 마침내 군산대학교에서 만든 KNU 한국어 감성사전을 활용하기로 했다. 구축 방법 및 모델링 방식이 공개되어 있는 사전들 중 가장 신뢰할 만하다고 판단했기 때문이다.

 

 이 사전에 존재하는 단어들을 기반으로, 우리가 가지고 있는 데이터 단어들을 추가하며 감성어 사전을 구축하기로 했다. 그 방법은 다음과 같다.

 우선, KNU 감성어 사전에 있는 단어들을 Mecab을 활용해 형태소 단위로 분석한 뒤, 우리가 활용할 7가지의 품사가 들어 있는 형태소들만을 선택했다. 그리고 긍정어 사전에 있던 형태소들에는 1을, 부정어 사전에 있던 형태소들에는 -1을 태깅했다.

 다음으로, 태깅 결과를 확인했다. KNU 사전에는 한 단어만 있는 것이 아니라 2-gram, 3-gram 등도 있기 때문에, 앞뒤에 쓰인 단어에 따라 똑같은 형태소가 때에 따라서는 긍정과 부정 두 가지 모두로 태깅되기도 한다. 이 경우, 국어사전과 우리의 데이터 셋을 확인해 어떠한 용례로 쓰이는지 파악하고, 두 가지 용례로 모두 사용되는 경우 태깅을 제거했다.

 이후, KNU 사전에서 태깅한 결과를 기존에 추려 놓은 13000개의 형태소 데이터셋에 합치고, 가나다 순으로 정렬했다. 이후 단계에서 분석된 형태소들 중 KNU 사전의 어근이 기반이 되는 경우, KNU 감성사전을 바탕으로 태깅한 결과를 따랐다. (예컨대, KNU에서 '망'이 -1로 태깅되었기 때문에, '망했', '망쳤' 등의 경우 모두 -1로 태깅하는 것이다.)

 


 

 

# 최종 사전 구축 원칙

 

 본디 감정이란 굉장히 주관적이다. 각 개인이 단어를 사용할 때 그 안에 담는 감정도 주관적일 수밖에 없다. 따라서 기본적으로 다음의 두 가지 원칙을 고수했다.

 

 첫째, 판단 근거의 우선 순위는 표준국어대사전 뜻풀이, 네이버 국어사전 뜻풀이 및 예문, MLBPARK 및 클리앙 데이터 사용 용례이다.

 둘째, 절대 혼자의 판단으로 태깅하지 않는다. ㄱ-ㅂ까지는 세 명의 팀원 중 2명 이상이 동의한 결과대로 태깅했다.  판단 근거가 팀원 간 어느 정도 일치한 뒤, 부터는 각자 태깅했지만, 이 경우에도 각자의 작업 결과를 크로스체크했다.

 

 


 

# 결과_라벨링 진행 및 피드백

 

 그리고 감성어 사전을 완성했다. 

 

더보기

2020.12.15. 긍부정어 사전 파일 삭제

일전에 프로젝트 내용 기록용으로 긍부정어 사전 파일을 올려 놓았는데, 파일에 대한 문의가 많이 들어왔습니다. 사전 데이터를 공개해도 될지 팀원들과 논의를 거쳤습니다. 그 결과 데이터를 공개하지 않는 것이 적절하다 판단하여 파일을 삭제합니다.

 

 객관적 시각을 견지하며 단어 긍부정을 라벨링하려고 노력하였으나,

     1) 팀원들이 일일이 수작업으로 긍정, 부정 여부를 파악했다는 점,

     2) 인터넷 댓글 데이터를 활용하였기 때문에 부적절한 데이터 및 통념에 맞지 않는 라벨링이 이루어졌을 수 있다는 점,

 때문에 다른 연구에 사용되기에는 적절하지 않다고 판단했습니다.

 

 많이 부족한데도 불구하고 누추한 블로그 찾아 주시고 관심 가져 주셔서 감사합니다 :)

 

 

 

 

 

 

 긍정어 사전에 수록된 형태소는 총 3029개, 부정어 사전에 수록된 형태소는 총 4720개이다. 

긍정어
부정어

 

 이후 첫 번째 버전의 긍정어, 부정어 사전으로 시범적으로 MLBPARK 게시글, 댓글 데이터에 긍/부정 라벨링을 진행했다. 그러나 다음과 같은 문제점이 있었다.

 

 첫째, 긍정 문장의 비율이 너무 높았다. 사전에는 부정어의 비중이 훨씬 높아 긍정으로 라벨링되는 문장이 적을 것이라 생각했는데, 막상 라벨링을 진행해 보니 긍정 문장이 너무 많은 것이 이상했다.

 

 둘째, 긍정/부정을 라벨링하기 위한 문장 점수의 범위가 너무 광범위했다. 부정으로 라벨링된 문장 중 최저 점수를 기록한 것은 -624점, 긍정으로 라벨링된 문장 중 최고 점수를 기록한 것은 1107점이었다. 각각의 문장을 살펴보니 '왈왈왈왈왈왈...'과 'ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ...'로, 의미 없는 감탄사가 계속해서 반복된 것이었다.

 

 위의 결과를 바탕으로 긍정어, 부정어 사전에서 감탄사를 대폭 제외하기로 했다. 또한, 전처리 과정에서 ㅋ, ㅎ 등 의미없이 반복되는 문자열을 제거하기로 했다.

 또한, 위의 결과와 관계없이 긍정어/부정어 사전을 수정하는 과정에서, 다른 형태소들을 살펴 보았다. 그리고 긍정, 부정의 판단을 하기 어려운 단어들도 제거하였다.

 

 그 결과로, 긍정어 845개, 부정어 2460개로 구성된 두 번째 버전의 감성어 사전을 만들었다. 부정어 사전에 수록된 형태소 개수가 많은 것이 문제점이다. 라벨링을 진행한 뒤 다시 사전을 수정하도록 한다.

 

 

 


 

 

# 사전 변화

 

 이후 데이터셋 라벨링을 진행하며 감성어 사전을 수정했다. 각 단계에서 사전 제작에 활용한 품사들과 사전 수록 형태소 수는 다음과 같다.

 

 

  ver1 ver2 ver3
품사
단어 수

 

 

반응형