# IMDB๋
์ธํฐ๋ท ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Internet Movie Database, ์ฝ์นญ IMDB)์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์ํ ์ฌ์ดํธ IMDB์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์ด๋ค.
์ด ๋ฐ์ดํฐ๋ ๋ฆฌ๋ทฐ์ ๋ํ ํ ์คํธ์ ํด๋น ๋ฆฌ๋ทฐ๊ฐ ๊ธ์ ์ธ ๊ฒฝ์ฐ 1, ๋ถ์ ์ธ ๊ฒฝ์ฐ 0์ผ๋ก ํ์ํ ๋ ์ด๋ธ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ์ด๋ค.
์ด ๋ฐ์ดํฐ์ ์ ์ผ๋ผ์ค์์ importํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ๋จธ์ ๋ฌ๋์ ์ ์ํ ๊ฒ์ด๋ค.
๋ชฉ์ ์ ํ ์คํธ ๋ถ๋ฅ, ๊ทธ ์ค์์๋ ๊ฐ์ฑ ๋ถ๋ฅ๋ฅผ ์ฐ์ตํ๊ธฐ์ํจ์ ์๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฑ ๋ถ๋ฅ(Sentiment Analysis)๋, ํ ์คํธ ์์ ๋ค์ด์๋ ์ฌ๋ฌ๊ฐ์ง ์ฃผ๊ด์ ์ธ ์ ๋ณด(์๊ฒฌ, ๊ฐ์ฑ, ํ๊ฐ, ํ๋ ๋ฑ)์ ๋จธ์ ๋ฌ๋์ ๋๋ ค ๋ถ์ํ๋ ๊ฒ์ด๋ค.
#์ ๋ ฅ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
#์ผ๋ผ์ค์ ๋ฐ์ดํฐ์
์ ์๋ IMDB๋ฅผ ๋ถ๋ฌ์จ๋ค.
from keras.datasets import imdb
(train_data, train_labels) , (test_data, test_labels) = imdb.load_data(num_words=5000)
#์ต๋ 5000๊ฐ์ ๋จ์ด๋ง์ ํ์ฉํจ.
print(len(train_data))
print(len(train_labels))
print(len(test_data))
print(len(test_labels))
#๊ฐ 25,000๊ฐ์ฉ ์ด 10๋ง๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์.
print("--------")
print(train_data[:3])
#ํ์ต๋ฐ์ดํฐ๋ฅผ ์์ 3๊ฐ ์ถ๋ ฅํด์ ํ์ธ
print("--------")
print(train_labels[:3])
#negative์ธ์ง positive์ธ์ง ์์ 3๊ฐ ํ์ธ
ํ์ธ์ ์ํด ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด ๋ณธ ๊ฒฐ๊ณผ, ๊ฐ ๋ณ์์๋ 25,000 ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์๊ณ , ํ์ต๋ฐ์ดํฐ์ ํ์ต๋ฐ์ดํฐ์ label์ด ์ ๋ค์ด์๋ ๊ฒ์ ํ์ธํ ์์๋ค.
ํ์ฌ ์ํ๋ค์ด ์ด๋ฏธ ์ ์ ์ธ์ฝ๋ฉ๊น์ง ์ ์ฒ๋ฆฌ๊ฐ ๋ ๊ฒ์ ํ์ธํ ์ ์์์ผ๋, ๊ฐ ์ํ๋ค์ ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ํ์ ๊ธธ์ด๋ฅผ ๋ง์ถ์ด์ผ ํ๋ค.
print("max >> " ,max([max(sequnce) for sequnce in train_data]))
#num_words๋ฅผ 5000์ผ๋ก ์ค์ ํ์ผ๋ 5000์ ๋๋ index๋ ์์. ์ต๋๊ฐ 4999
word_index = imdb.get_word_index()
reverse_word_index = dict(
[(value, key) for (key, value) in word_index.items()])
# print("์ ๋ ฌ์๋ word_index ๊ฐ๋ค ํ์ธ :")
# print(reverse_word_index.items())
print("์ ๋ ฌ๋ word_index ๊ฐ๋ค ํ์ธ :")
print(sorted(reverse_word_index.items()))
์ต๋๊ฐ์ด 4999๋ก ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ํ word_index๋ฅผ dictํ์์ผ๋ก ๋ง๋ค๊ณ sort๋ฅผ ํ์๋๋ ์ ์ ๋ ฌ๋์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
# (0 = ํจ๋ฉ, 1=๋ฌธ์์์, 2=์ฌ์ ์ ์์) ์ด ์ธ๋ฑ์ค ์์ ๋ค์ด๊ฐ์ผํ๋ 3๊ฐ๋ฅผ ๋บ.
def decoded_review(text) :
return ' '.join( [reverse_word_index.get(i-3, '?' ) for i in text])
#์ฐพ๋ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ?๋ฅผ ์ถ๋ ฅํจ
# ์์๋ก ์๋ฌด๊ฑฐ๋ ํ๋ จ ๋ฐ์ดํฐ์ ๊ฐ๋ค์ ์ถ๋ ฅํด์ ํ์ธํด๋ด.
print(train_data[3])
print(decoded_review(train_data[3]))
print()
print(train_data[11])
print(decoded_review(train_data[11]))
์ถ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๊ธฐ์กด์ 1์ด ‘the’์ด๊ณ , 13๋ฒ์ด was ์์๋๋ฐ, ‘ํจ๋ฉ’๊ณผ ‘๋ฌธ์์์’, ‘์ฌ์ ์ ์์’์ ๋ฃ๊ธฐ์ํด ์ธ๋ฑ์ค 3๊ฐ๋ฅผ ์ถ๊ฐํ์๋๋ ๋ค๋ก ๋ฐ๋ ค๋์ ํ์ฌ 4๋ฒ์ด ‘the’์ด๊ณ , 13๋ฒ์ด ์๋ 10๋ฒ์ด์๋ ‘i’๋ก ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์ ์ ๊ฒฝ๋ง์ ๋ฃ๊ธฐ์ํด ์ ๊ทํ๋ฅผ ํด์ฃผ์ด์ผํ๋ค.
import numpy as np
def vectorize_sequences(sequences, dimension=5000):
#์ ๊ฒฝ๋ง์ ์
๋ ฅ์ ์ํด 5000๊ฐ์ ์์๋ก ์ด๋ฃจ์ด์ง ๋ฒกํฐ๋ก ๋ณํํด์ค.
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
print(len(train_data))#train_data๋ ํ์ฌ 25000๊ฐ๊ฐ ์์.
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
y_train = np.asarray(train_labels).astype('float32')
#float ๋ฐ์ดํฐ ํํ๋ฅผ ์์๋ก ๊ฐ์ง๋ ๋ฐฐ์ด์ ๋ง๋๋ np.asarray() ํจ์๋ฅผ ์ฌ์ฉ
y_test = np.asarray(test_labels).astype('float32')
print(x_train[0])
print(x_test[0])
print(y_train[0])
print(y_test[0])
๊ฐ์ ๋ณํํด์ฃผ๊ณ ํ์ธ์ ์ํด print๋ฅผ ํด๋ณด๋ 25000๊ฐ์ train_data๋ฅผ ํ์ธํ๊ณ , ๊ฐ ๋ฐ์ดํฐ๋ค์ ์ถ๋ ฅํ๋ float ํ์์ 0๊ณผ 1๋ก ๋ณํ์ด ๋์๊ณ , labels ๋ํ floatํ์์ผ๋ก ์ ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ ๊ทํ๋ ์ด๋์ ๋ ๋ง์ณค์ผ๋ ๋ชจ๋ธ์ ์ ์ํด์ผํ๋ค.
#๋ชจ๋ธ ์ ์
from keras import models
from keras import layers
#๋ชจ๋ธ์ ์
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape = (5000,)))
model.add(layers.Dense(16, activation = 'relu'))
model.add(layers.Dense(1, activation = 'sigmoid'))
#๋ชจ๋ธ ์ปดํ์ผ
model.compile(optimizer= 'Adam', loss = 'binary_crossentropy', metrics=['accuracy'])
#๋ชจ๋ธ ํ์ธ
model.summary()
์ผ๋ผ์ค๋ฅผ import ํ์ฌ ๋ชจ๋ธ์ Sequential ๋ชจ๋ธ๋ก ์ค์ ํด ์ฃผ์๊ณ , ์ฒซ๋ฒ์งธ ๋ ์ด์ด๋ 32๊ฐ์ ๋ ธ๋์ด๊ณ ,
ํ์ฑํํจ์๋ relu๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ ๋ ฅ๋ฐ์ดํฐ๋ 5000๊ฐ์ฉ ๋ฐฐ์ดํ์์ผ๋ก ์ ๋ ฅ๋ฐ๋๋ค.
5000๊ฐ์ ์ ๋ ฅ์ธต์์ 32๊ฐ์ ์๋์ธต์ผ๋ก ๊ฐ๊ฐ ์ฐ๊ฒฐ๋์๊ธฐ์ ๊ฐ์ค์น๋ 5000*32 ํด์ 160000์ด ๋์๊ณ ,
๊ฐ ๋ ธ๋ ์๋งํผ ํธํฅ์ด ์๊ธฐ์ ํธํฅ์ 32์ด๋ค.
๋ฐ๋ผ์ ํ๋ผ๋ฏธํฐ๋ 160032์ธ ๊ฒ์ ํ์ธํด ๋ณผ ์ ์๋ค.
๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๋ฒ์งธ ๋ ์ด์ด๋ 16๊ฐ์ ๋ ธ๋๋ก ์ค์ ํ์๊ณ ๊ฐ์ ๋ ๋ฃจํจ์๋ฅผ ์ฌ์ฉํ์๋ค.
๋ง์ง๋ง ์ถ๋ ฅ์ธต์ ์๊ทธ๋ชจ์ด๋ํจ์๋ฅผ ์ด์ฉํ์ฌ 0 or 1์ด ๋์์ผํ๋ 1๊ฐ์ ๋ ธ๋๋ก ์ค์ ํ์๋ค.
#๋ชจ๋ธ ํ๋ จ
# ๊ฒ์ฆ๋ฐ์ดํฐ๋ 25000๊ฐ ์ค์ 5์ฒ๊ฐ๋ก ๊ฒ์ฆ, ๋๋จธ์ง 2๋ง๊ฐ๋ก ํ๋ จ
x_val = x_train[:5000]
partial_x_train = x_train[5000:]
y_val = y_train[:5000]
partial_y_train = y_train[5000:]
history = model.fit(partial_x_train, partial_y_train, epochs=20, batch_size=512, validation_data=(x_val, y_val))
ํ๋ จ์ ์์ ๋ฐ์ดํฐ 25000๊ฐ ์ค์ 5์ฒ๊ฐ๋ ๊ฒ์ฆ, ๋๋จธ์ง 2๋ง๊ฐ๋ก ํ๋ จ์ ํ๊ธฐ ์ํด ๋๋์ด ์ฃผ์๊ณ ,
2๋ง๊ฐ๋ก๋ง ํ๋ จ์ ํ์๋ค.
Epochs๋ฅผ 20์ผ๋ก ์ค์ ํ์์ผ๋ ์ด๋ฐ์์ผ๋ก 20๋ฒ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ๋ฒ์ 512๊ฐ์ฉ ํ๋ จ์ ํ๋๋ก batch_size๋ฅผ ์กฐ์ ํด ์ฃผ์๊ณ , ๊ฒ์ฆ๋ฐ์ดํฐ์ ์ x_val, y_val๋ก ์ค์ ํ๊ณ ํ๋ จ์ ์์ํ์๋ค.
์ด ๊ณผ์ ์์ ๋์ค๋ ๊ฐ๋ค์ history์ ์ ์ฅ์ ํ์ฌ ๊ณผ์ ํฉ(overfitting)์ด ์ผ์ด๋๋ ๊ตฌ๊ฐ์ ์ฐพ์ ๋ณผ ๊ฒ์ด๋ค.
history_dict = history.history
print(history_dict.keys())
๊ฐ ํค์ ๊ฐ์ด ๋์์ผ๋ ์ด๋ฅผ ์ด์ฉํด์ ์๊ฐ์ ์ผ๋ก ๋ณด๊ธฐ ํธํ๊ฒ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณผ ๊ฒ์ด๋ค.
import matplotlib.pyplot as plt
acc = history_dict['loss']
loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']
epochs = range(1, len(acc) + 1) #20๋ฒ
plt.plot(epochs, loss_values, 'bo', label='Training loss')
plt.plot(epochs, val_loss_values, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
ํ๋ จ๋ฐ์ดํฐ์ loss์ ๊ฒ์ฆ๋ฐ์ดํฐ์ loss๋ฅผ ๊ทธ๋ํ๋ก ํํํ์ฌ ํ์ธํด ๋ณด๋ epochs๊ฐ 3์ ๋ ์ดํ๋ถํฐ๋ ํ๋ จ๋ฐ์ดํฐ์ loss๋ ์ ์ ์ค์ด๋ค์ง๋ง, ๊ทธ์ ๋ฐ๋๋ก ๊ฒ์ฆ๋ฐ์ดํฐ์ ์ค๋ฅ๋ ์ ์ ์ฆ๊ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ๋ง์ ์ฆ์จ, ๊ณผ์ ํฉ ํ์์ด ์ผ์ด๋ ๊ฒ์ด๋ค.
์ ํ๋๋ฅผ ๊ทธ๋ํ๋ก ๊ทธ๋ ค๋ด๋ ๋๊ฐ์ ํ์์ด ์ผ์ด๋ ๊ฒ์ด๋ค.
Loss๊ฐ ๋ฎ๋ค๋ ๊ฒ์ ๊ทธ๋งํผ ์ ํ๋๋ ๋๋ค๋ ๋ป์ด๋ ๊ฐ์ ์๋ฏธ์ ๊ทธ๋ํ๋ผ๊ณ ๋ณด์๋ ๋ฌด๋ฐฉํ๋ค.
plt.clf() # ์์ฑํ ๊ทธ๋ํ๋ฅผ clear
acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Acc')
plt.legend()
plt.show()
Epochs๊ฐ 3์ผ ๋ ๊ฒ์ฆ๋ฐ์ดํฐ์ ์ ํ๋๊ฐ 87%์ ๋ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ผ ์ด์ epochs๋ฅผ 4์ ๋๋ก์์ ํ์ฌ ๊ณผ์ ํฉํ์์ด ์ผ์ด๋์ง ์๊ฒ ํ๋ จ์ ์์ผ์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํ๋๋ฅผ ํ๊ฐํด๋ณธ๋ค.
scores = model.evaluate(x_val, y_val, verbose=0)
# ํ
์คํธ ๋ฐ์ดํฐ์ ๋ํด์ ์ ํ๋ ํ๊ฐ
print('์ ํ๋ : %.2f%%' % (scores[1]*100))
Epochs๋ฅผ 4๋ก ์ค์ ํ๊ณ 4๋ฒ์ ๋๋ฆฐ ๋ค ์๋ก์ด ๋ฐ์ดํฐ์ ์ ํ๋๊ฐ 88.22%๊ฐ ๋์๋ค.
90%์ด์ ๋์ค๊ธฐ๋ฅผ ๊ธฐ๋ํ์์ง๋ง ์ด์ง ์์ฌ์์ด ๋๊ปด์ง๋ค.
๋ค์ ๋ชจ๋ธ์ ํ์ธํด๋ณด๋ ๋ ์ด์ด์ธต์ 3๊ฐ๋ก ๋ง๋ค์์๋๋ฐ, 2๊ฐ๋ 4๊ฐ๋ก๋ ๋ง๋ค์ด๋ณด๊ณ ํ์ฑํํจ์๋ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด ๊ทธ ์ค์์ ์ ๋ง๋ค์ด์ง ๋ชจ๋ธ์ ์ ํ๋๊ฐ 90% ์ด์ ๋์ฌ ๊ฒ ๊ฐ๋ค.
์ผ๋จ 88.22%๋ ๋์ ์์น์ด๋ ์ด ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์ค์ ๋ก ์ ์ฉํด ๋ณด๊ณ ์ถ์๋ค.
# AI ์ฌ์ฉ
IMDB ํํ์ด์ง์ ๋ด๊ฐ ์ข์ํ๋ ์์ด์ธ๋งจ์ ๊ฒ์ํ์ฌ ํ์ ์ ํ์ธํด ๋ณด์๋ค.
์ญ์ ํ์ ์ด ๋์ ํธ์ด์๋ค.
์ ์ ๋ฆฌ๋ทฐ์ค์ ํ์ ์ด ์ข์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ํ๋ ๊ฐ์ง๊ณ ์๋ค.
์ด ๋ฆฌ๋ทฐ๋ฅผ ๋ด๊ฐ ๋ง๋ ๋ชจ๋ธ์ ์ง์ด ๋ฃ์ด๋ณด๊ณ , ๊ธ์ ์ ์ธ ๋ฆฌ๋ทฐ์ธ์ง ๋ถ์ ์ ์ธ ๋ฆฌ๋ทฐ์ธ์ง ํ์ธ์ ํ์๋ค.
import re
from tensorflow.keras.preprocessing.sequence import pad_sequences
model.evaluate(x_val,y_val)[1]
def sentence(new_sentence):
# ์ํ๋ฒณ๊ณผ ์ซ์๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ์ ๊ฑฐ ๋ฐ ์ํ๋ฒณ ์๋ฌธ์ํ
new_sentence = re.sub('[^0-9a-zA-Z ]', '', new_sentence).lower()
# ์ ์ ์ธ์ฝ๋ฉ
encoded = []
for word in new_sentence.split():
try : # ๋จ์ด ์งํฉ์ ํฌ๊ธฐ๋ฅผ ์ ํ.
if reverse_word_index[word] <= 5000:
encoded.append(reverse_word_index[word]+3)
else:
# ์ค์ ํ ์ซ์ ์ด์์ ์ซ์๋ <unk> ํ ํฐ์ผ๋ก ์ทจ๊ธ.
encoded.append(2)
# ๋จ์ด ์งํฉ์ ์๋ ๋จ์ด๋ <unk> ํ ํฐ์ผ๋ก ์ทจ๊ธ.
except KeyError:
encoded.append(2)
pad_new = pad_sequences([encoded], maxlen = 5000) # ๋ฌธ์ฅ์ ๊ธธ์ด๋ฅผ maxlen์ผ๋ก ๋ง์ถ์ด์ค.
score = float(model.predict(pad_new)) # ์์ธก
if(score > 0.5):
print("{:.2f}% ํ๋ฅ ๋ก ๊ธ์ ๋ฆฌ๋ทฐ์
๋๋ค.".format(score * 100))
else:
print("{:.2f}% ํ๋ฅ ๋ก ๋ถ์ ๋ฆฌ๋ทฐ์
๋๋ค.".format((1 - score) * 100))
temp = "When it comes to ranking the Marvel superhero(live action) films,
Iron Man is for me up there with the better ones. It looks fabulous,
the whole film …" #๋๋ฌด๊ธธ์ด์ ์ค๋ตํ์์. (์ฝ๋์๋ ์ ์ฒด๋ก ๋ค์ด๊ฐ)
sentence(temp)
re ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์ ๊ทํํ์์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํน์๋ฌธ์๋ค์ ์ ๊ฑฐํ์๊ณ ,
๋ชจ๋ธ์ ๋ฃ์ ์ ์๊ฒ pad_sequences๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ฅ์ ๊ธธ์ด๋ฅผ ์ค์ ํด ์ฃผ์๊ณ ,
์ด๋ฅผ floatํ์ผ๋ก predict ํ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์ฐพ์ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ ธ์์ temp ๋ณ์์ ๋ฃ์ด์ฃผ๊ณ ์ด๋ฅผ ๋๋ ค๋ณด์๋ค.
์ด๋ ๊ฒ ๋ด๊ฐ ์๋ ์ํ๋ค์ ๋ถ์ ์ , ๊ธ์ ์ ๋ฆฌ๋ทฐ๋ฅผ ๋๋ ค๋ณด๋ ๋ณ์ ์ ๋น์ทํ๊ฒ ๊ฝค ๊ด์ฐฎ๊ฒ ์์ธก์ ํ๋ ๊ฒ์ ํ์ธํ์๋ค.
#ํ๊ธฐ
์ฒ์๋ถ๋ถ์ IMDB๋ฅผ ์ฌ์ฉํ์ฌ ์ป๊ณ ์ถ์ ๋ชฉ์ ์ด์๋ ‘ํ ์คํธ ๋ถ๋ฅ’ , ‘๊ฐ์ฑ ๋ถ๋ฅ’์ ๋ํด ๋ถ๋ฅํ๋ ๋ฐฉ๋ฒ์ ์ตํ๋๋ฐ ๋์์ด ๋์๋ค.
๋ชจ๋ธ์ ์์ฑํด๋ณด๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ชจ๋ธ๋ค์ด๋, ์ผ๋ผ์ค ๊ณต์ํํ์ด์ง์์ ๋ณด์ฌ์ฃผ๋ ๋ชจ๋ธ์ ํ์ธํด๋ณด๋, ํ์คํ ์ฌ๋ฌ๊ฐ์ง ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํด ๋ณด๊ณ , ๋ ธ๋๋ ๋ฐฐ์น์ฌ์ด์ฆ ๋ฑ์ ๊ณ์ ์์ ํด๋ณด๋ฉด์ ๋ค์ํ ๋ชจ๋ธ์ ๋ง๋ค์ด ๋ณด์์ผ ๋๊ฒ ๋ค๊ณ ์๊ฐํ์๋ค.
์ธ๊ณต์ง๋ฅ์ด๋ผ๋ ๊ฒ์ด ๋ชจ๋ธ์ ์ ์ํ๋ ๊ฒ ๋ณด๋ค, ๋ฐ์ดํฐ๋ค์ ๊น๋ํ๊ณ ์ ๊ทํ๋๊ฒ ๋ค๋ฌ๋ ์์ ์ ๋น์ค์ด ํจ์ฌ ๋๊ณ ์ค์ํ๋ค.
IMDB๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ๋ถ๋ฅ๋ฅผ ํด๋ณด์์ผ๋, ์ด๋ฒ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์ ๊ฐ์ง๊ณ ๋ชจ๋ธ์ ๋ค์ ์ ์ํ์ฌ ์ ์ฉํด๋ณด์์ผ๊ฒ ๋ค.