
사용할 데이터: 네이버 영화 리뷰 데이터
!pip install konlpy # 설치
import pandas as pd # 테이블구조
import matplotlib.pyplot as plt # 시각화
import urllib.request # 파일 불러오기
from gensim.models.word2vec import Word2Vec # 모델 라이브러리
from konlpy.tag import Okt # 형태소 분석기
from tqdm import tqdm # 진행 표시줄(Progress Bar)
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings.txt", filename="ratings.txt") # 파일 다운
train_data = pd.read_table('ratings.txt') # 다운된 파일 읽기
train_data[25:30] # 중간 5개 출력 - [시작:끝]

-> 형태 파악
print(len(train_data))

-> 리뷰 총 갯수가 200000개인것을 확인
urllib.request.urlretrieve('경로', filename='파일명')
- 현재 디렉토리에 경로에 있는 파일을 다운로드한다.
pandas.read_table('파일객체')
- 텍스트 파일이나 표 형식의 데이터를 DataFrame으로 읽어오는 데 사용
print(train_data.isnull().values.any()) # 결측값이 있는지 확인

-> 어딘가에 결측값이 있는지 확인함
train_data = train_data.dropna(how = 'any') # Null 값이 존재하는 행 제거
print(train_data.isnull().values.any()) # Null 값이 존재하는지 다시 확인

print(len(train_data)) # 리뷰 개수 출력

-> 결측값이 삭제 후 리뷰 개수 199,992개인 것을 확인
# 정규 표현식을 통한 한글외 문자 제거
# train_data['document'] = train_data['document'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")
train_data['document'] = train_data['document'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]+", "", regex=True)
train_data[25:30] # 중간 5개 출력 - [시작:끝]

-> 확인해보니 한글 제외하고 숫자나 영어가 사라짐
# 옵션(Optional)
# train_data = train_data.head(20000) #처음 20,000개만 사용
stopwords = ['의','가','이','은','들','는','좀','잘','걍','과','도','를','으로','자','에','와','한','하다']
okt = Okt() # (시간소요: 총~14분, 20000개/~1분40초)
tokenized_data = [] # token을 저장할 배열(array)
for review in tqdm(train_data['document']):
tokenized_review = okt.morphs(review, stem=True) # 토큰화
stopwords_removed_review = [word for word in tokenized_review if not word in stopwords] # 불용어 제거
tokenized_data.append(stopwords_removed_review)
# 리뷰 길이 분포 확인
print('리뷰의 최대 길이 :',max(len(review) for review in tokenized_data))
print('리뷰의 평균 길이 :',sum(map(len, tokenized_data))/len(tokenized_data))
plt.hist([len(review) for review in tokenized_data], bins=50)
plt.xlabel('length of samples') # 샘플 길이 - x축 레이블
plt.ylabel('number of samples') # 샘플 길이에 해당되는 빈도수 - y축 레이블
plt.show() # display

from gensim.models import Word2Vec # 모델 불러오기(import)
model = Word2Vec(sentences = tokenized_data, vector_size = 100, window = 5, min_count = 5, workers = 4)
# 약 20초 소요
model.wv.vectors.shape # 완성된 임베딩 매트릭스의 크기 확인

-> 단어: 16477개, 각 단어: 100차원
Word2Vec(sentences='None', vector_size=None, window=None, min_count=None, workers=None)
print(model.wv.most_similar("이정재"))

print(model.wv.most_similar("최민수"))

print(model.wv.most_similar("히어로"))

word2vector객체.wv.most_similar(positive/negative='text', topn=None)
하다보니 정말 재미있는 프로젝트였다.