넷플릭스/네이버 시놉시스 word2vec 시각화하기

2020. 2. 22. 14:28nlp

반응형

 

같은 영화라도 넷플릭스와 네이버의 줄거리 소개는 다르다. 이 둘이 어떻게 다른지 알아보고자 word2vec 결과를 시각화하려 한다.

203개 드라마, 932개 영화에 대한 넷플릭스, 네이버 각각의 시놉시스를 크롤링했고, 이제 이를 분석하면 된다~!

크롤링 방법은 여기서 확인하면 된다. 

 

 

1) 넷플릭스 시놉시스 크롤링 : https://codlingual.tistory.com/10 

 

넷플릭스 영화/드라마 시놉시스 크롤링

넷플릭스는 데이터에 미친 것으로 유명하다. 근데 넷플릭스의 빅데이터 활용 사례 중 언어를 분석한 사례는 잘 못 봤다. 다 영화 포스터 얘기, 추천 시스템 얘기. 그냥 넷플릭스 시놉시스에 관심 갖는 사람이 많이..

codlingual.tistory.com

 

2) 네이버 시놉시스 크롤링 : https://codlingual.tistory.com/11

 

네이버 영화/드라마 시놉시스 크롤링

4416개 넷플릭스 시놉시스를 크롤링했다. 이제 이 영화/드라마의 네이버에서의 시놉시스를 크롤링하면 된다. 네이버 영화 API가 있어서 이걸로 수집하면 된다는데 모르겠다.. 그래서 그냥 하던대로 했다. 우선 네..

codlingual.tistory.com

 

영화 제목, 넷플릭스의 시놉시스인지 네이버 시놉시스인지 여부, 전체 시놉시스, 영화인지 드라마인지 여부 

이렇게 4가지 정보를 수집했다. 

word2vec에선 영화 제목이나 영화 드라마 여부는 크게 중요하지 않은 것 같아서

[네이버의 전체 시놉시스만 모아놓은 텍스트 파일]과 [넷플릭스의 전체 시놉시스만 모아놓은 텍스트 파일]을 사용했다.

 

우선 네이버 전체 시놉시스를 불러오고, 줄바꿈 문자를 경계로 나눈다. 빈 줄까지 제거하면 sentences라는 리스트에 전체 시놉시스가 저장된다. 이 리스트의 요소 하나 하나가 한 영화/드라마의 시놉시스다.

 

with open('naver.txt', 'r', encoding='UTF8') as f:
    lines = f.read().splitlines()

sentences = [line for line in lines if line != '']

 

이제 형태소 단위로 나누는 작업을 해야 한다. konlpy 패키지를 이용해 쉽게 나눌 수 있다.

split 안에는 각 시놉시스의 형태소가 쪼개 들어가 있다.

 

from konlpy.tag import Kkma
kkma = Kkma()
split = [kkma.morphs(sent) for sent in sentences]

 

word2vec을 불러와 단어를 벡터로 변환한다.

 

from gensim.models import Word2Vec
model = Word2Vec(split, size=100, window=5, min_count=20, workers=4, iter=50, sg=1)

 

이제 이 벡터를 시각화할 수 있도록  PCA를 불러온다.

 

word_vectors = model.wv
vocabs = word_vectors.vocab.keys()
word_vectors_list = [word_vectors[v] for v in vocabs]

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
xys = pca.fit_transform(word_vectors_list)
xs = xys[:,0]
ys=xys[:,1]

 

※  그래프에 한글 깨지지 않도록 하기 

 

import matplotlib.font_manager as fm
fm._rebuild()

plt.rc('font', family='NanumGothic')

 

 

1) 일반적인 그래프로 시각화할 경우 

 

import matplotlib.pyplot as plt

def plot_2d_graph(vocabs, xs, ys):
    plt.figure(figsize=(15,10))
    plt.scatter(xs,ys,marker='o')
    for i,v in enumerate(vocabs):
        plt.annotate(v,xy=(xs[i], ys[i]))
        
plot_2d_graph(vocabs, xs,ys)

 

 

 

잘 안 보인다..

 

2) plotly 이용해서 html 파일로 만들기 

 

# annotation text 만들기 (시각화할 때 벡터 말고 단어도 필요하니까)
# vocabs = word_vectors.vocab.keys()

text=[]
for i,v in enumerate(vocabs):
    text.append(v)

 

import plotly
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=xs,
                                y=ys,
                                mode='markers+text',
                                text=text)) 

fig.update_layout(title='Naver Word2Vec')
fig.show()

plotly.offline.plot(
fig, filename='naver_word2vec.html'
)

 

그러면 내 맘대로 확대/축소하고 돌아볼 수 있는 html 파일이 만들어 진다.

 

naver_word2vec.html
3.16MB

 

같은 방식으로 넷플릭스 시놉시스도 시각화해보면 다음과 같다.

 

netflix_word2vec.html
3.11MB

 

근데 둘이 비교해도 딱히 유의미한 결과가 나오진 않았다.. 그냥 뿌듯한 경험으로 남았다..

반응형