for textmining

빈도 기반의 문장 생성

|

이번 글에서는 말뭉치 빈도 정보를 바탕으로 문장을 생성하는 모델에 대해 살펴보도록 하겠습니다. 이 글은 ‘밑바닥부터 시작하는 데이터 과학(조엘 그루스 지음, 인사이트 펴냄)’을 기본으로 하되 목적에 맞게 파이썬 코드를 적절히 수정했음을 먼저 밝힙니다. 그럼 시작하겠습니다.

데이터 불러오기

이광수 장편소설 ‘무정’을 분석 대상으로 삼았습니다. 소설 원문을 내려받아 어절 단위로 나누어 list 형태로 불러들이는 코드는 다음 한줄이면 됩니다.

document = open('text', 'r', encoding='utf-8').read().split()

바이그램 모델 학습

말뭉치를 두 개 단어씩 슬라이딩해 학습을 먼저 수행해 줍니다. 다음과 같습니다.

from collections import defaultdict
bigram_transitions = defaultdict(list)
for prev, current in zip(document, document[1:]):
    bigram_transitions[prev].append(current)

학습 결과 일부는 다음과 같습니다.

‘말하기’ : [‘미안한’, ‘싫은’, ‘어려운’]

‘나갈’: [‘길을’, ‘방향을’, ‘것’, ‘길이나’]

바이그램 모델 예측

초기 단어를 랜덤으로 선택한 뒤, 이 정보와 학습 결과를 바탕으로 단어 30개를 예측하는 함수는 다음과 같습니다.

import random

def generate_using_bigrams(cut=30):
    idx = 0
    current = random.choice(list(bigram_transitions.keys()))
    result = []
    while True:
        next_word_candidates = bigram_transitions[current]
        current = random.choice(next_word_candidates)
        result.append(current)
        if idx == cut:
            return " ".join(result)
        idx += 1

예측 결과 일부는 다음과 같습니다.

(1) 되었다. 그러나 이 회화를 하며 웃는다. 목사의 뜻을 먼저 더러워졌다’ 하는 것이 아니다. 형식이나 선형에게 대한 처지와 같음이 아닐까. 아까, ‘제가 먹을 것도 생각하였다. 그러나 그것은 내서 무엇 하러 살아왔는고, 하는

(2) 떨어지는 수가 없는 것 모양으로 깨끗한 영혼과 자기의 지금 살아서 우리와 같은 하등 인종으로 알던 것이 매우 양심에 괴롭게 하십니까?” 형식은 모자와 말하는 모양이 생각에만 떠나와도 큰 남자와 같이 자라나던 형식이란

(3) 오랫동안 가물었으므로 대동강물은 꿈에 보던 시와 소설의 기억이 떠나왔던지 모르거니와 적어도 오 리(五里)나 되는 처녀가 처음 보는 눈에는 늘 심로를 하시면서 무엇하러 거기 가서 선 십여 년 지나온 생각이 있다. 계향은

트라이그램 모델 학습

이번엔 단어를 세 개씩 슬라이딩해서 보는 트라이그램 모델을 학습해보겠습니다. 코드는 다음과 같습니다.

trigrams = zip(document, document[1:], document[2:])
trigram_transitions = defaultdict(list)

학습 결과 일부는 다음과 같습니다.

(‘벌떡’, ‘일어나’): [‘모기장을’, ‘방에’, ‘시퍼런’, ‘방’, ‘달려오더니’, ‘문을’]

(‘가만히’, ‘고개를’): [‘숙였다.’, ‘숙이고’, ‘돌린다.’]

트라이그램 모델 예측

트라이그램 모델로 단어 30개를 예측하는 함수는 다음과 같습니다.

def generate_using_trigrams(cut=30):
    idx = 0
    prev, current = random.choice(list(trigram_transitions.keys()))
    result = [current]
    while True:
        next_word_candidates = trigram_transitions[(prev, current)]
        next_word = random.choice(next_word_candidates)
        prev, current = current, next_word
        result.append(current)
        if idx == cut:
            return " ".join(result)
        idx += 1

예측 결과 일부는 다음과 같습니다.

(1) 나는 살려고 난 것 같지를 아니해요. 아버지와 두 오라비를 건져 내려고 기생이 된 것이라. 영채가 평양 감옥에 흙물 옷을 입으신 부친의 얼굴을 대하기는 하였사오나, 무섭게 여윈 그 얼굴을 보았다. 이제 보니 선형이나

(2) 생각에 자기의 지아비는 극히 깨끗하고 점잖은 사람이라야 할 터인데 그러한 소리를 염치없이 하는 형식은 죄인인 듯하다. 더러운 기생에게 하던 버릇을 내게다가 했구나 하고 선형은 정면으로 형식을 본다. 형식은 자기의 변명을 할 기회가

(3) 그는 조선인 교육계에 대하여 항상 불만한 생각을 품는다. 그가 경성교육회라는 것을 설립할 양으로 두어 달을 두고 분주한 것도 이러한 기관을 이용하여 자기의 교육에 대한 이상(理想)을 선전(宣傳)하려 함이었다. 그러나 다른 교사들은 총독부의 고등보통교육령과

Comments