AI/정책 댓글 반응 NLP

[4] 포털 댓글 감성 분석_1. 순환신경망_3. Word2Vec 임베딩층

eraser 2020. 4. 21. 13:30
반응형

 Keras Embedding 레이어가 아닌, 팀 데이터셋에 맞는 Word2Vec 임베딩 층을 사용해 임베딩 층으로 주입한다. 이전의  LSTM 모델에서 임베딩 층만 달라지기 때문에, 해당 부분만 기록한다.

 


# Word2Vec Embedding

 

 모든 데이터셋(커뮤니티, 포털 게시글 및 댓글)을 mecab 형태소 분석기를 사용해 형태소 단위로 분석하고, Word2Vec 임베딩을 진행했다. Gensim라이브러리의 Word2Vec 모델을 사용했고, skip-gram 방식을 적용했다. 최소 등장 빈도는 5, 윈도우 사이즈는 10으로 설정하였으며, 100차원으로 임베딩하였다.

 

 임베딩 품질을 확인하기 위해 다음의 작업을 진행했다.

 

 첫째, 몇 가지 키워드를 선정하여 코사인 유사도가 높은 단어들을 추출했다. 어느 정도 유사한 단어들이 나오는 것을 확인할 수 있다.

 

Keyword

업무

파업

공무원

야근

워라밸

1순위

부서
(0.7209)

총파업
(0.8378)

공기업
(0.8160)

철야
(0.8421)

저녁
(0.7015)

2순위

과중
(0.7198)

노조
(0.7089)

철밥통
(0.7794)

초과근무
(0.8283)

칼퇴근
(0.6908)

3순위

부서장
(0.7081)

쟁의
(0.6854)

행정직
(0.7531)

특근
(0.8114)


(0.6875)

4순위

주어진다
(0.7036)

볼모
(0.6726)

관공서
(0.7090)

잔업
(0.7875)

여유
(0.6827)

5순위

효율
(0.7025)

노조원
(0.6606)

사기업
(0.7012)

퇴근
(0.7741)

여가
(0.6669)

 

 둘째, 단어 유추 평가 방법을 적용했다.

 

 

단어 유추 평가 예시

 

 

 


 

# 모델링_임베딩 층

 

 임베딩 층에 총 59185개의 단어가 존재한다. 코사인 유사도가 0.7 이상이 나오는 단어가 많은 것으로 보아 임베딩이 어느 정도 잘 수행되었고, 이미 최소 단어 출현 빈도를 5로 제한하였기 때문에, 어휘 집합의 수를 추가적으로 제한하지는 않았다.

 이전과 동일하게 mecab 형태소 분석 결과를 바탕으로, 케라스 토크나이저를 활용해 각 문장을 토크나이징한다. 이후 토크나이저의 단어가 Word2Vec 임베딩 모델 내에 존재한다면 해당 벡터를 사용하고, 그렇지 않다면 0으로 매칭하는 임베딩 층을 만든다.

 이전과 달리, 임베딩 층은 학습하지 않도록 trainable=False 옵션을 설정해야 한다.

 

은닉 노드의 수를 128로 설정한 기본 LSTM 모델을 적용하면 다음과 같다.

 

# module import
from gensim.models import word2vec, KeyedVectors

# load W2V model
model= word2vec.Word2Vec.load(f"{cur_path}/{model_100d}")

...

# embedding matrix
embedding_vocab = len(tokenizer.index_word)+1
embedding_dim = 100
g_embed_100 = np.zeros((embedding_vocab, embedding_dim))
for word, idx in tokenizer.word_index.items():
    temp = get_vector(word, model)
    if temp is not None:
        g_embed_100[idx] = temp
        
# make model
model = Sequential()
model.add(Embedding(vocab_size, 100, input_length=max_len, 
                    weights=[g_embed_100],
                    mask_zero=True, trainable=False))
model.add(LSTM(128))
model.add(Dense(3, activation='softmax'))

# compile the model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

...

 

 


# 결과

 

모델링을 진행한 결과는 다음과 같다.

 

 

 

 

 

 최종 테스트셋 정확도는 0.8020이며, 학습 시간은 23' 45''이다. 이전에 비해 학습 시간이 늘어나며, 에폭이 더 오랫동안 유지되며 성능이 향상되는 모습을 보인다.

 

 임베딩 품질 자체는 좋다고 판단했지만, 이를 모델에 주입했을 때는 이전에 비해 정확도가 낮아졌다는 점에 주목해야 한다. 당장은 Keras 임베딩 층을 활용하는 것이 모델 성능 자체에는 더 좋은 것인지, 혹은 임베딩 품질이 눈으로 확인할 때에 비해 생각보다 좋지 않은 것인지 의문이 든다. 다른 임베딩 방법을 적용하거나, 여러 parameter를 조정함으로써 성능을 향상시킬 수 있는지 연구할 필요가 있다.

반응형