9 min read

자연어 처리로 내가 쓴 일기를 살펴보기

이 이야기는 올해 (2020) 8월로 거슬러 올라가봅니다. 지금은 더이상 활동하지 않는 독서 모임에서, 사적인서점을 운영하시는 정지혜 작가님의 책, <좋아하는 마음이 우릴 구할 거야>를 알게 되었습니다. 책은 '덕심'이라는 주제를 짧고 쉽게 풀고 있어 부담없이 읽을 수 있었습니다. 이 책에는 다음과 같은 구절이 나옵니다.

책 처방을 진행하는 동안 손님들은 책의 힘을 빌려 꺼내기 어려운 속마음이나 해묵은 고민들을 털어놓았습니다. 그때마다 빠지지 않는 주제가 진로나 직업에 대한 것이었는데, 내가 뭘 좋아하는지 모르겠다고 답답해하는 손님들이 특히 많았지요. 그럴 때 저는 매일 일기 쓰기를 권합니다. 오늘 있었던 일이나 감상을 구구절절 쓸 필요는 없어요. 단지 오늘 하루 가장 즐거웠던 경험과 가장 별로였던 경험에 대해 한 줄씩만 쓰면 됩니다. 그리고 그 데이터를 모아두었다가 한 달쯤 지나 공통점을 찾아보는 거예요. 행복하다고 느낀 순간에 나는 혼자인지 타인과 함께인지, 타인과 함께라면 일대일 만남이 많은지 여럿이 있을 때가 많은지, 자주 등장하는 장소가 공원이나 바다 같은 자연인지 서점이나 전시회, 영화관처럼 문화적인 자극을 주는 공간인지 살펴보면서요.

정지혜, <좋아하는 마음이 우릴 구할 거야>, 2020

마침 여러 일로 마음이 힘들었던 저는 일기를 써보기로 결심하였습니다. 일기는 특별한 포맷이 있는 것은 아니지만, 가끔 글을 쓸 때 뭘 쓸지 모르겠어서 막막해지는 기분이 싫었기에 약간의 템플릿을 두었습니다. 제가 만들었던 일기 템플릿은 다음과 같았습니다.

  1. 오늘 무슨 일을 했나요? → '나'가 주체가 되어 오늘 했던 일을 기록합니다.
  2. 오늘 무슨 일이 있었나요? → 오늘 벌어진 일이지만, 주체가 '나'가 아닌 일을 기록합니다.
  3. 오늘 특별히 든 생각이 있었나요? → 내가 오늘 생각한 것들을 문장 단위로 기록합니다. 보통 제가 생각하는 바는 감정과 달리 한 단어로 표현하기 어려운 경우가 많았기 때문에, 문장으로 기록하였습니다.
  4. 오늘 느낀 감정은 어땠나요? → 내가 오늘 느낀 감정들을 한 단어(명사)로 기록합니다.
  5. 오늘 느낀 감정을 점수로 표현한다면? → 오늘 얼마나 행복했나에 대해 1~10점 중 하나를 매깁니다.

저는 템플릿을 만든 후, 올해 8월부터 10월 중순까지 꾸준히 일기를 썼습니다. 가끔 일기를 쓰기 싫고 귀찮을 때도 있었지만 그래도 10월 중순까지는 괜찮았던 것 같았습니다.

저는 일기를 어느 정도 꾸준히 썼던 기간동안의 제 생각을 패턴화해서 확인해보고 싶었습니다. 일례로 위에서 정지혜 작가님이 이야기했던,

  • 행복하다고 느낀 순간에 나는 혼자인지 타인과 함께인지
  • 타인과 함께라면 일대일 만남이 많은지 여럿이 있을 때가 많은지
  • 자주 등장하는 장소가 공원이나 바다 같은 자연인지 서점이나 전시회, 영화관처럼 문화적인 자극을 주는 공간인지

등등이지요.

전공병

'모든 문제는 기술을 이용하여 해결할 수 있다1)'고 생각했던 저는, 제가 쓴 일기를 모아 일종의 자연어 처리 과정을 거친다면 조금 더 쉽게 패턴화할 수 있지 않을까 하고 생각을 했습니다. 물론 모든 일기를 손수 살펴보면서 정성적으로 제 자신을 살펴볼 수도 있습니다. 그런데 8월부터 10월까지만 해도 일기의 개수는 약 90개고, 1년을 쓴다면 300개가 넘게 일기가 쌓이기 때문에 생각보다 전부 다 살펴보기 쉽지가 않습니다. 또한, 일기를 읽어볼 그 때 당시의 상태나 감정에 따라 쓰인 일기가 주관적으로 해석이 될 수도 있습니다(물론 이 이유로 예전에 썼던 일기를 읽어보는 경우도 많습니다).

그래서 예전에 썼던 일기를 그냥 읽어볼 뿐만 아니라, 자연어 처리를 통해 약간의 정량적인 분석을 해보고 싶었습니다. 이를 통해,

  • 어떤 키워드가 많이 등장했고
  • 스스로 어떤 상황에서 어떤 감정을 쉽게 느끼는지(패턴이 있는지)

를 살펴보고 싶었습니다.

일기를 분석해보기 위해서는 다음과 같은 절차를 거쳐야 합니다. 동시에 이는 자연어 처리를 하기 위한 큰 절차이기도 합니다.

  1. 데이터 추출
  2. 데이터 전처리
    1. 토큰화(Tokenization)
    2. 어간 추출(Stemming)
  3. 패턴 분석
  4. 데이터 모델링, 훈련

예를 들어 분석을 통해 알아내고 싶은 몇 가지 질문을 떠올려 보았습니다. 먼저, '내가 행복하다고 느낀 순간에 자주 등장한 키워드는?'이라는 질문에 대한 답변을 얻고자 하였습니다.

  1. 일기에서 그 날 '내가 얼마나 행복했는지'를 파악
    1. 점수(1~10)로 파악할 수도 있고 감정에 대한 단어로 유추해볼 수도 있음
  2. 행복했다고 느낀 날의 일기에서 키워드 추출

위 절차에서 1번부터 3번까지를 거치면, 내가 좋은 감정 점수를 준 일기에서 자주 등장한 키워드를 뽑을 수 있고, 어떤 키워드가 어느 빈도로 나왔는지를 살펴볼 수 있습니다. 여기서 조금 더 나아가자면 군집화(Clustering) 작업을 통해 비슷한 키워드를 묶을 수도 있고, 키워드의 속성을 추출(Feature Extraction)할 수도 있는데 이는 밑 문단에서 조금 더 이야기해보겠습니다.

(한국어) 자연어 처리의 어려움

또 다른 예를 들어봅시다. '내가 행복하다고 느낀 순간에 나는 어떤 장소에 있었나'에 대한 답을 얻고 싶었습니다. 이 경우에는 다음과 같은 작업이 필요합니다.

  1. 일기에 등장한 단어들 중, 장소를 나타내는 단어 찾기
  2. 그 장소에 있을 때 일기에서 '내가 얼마나 행복했는지'를 파악
  3. (1)번에서 찾은 단어를 군집화하여, 감정과 장소의 특징을 연결

얼핏 보면 쉬워보이지만, 어떤 경우 '서울특별시 강남구 테헤란로70길'처럼 구체적인 장소가 등장할 수도 있고, 어떤 경우에는 '내 방'처럼 주관적인 표현을 사용할 수도 있어 생각보다 추출이 까다롭습니다(우리가 일기를 쓸 때 이를 모두 고려하고 쓰지는 않기 때문에).

또한, 일기에서 표현되는 단어나 문장은 서로 다른 단어가 비슷한 의미를 가지고 있는 경우가 많습니다. 예를 들자면, '따뜻함' 과 '뜨거움'은 서로 다른 단어지만 '온도가 높다'는 공통적인 의미를 가지고 있습니다(이 의미를 추출하는 단계가 위에서 언급했던 '속성 추출'입니다). 또한, '뜨거움'은 '따뜻함'보다 그 정도가 큽니다. 사람은 모두 이런 단어들을 보고 바로 의미를 이해하지만, 컴퓨터, 특히 4번에서 쓰는 데이터 모델은 이를 바로 이해할 수 없습니다. 게다가 컴퓨터가 사용하는 데이터 모델은 단어를 그 단어로 입력받지 않고() 벡터(수치의 나열)의 형태로 입력받습니다. 이에 전처리된 단어를 벡터의 형태로 변환하는 과정인 벡터화(Vectorization) 또한 필요한 단계 중 하나입니다.

다행히도 최근 인공지능이 주목받으면서 많은 연구 결과가 나왔고, 대부분 이러한 문제를 해결할 수 있는 방향이 생겼습니다. 그러나, 대부분의 영어를 기반으로 한 자연어 처리 모델을 한국어에 그대로 적용할 수는 없습니다. 한국어의 경우에는 영어권 국가보다 인구 수도 적고, 연구개발의 규모도 작기 때문에 자연어 처리가 특히 더 어렵습니다. 게다가 한국어는 어근과 접사의 관계가 중요한 교착어이기도 하고, 문장에서 주어가 생략되는 등 묵시적인 의사표현이 자주 일어나기도 합니다. 이러한 이유로 영어에 적용할 수 있는 자연어 처리 이론을 이해한 후, 한국어에 그대로 적용하는것마저 어렵습니다.

들어가며

여기까지가 제 일기(또는 누군가의 일기)를 자연어 처리를 통해 분석하기 위해 대략적으로 알고 있어야 할 내용들이었습니다. 앞으로 이어질 포스트에서는 위에 예시로 들었던 질문들처럼, 의문 형식의 주제를 하나 잡고 이를 답할 수 있는 자연어 처리 방식들을 하나하나 구체적으로 다루어볼까 합니다.

  1. 그렇다고 모든 문제에 대해 최선의 해결 방법이 기술이라고 생각하지는 않습니다.