[Project] Enphago - 한글 끝말잇기 AI 00. 개요


Enphago

대학교 1학년 마지막 과제로 C언어 를 이용하여 자유로운 프로그램을 개발하고 프레젠테이션 하는 것이 주어졌다. 많은 고민 끝에 떠올린 것은 끝말잇기 게임이었다. 이런 결정을 하게 된 이유에는 다음과 같은 것들이 있다.

  • 우선 게임을 만들고 싶었다. 재밌기 때문.
  • 게임 중에서도 콘솔에서의 사용자 경험이 우수한 편이다.
  • 과제 조건 중 하나가 파일 입출력 기능을 사용하는 것이었다.

나의 구상은 인터넷에서 한글 명사들의 목록을 구해 텍스트 파일에 저장하여 파일 입출력을 통해 사용자가 제시한 단어의 끝말로 시작하는 단어를 불러와 출력하는 것이었다.

1 (당시 git 을 몰라 일어난 드롭박스 대참사)

아이디어가 간단하고 구현도 비교적 어렵지 않아 수월하게 개발할 수 있었다. 거기에 하나둘씩 생각나는 아이디어들을 팀원과 상의해서 추가해나갔다.

2

그나마 어려웠었던 점이라고 하면 우선 제일 처음에 인터넷에서 명사 목록을 구할 때였다. 어쨌든 10만개의 목록을 인터넷 어딘가에서 구했었는데 이 끝말잇기 게임에서는 이 목록 외의 단어는 아예 존재하지 않는 단어로 취급해 사용할 수가 없었다. 때문에 이 단어풀이 매우 중요했는데 지금 생각해보면 지나치게 생소한 명사나 포함되어 있거나 일부 통용적인 고유어들이 빠져있어서 완벽하지 못했다.

두번째로 두음법칙의 처리였다. 나름의 규칙이 있는 법칙인지라 알고리즘으로 처리할 수 있을까 싶었지만 영어와는 다르게 한글은 한글자가 2바이트로 묶여 있으므로 글자의 자음과 모음을 분리하는 것이 불가능했다. 따라서 할 수 없이 모든 경우의 수를 일일이 노가다 if문으로 처리했던 기억이 난다.

자잘히 추가한 기능들 중에서는 단어사전 검색이나 단어 추가/삭제, 전적확인 등이 있었다. 그런데 어느 날 문득 떠오른 생각이 있었다.

AI 가 패배했을 때 사용자가 사용한 단어를 학습한다면?


학습하는 AI

이 게임에서 AI 가 패배하는 경우는 단 한가지, 해당 글자로 시작하는 단어가 단어 리스트에 존재하지 않을 때이다. 그렇다면 이 단어들을 따로 텍스트 파일에 저장해두고 사용한다면?

그렇게해서 추가한 기능은 다음과 같다.

  • AI 가 게임에서 패배했을 때 사용자가 사용한 단어를 저장한다.
  • AI 가 게임에서 승리했을 때 사용한 단어를 저장한다.
  • AI 끼리 게임을 진행하다 게임을 끝내버린 단어를 저장한다.

3

AI 끼리 약 10만개의 단어 리스트를 가지고 게임을 진행하면서 게임을 종료시킨 단어를 저장한다. 물론 이미 학습한 단어일 경우 패스한다. 위 사진과 같이 게임을 5000판 진행시키는 데 약 2분가량 정도 밖에 소요되지 않아 효율이 좋았다. 실제로 저정도 학습시킨 상태에서 게임을 진행하면 웬만한 단어에는 AI가 모두 한 방 단어를 시전하여 게임이 1 ~ 2 판 내에 AI 의 승리로 끝나게 된다.

이렇게 과제라고 느껴지지 않을 정도로 재밌게 진행한 프로젝트를 통해 해당 강의에서 최고점을 받을 수 있었다.


발전

그 이후 군에 입대하고, 많은 것을 공부하고, 전역을 하고나서 이 프로젝트를 다시 보았다. 느낀 점은 다음과 같았다.

  • 코드가 너무 지저분하고 초보스럽다. 깔끔하게 다시 한 번 짜고 싶다.
  • 단어 리스트에서 단어 검색을 할 때 다른 자료구조를 이용해 탐색 시간을 줄일 수 있겠다.
  • Open API 를 이용해 완벽한 단어 리스트 생성과 확실한 유효성 검사를 할 수 있겠다.
  • C언어 콘솔 환경이 아닌 모바일 앱으로 제작해보자.
  • AI 와의 대결도 좋지만 멀티 플레이도 좋겠다.

위 생각들을 떠올리면서 군대에서 그래도 나름 많이 공부했구나…라고도 생각했다. 2년 전 최선이라고 생각했던 프로젝트에서 좀 더 많은 가능성이 보였다. 그렇게해서 Enphago 를 다시 꺼내보게 되었다.

이 프로젝트는 Github Blog 개설 이후 첫 포스트이자 내 Github 계정 첫 프로젝트이다.

0%