When will you grow up?

Gensim과 keras를 이용한 단어 임베딩 본문

02. Study/Deep Learning

Gensim과 keras를 이용한 단어 임베딩

미카이 2019. 8. 6. 21:42

단어 임베딩(Word Embedding)

- 단어 벡터 사이에 추상적이고 기하학적인 관계를 얻으려면 단어 사이에 있는 의미 관계를 반영해야되는데, 단어 임베딩은 언어를 기하학적 공간에 매핑하는 것이다.

ex) 임베딩 공간에서는 동의어가 비슷한 단어 벡터로 임베딩. 즉, 멀리 떨어진 위치의 단어는 서로 의미가 다르며 거리 외에 공간의 특정 방향도 의미를 가질 수 있다.

 

- 기하학적 변환은 ('king'벡터) + ('female'벡터) = ('queen'벡터) /  ('서울') + ('중국') - ('한국') = ('베이징')

 단어 임베딩 공간은 전형적으로 위와 같은 해석이 가능하고 잠재적으로 유용한 고차원 벡터를 특성으로 가진다.

 

 

Word2Vec

- 각 단어를 임베딩이라고 부르는 작고 밀집된 벡터(ex-100차원)로 나타내는 것을 의미한다.

  뉴럴넷 학습을 통해 전형적으로 비슷한 단어가 점차 서로 모이게 하고, 의미있는 방향으로 조직되게 만든다.

  ex) 남자 / 여자,     단수 / 복수,    킹 / 퀸 등 표현되는 여러 개의 축을 따라 나열

https://www.tensorflow.org/tutorials/representation/word2vec

 

 

 

 

Gensim

 

1)실습을 위해 Gensim을 설치하자

1
pip install gensim
 

 

 

2) Word3Vec 모델을 학습할 말뭉치 데이터 준비

(국립국어원 : https://ithub.korean.go.kr/user/total/database/corpusManager.do)

(위키피디아 데이터 : https://dumps.wikimedia.org/kowiki/latest/)

여기서는 위키피디아 데이터를 이용

 

 

3) Word2Vec 모델 학습

1
2
3
4
5
from gensim.models import word2vec
 
data = word2vec.Text8Corpus('data/wiki.m')  
model = word2vec.Word2Vec(data, size = 100#100차원
 

 

 

4) 학습된 모델 활용

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
from gensim.models import word2vec
 
result =model.most_similar(positive=['아빠','여성'],negative=['남성'])
print(result)
print(result[0]) # 엄마
 
 
result =model.most_similar(positive=['서울','일본'],negative=['한국'])
print(result)
print(result[0]) # 도쿄
 
 
result =model.most_similar(positive=['서울','중국'],negative=['한국'])
print(result)
print(result[0]) # 베이징
 
 
result =model.most_similar(positive=['오른쪽','남자'],negative=['왼쪽'])
print(result)
print(result[0]) # 여자
 
 
result =model.most_similar(positive=['서울','맛집'])
print(result)
print(result[0]) # 강남
 
 
result =model.most_similar(positive=['유재석'])
print(result[0]) # 강호동
 
result =model.most_similar(positive=['왼쪽'])
print(result[0]) # 오른쪽
 
 
result =model.most_similar(positive=['여학생','남자'],negative=['여자'])
print(result)
print(result[0]) # 남학생
 
 
result =model.most_similar(positive=['걷기','수영'],negative=['여자'])
print(result)
print(result[0]) # 하이킹
 
 
result =model.most_similar(positive=['유재석','강호동'])
print(result[0]) # 노홍철
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

 

 

 

Keras Embedding Layer 

- keras는 Embedding layer를 제공해준다.

 

- IMDB data를 활용한 영화 리뷰가능한 토큰의 개수 (1,000 으로 단어 인덱스 최댓값 + 1 입니다)

- 임베딩 차원 여기서는 64

- embedding_layer = Embedding(1000, 64)

- 영화 리뷰에서 가장 빈도가 높은 10,000개의 단어를 추출하고, 리뷰에서 20개 단어 이후는 버린다. 

- 이 네트워크는 10,000개의 단어에 대해 8 차원의 임베딩을 학습하여 정수 시퀀스 입력(2D 정수 텐서텐서)를 임 
베딩 시퀀스(3D 실수형 텐서텐서)로 바 꿈. 그 다음 이 텐서를 2D로 펼쳐서 분류를 위한 Dense 층을 훈련.

 

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
####### 데이터 준비 
from keras.layers import Embedding
from keras.datasets import imdb
from keras import preprocessing
 
max_features = 10000 # 특성으로 사용할 단어의 수
maxlen = 20  # 사용할 텍스트의 길이(가장 빈번한 20 개의 단어만 사용합니다)
 
# 정수 리스트로 데이터를 로드합니다.
import numpy as np
old = np.load
np.load = lambda *a,**k: old(*a,**k,allow_pickle=True)
 
from keras.datasets import imdb
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
 
np.load = old
del(old)
 
# 리스트를 (samples, maxlen) 크기의 2D 정수 텐서로 변환.
x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen) # 가장 빈번한 단어 최대 maxlen(20)개만
x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)
print(x_train.shape)
 
####### 모델 생성
 
from keras.models import Sequential
from keras.layers import Flatten, Dense, Embedding
 
model = Sequential()
 
# 가능한 토큰의 개수(1,0000)와 임베딩 차원(8)로 설정 
model.add(Embedding(100008, input_length=maxlen))
# Embedding 층의 출력 크기는 (samples, maxlen, 8)가 됨
 
model.add(Flatten())  #(samples, maxlen * 8) 크기의 2D 텐서로 펼침
 
 
# 분류기를 추가
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.summary()
 
 
####### 학습
 
history = model.fit(x_train, y_train,
                    epochs=10,
                    batch_size=32,
                    validation_split=0.2)
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

 

전체 코드 확인

gensim : 클릭

keras embedding : 클릭

Comments