2020. 2. 22. 14:28ㆍnlp
같은 영화라도 넷플릭스와 네이버의 줄거리 소개는 다르다. 이 둘이 어떻게 다른지 알아보고자 word2vec 결과를 시각화하려 한다.
203개 드라마, 932개 영화에 대한 넷플릭스, 네이버 각각의 시놉시스를 크롤링했고, 이제 이를 분석하면 된다~!
크롤링 방법은 여기서 확인하면 된다.
1) 넷플릭스 시놉시스 크롤링 : https://codlingual.tistory.com/10
2) 네이버 시놉시스 크롤링 : https://codlingual.tistory.com/11
영화 제목, 넷플릭스의 시놉시스인지 네이버 시놉시스인지 여부, 전체 시놉시스, 영화인지 드라마인지 여부
이렇게 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 파일이 만들어 진다.
같은 방식으로 넷플릭스 시놉시스도 시각화해보면 다음과 같다.
근데 둘이 비교해도 딱히 유의미한 결과가 나오진 않았다.. 그냥 뿌듯한 경험으로 남았다..
'nlp' 카테고리의 다른 글
세종구어코퍼스에서 종결어미/선어말어미만 추출하기 (0) | 2020.05.10 |
---|---|
세종 구어 말뭉치(tei 포맷) csv로 변환하기 (0) | 2020.05.10 |
BERT Word Embeddings 튜토리얼 번역 및 정리 (3) | 2020.02.14 |
BERT 파헤치기 Part 1-2 번역 및 정리 (0) | 2020.02.11 |
그림으로 보는 BERT 번역 및 정리 (0) | 2020.02.11 |