반응형

이론은 다루지 않으며, keras를 활용하여 매우 간단한 모델을 만들어 보았습니다.

밑에 언급하듯, 더 좋은 모델을 만들기 위한 기법들을 전혀 고려하지 않은 매우 간단한 모형입니다.

튜토리얼 수준의 예제가 없어서 제가 만들어 보았습니다.

개요

종현의 '가을이긴 한가 봐' 한 곡만을 학습시킨 후, 맨 앞 한 소절만 주고 곡을 만들도록 했습니다.

 

전처리

데이터는 KoNLPy의 kkma를 활용하여 토크나이징한 후, 원 핫 인코딩하여 사용하였습니다. 저는 단 한 곡만을 학습시켰으므로 단어가 총 99개밖에 되지 않습니다. 더 좋은 모델을 만들기 위해서는 등장하는 단어가 아주 많아서 차원이 매우 커지는 문제와 동음이의어의 처리 문제 등에 대해 고민하셔야 합니다.

*Word Embedding, Word2vec 등을 공부하시면 좋을 것 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
kkma = Kkma()
= open('lyrics.txt''r')
lyrics = f.read()
tokens = kkma.pos(lyrics)
word2idx = {}
idx2word = {}
for i,v in enumerate(set([x[0for x in kkma.pos(lyrics)])):
    word2idx[v]=i
    idx2word[i]=v
bow = [word2idx[token] for token,_ in tokens]
 
seq = np.array([one_hot_encoding(x) for x in bow])
cs

 

word2idx는 단어를 숫자로, idx2word는 숫자를 다시 단어로 변환시켜주기 위한 딕셔너리입니다.

1
2
3
4
5
6
7
x_train = []
y_train = []
window_size = 4
for i in range(window_size,len(seq)):
    x_train.append(seq[i-4:i])
    y_train.append(seq[i])
x_train, y_train = np.array(x_train), np.array(y_train)
cs

window_size는 다음 단어를 예측하기 위해 앞의 몇 단어를 고려할 것 인지를 의미합니다. 저의 경우는 4로 했으므로 

['괜히', '설레', 'ㄴ', '것', '을', '보', '니']의 경우 '을'을 예측하기 위해 ['괜히', '설레', 'ㄴ', '것']을 사용합니다.

모델

1
2
3
4
5
6
7
model = Sequential()
model.add(LSTM(128, input_shape = (window_size, seq.shape[1])))
model.add(Dense(seq.shape[1], activation='softmax'))
 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
 
model.fit(x_train, y_train, epochs=30, batch_size=4, verbose=2)
cs

LSTM 한층과 Fully connected layer 한층으로 구성된 매우 간단한 모형입니다.

결과

1
2
3
4
5
6
7
8
9
10
11
12
ini = '가을이긴 한가 봐'
ini = [one_hot_encoding(word2idx[x]) for x,_ in kkma.pos(ini)]
out = []
 
= len(ini)
while i < 200:
    tmp_in = np.array(ini[i-4:i]).reshape((-1,4,99))
    tmp_pred = model.predict(tmp_in)
    pred_idx= np.argmax(tmp_pred)
    ini.append(one_hot_encoding(pred_idx))
    out.append(idx2word[pred_idx])
    i += 1
cs

노래의 첫 소절인 '가을이긴 한가 봐'를 시작으로 200 단어를 예측합니다.

결과는 다음과 같습니다.


가을이긴 한가

괜히 설렌 것을 보니

벌서 가을이 한창 물들었나봐

마음속 깊이 들어왔나 봐

 

잘 사냐는 네 인사에

쉽게 무너진 것을 보니

벌써 가을이 한창 물들었나 봐

 

마음속 깊이 들어왔나 봐

잘 사냐는 네 인사에 쉽게 무너진 걸 보니

벌서 가을이 한창 물들어나 봐

마음속 깊이 들어왔나 봐

 

잘 사냐는 네 인사에

쉽게 무너진 것을 보니

벌써 가을이 한창 물들었나 봐

마음속 깊이 들어왔나 봐


보시다시피 한곡만을 예측하다 보니 가사를 거의 동일하게 생성합니다. 다만 후렴에 빠져서 후렴이 계속 반복되는 것을 볼 수 있습니다. 이러한 문제를 해결하기 위해서는 노이즈를 추가하거나 하는 방식이 필요할 것 같습니다.

 

Source Code

 

SunggookCHOI/Laboratory

개인 학습의 기록. Contribute to SunggookCHOI/Laboratory development by creating an account on GitHub.

github.com

 

반응형

+ Recent posts