Data-writing

대본으로 놀아보기 #4 대본 요약하기(실패기)

JAY-GO 2020. 1. 17. 13:43
반응형
드라마 W 대본을 활용한 데이터 분석 및 활용

※ 실제 구현 코드는 github상의 jupyter notebook을 참고하시기 바랍니다.


이전 포스팅에서는 gensim의 summerize 기능을 활용한 textrank 기반하여 문장을 만들어 보았습니다.

위 방식으로는 존재하는 문장들 중 관계있는 문장을 차례대로 나열하는데 그쳐 이번에는 다른 방식으로 대본을 요약해 보고자 합니다.


1. LSTM 모델

 Keras 창시자에게 배우는 딥러닝 책에서는 LSTM을 활용하여 소설을 학습하여 새로운 문장을 구성하는 예시가 나옵니다. 이를 활용하여 대본을 학습하여 새로운 문장을 만드는 방법으로 대본 요약을 시행 해 보고자 합니다.

 

 본 모델은 음절(문자)를 기반으로 분석하여 다음 문자가 무엇이 올지 예측하는 방법으로 문장을 생성 합니다. 이를 위해 대본을 학습할 문장(sentences), 그 뒤에 나올 글자(next_chars)로 나눕니다.

 한 글자씩 이동하면서 다음 글자를 예측하도록 데이터셋을 만듭니다.

 

 이를 LSTM 모델에 주입하기 위해 벡터화를 합니다.

 이를 위해서는 나타나는 모든 음절에 대하여 단어 사전을 생성하고,

{'그': 84,
 '극': 85,
 '근': 86,
 '글': 87,
 '금': 88,
 '급': 89,
 '기': 90,
 '긴': 91,
 '길': 92,
 '김': 93,
 '깄': 94,
 '까': 95,
 ...
 }

 이에 해당하는 벡터를 만들어 위 데이터 셋을 변화 합니다.

array([[[False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False,  True, ..., False, False, False],
        ...,
        [False, False, False, ..., False, False, False],
        [False, False,  True, ..., False, False, False],
        [False, False, False, ..., False, False, False]],

       [[False, False,  True, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        ...,
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False,  True, ..., False, False, False]],

       [[False, False, False, ..., False, False, False],
        [False, False,  True, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        ...,
        [False, False,  True, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False]]])

 벡터화된 데이터 셋으로 LSTM모델에 학습 하여 결과를 보면 아래와 같습니다.

seed text :  소가 번지는) 아까 미친개가 봤어야 되는데.. 당신이 무시하는 오연주가 얼마나 멋지게 해 냈는지.. (하다 감탄하는) 	알고 보니 난 실전에 강한 타입이었던거야? 내추럴 본 닥터?
temp :  0.2
소가 번지는) 아까 미친개가 봤어야 되는데.. 당신이 무시하는 오연주가 얼마나 멋지게 해 냈는지.. (하다 감탄하는) 	알고 보니 난 실전에 강한 타입이었던거야? 내추럴 본 닥터?
generated text :   아어....... (E)  아려는 이니다...... (E) 아 이 이는 이 이니다. ((E)  아기 아는 강철 이 니다. ((E)  아 아니다. (E)  (E) 아........
temp :  0.5
소가 번지는) 아까 미친개가 봤어야 되는데.. 당신이 무시하는 오연주가 얼마나 멋지게 해 냈는지.. (하다 감탄하는) 	알고 보니 난 실전에 강한 타입이었던거야? 내추럴 본 닥터?
generated text :   아어이..? (E)  이보는 ( 나는데) (수... ((충) 네 이도 안 자고 이...? (E) 아화 어가냐. ((E) 아. 대 사리는 네어...... (아지 그철 보려고 이..
temp :  1.0
소가 번지는) 아까 미친개가 봤어야 되는데.. 당신이 무시하는 오연주가 얼마나 멋지게 해 냈는지.. (하다 감탄하는) 	알고 보니 난 실전에 강한 타입이었던거야? 내추럴 본 닥터?
generated text :   거 뜨고이. 합가는 많마 기 벽오고는 지.... 아.. (이) 하로 것고게 혹....? (가한 그0이 모이네다. (!E) 매 수식 이다다고어집요지 한수 (서) 매무에 이유 문교 
temp :  1.2
소가 번지는) 아까 미친개가 봤어야 되는데.. 당신이 무시하는 오연주가 얼마나 멋지게 해 냈는지.. (하다 감탄하는) 	알고 보니 난 실전에 강한 타입이었던거야? 내추럴 본 닥터?
generated text :   연복카능셨다고 가 도서 부락으쩌,유해사신아디 그.면? (E) 9.리이는?주모하 9. 얼 호중2로 송버니신까!까!  기적 강철이데요!!!격 지러 확 기 분간다고.! (었시대니다 랬
 알파벳과는 다르게 한글 글자의 종류가 무궁무진하여 단어 기반으로 하는 LSTM 모델은 문장을 생성하는데 부적합 합니다.

2. bigram 모델

 이번에는 어절단위(단어)로 분석을 해보도록 하겠습니다. ratsgo 님의 블로그를 참고하였습니다.

 

 본 모델은 문장을 bigram 반식으로 사전을 구성하여 학습시킨 뒤 임의 선택 방식으로 단어를 이어가는 방식을 이용하고자 합니다. 이를 위해 우선 대본의 단어별 연결 상태의 사전을 만듭니다.

defaultdict(list,
            {'네,': ['잠시', '여기는'],
             '잠시': ['종목을', '쳐다보며', '후)'],
             '종목을': ['바꿔보겠습니다.'],
             '바꿔보겠습니다.': ['지금'],
             '지금': ['사격',
              '강철',
              '세계',
              '침착하라고',
              '보시는',
              '옆에',
              '몇',
              '4권짼데',
              '세',
              '마감하셨어요!',
              '막',
              ...
              }

 임의의 단어를 시작 단어로 하여 사전을 참조하여 이어지는 단어를 임의로 선택하는 방법을 연속적으로 수행 합니다.

Try1 : '경찰은 강대표를 걱정해 모인 시민들로 발 중 당일 행적에 많은 의문점을 발견한 것으로 알려졌습니다.       
Try2 : Over run
Try3 : Over run
 어절 기반 모델은 정상적으로 보이는 문장을 구성 하기는 하나, 본 대본만으로는 단어사전에 이어지는 단어를 1개 또는 0개만 채우는 등 다양한 문장을 구성하기 충분치 않습니다. 이로인해 대본에 있는 문장이 그대로 출력 되거나, 일찍 종결되는 등 만족하는 결과를 얻지 못하였습니다.

마치며

 이번 포스팅에서는 대사들을 음절, 어절 기반으로 새롭게 문장을 구성하기 위한 시도를 해 보았습니다. 만족스러운 결과를 얻지는 못하였지만 활용 방법 및 그 가능성을 옅볼 수 있는 시간이었으리라 생각합니다. 지금까지 4번의 포스팅을 통하여 간단한 자연어 처리에 대하여 포스팅 해 보았습니다. 도움이 되었으면 좋겠습니다.

반응형