본문 바로가기

deeplearning

Gensim Word2Vec Fine-tuning

fine tuning은 이미 학습된 레이어의 parameter를 조금씩 수정을 하는 방식으로 이루어진다.

 

단, finetuning 시 추가되는 데이터의 속성과 양 혹은 레이어의 추가 여부 등에 따라 overfitting을 발생시킬 수 있기 때문에 모델의 기존 purpose와 performance를 그대로 유지하되 몇 가지만 추가할 목적으로 finetuning을 진행하는 것은 옳지 않은 선택일 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
pip install torch
pip install --upgrade gensim # for gensim (word2vec)
pip install --upgrade pip
pip install nltk
 
 
import pandas as pd
import torch
import numpy as np
import torch.nn as nn
from nltk.tokenize import RegexpTokenizer
import re
import os
import pickle
import gensim
from gensim.models import Word2Vec, KeyedVectors
from gensim.models.callbacks import CallbackAny2Vec
import operator
from time import time  # To time our operations
 
#이전에 selenium으로 크롤링한 데이터들을 정리해 csv파일로 만들어 놓았다. 이를 가져와 사용한다.
 
df = pd.read_csv('instagram_final.csv', header = None)
df = df[[1,2,3]]
df.columns = ['id','text','time']
df
 
text = df['text']
 
 
 
#전처리
 
def remove_emoji(text):
    emoji_pattern = re.compile("["
                           u"\U0001F600-\U0001F64F"  # emoticons
                           u"\U0001F300-\U0001F5FF"  # symbols & pictographs
                           u"\U0001F680-\U0001F6FF"  # transport & map symbols
                           u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                           u"\U00002702-\U000027B0"
                           u"\U000024C2-\U0001F251"
                           "]+", flags=re.UNICODE)
    return emoji_pattern.sub(r'', text)
 
def remove_hashtag(text):
    a = re.compile(r'#')
    return a.sub(r'',text)
 
def remove_friendtag(text):
    a = re.compile(r'@*')
    return a.sub(r'', text)
 
df_text = []
 
for num,i in enumerate(df['text']):
    i = i.replace('&''and')
    i = i.replace('/''and')
    i = remove_emoji(i)
    i = remove_hashtag(i)
    i = remove_friendtag(i)
    i = i.lower()
    df_text.append([i])
    
tokenizer = RegexpTokenizer(r'\w+')    
tokenized_text = [tokenizer.tokenize(i) for i in text for text in df_text]
 
 
#fine-tuning gensim word2vec
 
!wget -"https://s3.amazonaws.com/dl4j-distribution/GoogleNews-vectors-negative300.bin.gz"
 
model = KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin.gz",binary = True)
 
model_2 = Word2Vec(size=300, min_count=1)
 
model_2.build_vocab(tokenized_text)
 
total_examples = model_2.corpus_count
 
 
model_2.build_vocab([list(model.vocab.keys())], update=True)
 
model_2.intersect_word2vec_format("GoogleNews-vectors-negative300.bin.gz", binary=True)
#   Merge the input-hidden weight matrix from the original word2vec-tool format given, where it intersects with the current vocabulary. 
#   (No words are added to the existing vocabulary, but intersecting words adopt the file’s weights, and non-intersecting words are left alone.)
 
model_2.train(tokenized_text, total_examples=total_examples, epochs=model_2.iter)
 
result = model_2.wv.most_similar('blm')
print(result)
 
 
model_2.save('instaw2v.model')
cs

결과