[Project] Enphago - 한글 끝말잇기 AI 02. 게임 턴 진행


끝 말 일치 확인

끝말잇기의 가장 기초적인 규칙은 역시나 끝 말 일치 여부이다. 이는 코드로 굉장히 간단히 구현할 수 있지만 한글의 경우 한 가지 고려해야할 점이 있다. 글자 하나에 1bit 를 차지하는 영어 알파벳과는 다르게 한글은 한 글자가 2bit 를 차지하기 때문이다. 따라서 대학교 1학년 때 C언어 로 진행했던 Enphago 프로젝트에선 다음과 같이 구현했었다.

1

첫번째 단어의 마지막 2bit 와 두번째 단어의 첫 2bit 를 모두 비교하는 것을 볼 수 있다. 당시 처음 끝 말 일치 확인 코드를 작성할 때에는 영어 알파벳처럼 1bit 씩만 비교하고 당연히 돼야되는게 안되서 매우 혼란스러웠다. 추후 찾아보니 한글은 한 글자당 2bit 씩 차지한다는 것을 깨닫고 바로 구현해보니 성공적으로 돌아갔다. 그런데…

그런데 Python 에선…?

2

오히려 python 쪽에서는 옛 경험을 되살려 2bit 씩 비교하는 코드를 짰다가 혼란에 빠졌다. 알고보니 python 에서는 문자열을 C언어 처럼 bit 단위가 아닌 하나의 list 로 처리하여 한글의 글자 하나를 list 의 원소 비교하듯 비교할 수 있었다. 마치 C++STL 에서 string 이 내부적으로는 vector 로 구현된 것과 비슷한 느낌이었다. 결론적으로 python 으로 짠 코드가 훨씬 직관적이고 간결했다.


두음법칙

두음법칙은 역시 노가다밖에 없다고 생각했다. 그래서 실제로 C언어 로 프로젝트를 진행했을 때는 모든 경우의 수를 하나하나 if 문으로 노가다하여 작업하였다. 하지만 이번에는 github 에서 관련 내용의 오픈 소스 자료가 없을 지 찾아보았다. 그런데 있었다.

3

bluedisk님의 hangul-toolkit


오픈 소스의 방대함을 다시금 깨달았다. 한글 두음법칙의 규칙은 다음과 같다.

  • ㄴ 두음 법칙 : 모음이 ‘ㅣ’, 또는 ‘반모음’일 때 ‘ㄴ’은 첫소리에 나타나지 못하고 탈락한다. ㄴ 소리가 탈락하므로 한글 철자상으로는 ‘ㄴ’ 대신 ‘ㅇ’으로 적는다.

  • ㄹ 두음 법칙 : 모음과 상관없이 첫소리에 나오는 ‘ㄹ’은 반드시 ‘ㄴ’으로 바뀐다

이렇게 자/모음 분리 라이브러리와 두음 법칙 규칙을 알면 큰 노가다 없이 두음법칙을 구현할 수 있을 줄 알았지만 두음 법칙을 보면 알 수 있듯이 꽤나 복잡했다. 자모음 분리를 해도 문제였다. 반면 인터넷에서는 모든 두음법칙 경우의 수 30여가지를 정리한 것을 쉽게 찾을 수 있었다. 결론적으로 자모음 분리를 통한 두음법칙 구현은 어디까지나 ‘좋은 시도’ 이고 효율적이지는 못했다. 따라서 예전과 같이 그냥 노가다로 구현했다. 다만 C언어 에 없는 python 의 사전 자료구조를 통해 훨씬 간결히 구현할 수 있었다.

4

비효율적인 노가다 코드처럼 보일지 몰라도 사실 제일 간결한 구현 방법이었다.


게임 턴 진행

다음으로 실제 끝말잇기 AI 의 구현을 통해 게임 턴을 진행하는 것이다. AI 의 기능은 다음과 같다.

  • 플레이어가 입력한 단어의 끝말과 일치하는 유효한 단어를 말한다.
  • 플레이어가 입력한 단어의 유효성 검사를 해준다.
    • 존재하는 단어인가?
    • 두 글자 이상의 단어인가?
    • 명사인가?
    • 이미 사용한 단어인가?
  • 플레이어의 요청 시 AI 가 마지막으로 말한 단어의 사전 검색을 해준다.
  • 플레이어의 기권 시 AI 가 마지막으로 말한 단어를 받아칠 수 있었던 단어를 출력한다.

위 기능들은 Open API 의 활용과 간단한 아이디어로 쉽게 구현이 가능했다.

5

예전 C언어 프로젝트에 비해 코드가 훨씬 간결해졌다. 언어의 차이도 있겠지만 능력의 차이도 큰 것 같다. 이외의 코드 부가 설명은 아래와 같다.

  • wordList : AI가 사용하는 전체 단어 리스트
  • usedList : 사용한 단어 리스트
  • getAIWord : AI가 답할 단어를 선택하는 함수
  • searchWord : Open API 를 통해 단어 사전 검색을 실행하는 함수


실행 결과

실제 게임 실행 결과는 아래와 같다.

5

두음법칙 변환과 위에서 설명한 AI 의 기능들이 빠짐없이 잘 실행되는 것을 확인할 수 있다.

0%