프로그래밍/파이썬(Python)

마르코프 체인을 활용한 문장 생성

&+&& 2017. 6. 27. 07:00

  러시아의 수학자 안드레이 마르코프의 이름을 딴 마르코프 체인(Markov Chain)이라는 바로 이전 상태에서만 영향을 받는 확률 과정이 있는데요. 각 시행의 결과가 바로 앞의 시행 결과에만 영향을 받는 일련의 확률적 시행을 의미합니다.

  쓰고 있는 저도 사실 무슨 얘기인지 잘 모릅니다. 머, 그냥 일종의 상태 예측을 위한 방법론 중의 하나라고 생각하면 될 것 같습니다. 응용 분야로는 마르코프 성질에 기반하여 이미 관측된 자료를 조건부 확률에 적용하여, 자료가 관측되지 않는 시점(미래의)의 값을 시뮬레이션 하는데 사용된다고 합니다.


  이러한 마르코프 체인을 자동 문장 생성에 적용하게 되면 주어진 전체 텍스트를 검사하여 각 단어의 다음에 나타나는 단어의 확률을 구하는 것이 가능해집니다. 


1. 참조 소스 파일

  사용된 소스 파일은 위 github 주소를 방문하면 다운로드 받을 수 있구요. 몇몇 패키지들만 인스톨해주면 쉽게 돌릴 수 있습니다. 아, 그리고 처음에 단어들의 분포를 알려주기 위한 txt 파일이 필요합니다. 

  저는 단어분포에 대한 모델을 만들기 위해 시인분들의 시(김소월, 청록파 등등)를 사용했습니다. 모델 학습에 사용한 데이터 길이는 공백을 제외한 글자수로 1,963글자네요. 


2. 10개 문장 생성 결과

영변(寧邊)에 약산(藥山) 진달래꽃, 아름 따다 가실 때에는 죽어도 아니 잊고 먼 데 산을 바라 본다

나 보기가 역겨워 가실 때에는 죽어도 아니 잊고 먼 훗날 그때에 내말이 '잊었노라' 당신이 나무라면 '믿기지 않아서 잊었노라' 그래도 당신이 찾으시면 그때에 내말이 '잊었노라' 바람아, 산에, 들에, 불고 가는 나그네

매운 술을 마셔 돌아가는 그림자 발자취 소리 산산이 부서진 이름이어! 부르다가 내가 죽을 이름이어! 불러도 주인 없는 향수에 슬픈 모가지를 하고 먼 데 산을 바라 본다

수만 호 빛이래야 할 내 고향이언만 노랑나비도 오잖는 무덤 위에 이끼만 푸르리라

오 - 바람아 봄바람아, 봄에 봄에 봄에 봄에 봄에 불고 가는 바람아, 봄에 봄에 부는 바람아, 산에, 들에, 불고 가는 버들인 양 사풋이 춤을 추라, 아미(蛾眉)를 숙이고… 나는 님을 보내지 아니하였습니다 제 그

림자를 들여다보고 잃었던 전설을 생각해 내고는 어찌할 수 없는 슬픔의 힘을 옮겨서 새 희망의 정수박이에 들어부었습니다 우리는 만날 때에 떠날 때에 다시 만날 때에 떠날 때에 다시 이곳, 조선 사람에 한 마리

 호접(胡蝶) 호접(胡蝶)인 양 사풋이 춤을 추라, 아미(蛾眉)를 숙이고… 나는 이 밤에 옛날에 살아 눈 감고 거문고 줄 골라 보리니 가는 바람아, 쨍쨍히 비치는 햇볕을 따라, 인제 얼마 있으면? 인제 얼마 있으면

오지 꽃도 피겠지! 살구꽃도 피겠지! 그 사람이어! 사랑하던 그 사람이어! 강나루 건너서 밀밭 길을 구름에 달 가듯이 가는 바람아, 산에, 들에, 불고 눈보래 치잖으면 못 잊어 생각이 나겠어요 그런 대로 세월만 가라시구려 못 잊어 생각이 나겠어요 그런 대로 세월만 가라시구려 못 잊어 생각이 나겠지요 그런 대로 세월만 가라시구려 못 잊는데 어쩌면 생각이 나겠지요 그런 대로 세월만 가라시구려 못 살리라

꽃이 지기로소니 바람을 탓하랴

오 - 다시 이곳, 조선 사람에 한 사람인 나의 염통을 불어준다

수만 호 빛이래야 할 내 넋을 잡아 끌어 헤내는 부르는 소리 숨막힐 마음 속에 어데 강물이 흐르뇨 달은 강을 따르고 나는 이 밤에 옛날에 살아 눈 감고 거문고 줄 아는 까닭에 걷잡을 수 없는 슬픔의 힘을 옮겨서

새 희망의 정수박이에 들어부었습니다 우리는 만날 때에 미리 떠날 때에 미리 떠날 것을 염려하고 경계하지 아니한것은 아니지만 이별은 뜻밖의 일이 되고 놀란 가슴은 새로운 슬픔에 터집니다 그러나 이별을 쓸데없는 눈물의 원천을 만들고 마는 것은 스스로 사랑을 깨치는 일인 것 인 줄 아는 이 밤에 옛날에 살아 눈 감고 거문고 줄 아는 까닭에 걷잡을 수 없는 향수에 슬픈 짐승이여 언제나 점잖은 편 말이 없구나

' 달이 설움인 줄은 '예전엔 미처 몰랐어요

매운 술을 마셔 돌아가는 그림자 뜰에 어리어 하이얀 미닫이가 우련 붉어라

  학습된 모델을 통해서 10개의 문장을 생성한 결과는 위와 같네요. 총 990글자의 문장을 생성해 냈습니다. 조금 개선했으면 하는 아쉬운 부분이 좀 있네요.

  -> 여러 시인의 시를 자료로 넣다 보니 문장의 일관성이 보이질 않는다.

  -> 좀 더 방대한 자료를 넣는다면 괜찮은 결과를 보여줄 수도 있을 것 같다.


  -> 마음에 드는 문장ㅎㅎ : 매운 술을 마셔 돌아가는 그림자 발자취 소리 산산이 부서진 이름이어! 부르다가 내가 죽을 이름이어! 불러도 주인 없는 향수에 슬픈 모가지를 하고 먼 데 산을 바라 본다


  양질의 자료로 학습시킨 모델을 통하여 문장을 생성한다면 랩을 쓰는 것이 가능할 수도 있을 것 같다.