[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

워드임베딩 - Word2Vec 기초활용

inu 2020. 7. 27. 21:22

희소표현과 밀집표현

  • 희소 표현 : 벡터 혹은 행렬의 값 대부분이 0으로 표현되는 방법이다. 단어의 개수가 늘어나면 차원이 한없이 커진다는 단점이 있다. 따라서 공간적 낭비가 있다. (ex. 원-핫 벡터)
  • 밀집 표현 : 벡터의 차원을 단어 집합의 크기로 상정하지 않는다. 사용자가 설정한 값으로 모든 단어의 벡터 표현의 차원을 맞춘다. 또한 이 과정에서 0과 1이 아닌 실수값을 가지게 된다.

워드 임베딩

  • 단어를 밀집 벡터의 형태로 표현하는 방법
  • LSA, Word2Vec, FastTest, Glove 등의 방법이 있다.

Word2Vec

  • 분산 표현 : 단어의 의미를 다차원 공간에 벡터화하는 것. 비슷한 위치의 단어는 비슷한 의미를 가진다는 가정하에 만들어진 표현 방법이다.
  • 원-핫 벡터와 같은 희소 표현이 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에 분산하여 표현하는 것이다. 이런 방식으로 단어 간의 유사도를 계산할 수 있다.

CBOW

  • Word2Vec에서 사용하는 워드임베딩 방법 중 하나이다.
  • Word2Vec 함수 인자 : (sentences : 문장들), (size : 임베딩 벡터의 크기), (window : 고려할 앞/뒤 단어의 갯수), (min_count : 최소 단어 길이), (workers : 사용할 프로세서의 수), (sg : 0=cbow, 1=skipgram)
  • 주변 단어를 이용해 중간 단어를 예측하는 방법이다. (Word2Vec의 또 다른 방법인 Skip-gram은 중간에 있는 단어로 주변 단어를 예측한다.)
  • 함수 인자로 앞뒤 단어 갯수(window), 임베딩 벡터 크기(size) 등을 조절하여 사용한다. min_count는 단어의 길이에 제한을 두어 짧은 단어는 아예 포함하지 않도록 한다. (일종의 stop word 처리)
  • 참고 : https://wikidocs.net/22660

사용 예제

from gensim.models import Word2Vec, KeyedVectors
import csv
import re

def open_csv():
    f = open('IMDB Dataset.csv', 'r', encoding='utf-8')
    csvreader = csv.reader(f)

    doc_list = []

    next(csvreader)
    for f in csvreader:
        line = re.compile("[^\w]").sub(' ', f[0].lower())
        doc_list.append(line.split())

    return doc_list
doc_list = open_csv()

model = Word2Vec(sentences=doc_list, size=100, window=3, min_count=3, workers=4, sg=0)
  • csv 파일로부터 데이터를 불러와 전처리하고, 그를 Word2Vec 함수에 넣어 모델을 만든다.
  • 주어진 데이터로 CBOW 방법을 이용해 워드 임베딩이 가능한 모델을 만든 것이다.
print(model.wv.similarity('actor', 'she'))
print(model.wv.most_similar("man"))
print(model.wv.most_similar(positive=['she', 'actor'], negative='actress', topn=1))
==결과==
0.21861485
[('woman', 0.7514907121658325), ('guy', 0.7141742706298828), ('person', 0.668543815612793), ('boy', 0.6644394397735596), ('lady', 0.6434295177459717), ('soldier', 0.63078373670578), ('murderer', 0.5839349031448364), ('scientist', 0.5666638612747192), ('kid', 0.5619326829910278), ('girl', 0.5542604923248291)]
[('he', 0.5019402503967285)]
  • wv.similarity 함수로 두 단어의 유사도를 판별할 수 있다.
  • wv.most_similar 함수를 통해 해당 단어와 유사하다고 판별된 단어를 뽑아낼 수 있다.
  • wv.most_similar 함수는 positive 인수와 negative 인수를 통해 she + actor - actress 와 같은 관계를 처리할 수도 있다. (topn은 출력갯수)