본문 바로가기
Study/머신러닝

[2-2] Word2Vec을 활용해 문장을 벡터로 변환하기

by 투말치 2020. 7. 17.

목차

    반응형

    단어임베딩(Word Embedding)이란?

    - 단어 간의 관계를 반영하기 위해 단어를 벡터로 매핑하는 것을 말한다.

    - 대표적인 모델 : word2vec, GloVe, FastText

     

    Word2Vec 이란?

    - word2vec은 단어 임베딩 모델 중 하나이다. word2vec에서 가장 중요한 아이디어는 비슷한 분포를 가진 단어들은 비슷한 의미를 가진다는 것이다. 

    - word2vec에서 사용하는 2가지 알고리즘 : CBOW(Continuous bag of words), Skip-gram

    ① CBOW : 주변 단어(맥락)로 타겟 단어를 예측하는 방식

    - 크기가 작은 데이터셋에 적합하다.

    ② Skip-gram : CBOW와 정반대 방식으로 타겟 단어로 주변 단어(맥락)를 예측하는 방식

    - 크기가 큰 데이터셋에 적합하다.

     

     

    [실습1 - '토지'를 활용해 word2vec 사용법 간단히 알아보기]

    import codecs
    from bs4 import BeautifulSoup
    from konlpy.tag import Okt
    from gensim.models import word2vec
    
    fp = codecs.open("BEXX0003.txt", "r", encoding="utf-16")
    soup = BeautifulSoup(fp, "html.parser")
    text = soup.select_one('body').text  #body 태그 안의 텍스트 추출(텍스트가 태그 안에 존재하기 때문)
    
    okt=Okt()
    results=[]
    lines=text.split("\n")
    for line in lines:
        malist=okt.pos(line, norm=True, stem=True)
        r=[]
        for word in malist:
            if not word[1] in ["Josa", "Eomi", "Punctuation"]:
                r.append(word[0])
        rl=(" ".join(r)).strip()
        results.append(rl)
       #print(rl)
            
    gubun_file='toji.gubun'
    with open(gubun_file, 'w', encoding='utf-8') as fp:
        fp.write("\n".join(results))
    
    data=word2vec.LineSentence(gubun_file)
    model=word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
    model.save("toji.model")
    print("ok")

    1. word2vec에서 사용할 수 있게 토지 파일 전처리 작업을 한다.

    - 단어는 기본형만 사용

    - 형태소에서 조사·어미·구두점은 제외한다. 

    2. 'toji.gubun'이라는 파일에 처리결과를 저장한다.

    3. 모델 생성 : word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)

    - size=200 : 200차원의 벡터로 바꿔라

    - window=10 : 주변 단어는 앞뒤로 10개까지 봐라

    - hs=1 : 기본 값은 0, 값이 1이면 소프트맥수 함수를 사용한다는 뜻. 음수면 음수샘플링 사용.

    - min_count=2 : 빈도수가 2보다 작으면 해당 단어를 제거해라

    - sg=1 : 알고리즘을 지정. 0이 기본값으로 0이면 CBOW 사용, 1이면 skip-gram 사용.

     

    *소프트맥스(softmax) 함수란?

    - 출력값을 정규화해주는 함수

    - 소프트맥스 함수에 다양한 입력값을 넣으면 그 값들은 0과 1사이의 값으로 정규화된다. 그리고 모든 값들의 총합은 항상 1이된다.

     

     

    생성한 모델을 사용해 유사한 단어 확인하기

    from gensim.models import word2vec
    model=word2vec.Word2Vec.load("toji.model")
    print(model.most_similar(positive=["길"]))

     

    길과 유사한 단어를 찾아보면 아래와 같은 결과가 나온다.

     

     

     

    from gensim.models import word2vec
    model=word2vec.Word2Vec.load("toji.model")
    print(model.most_similar(positive=["땅"]))

     

    땅과 유사한 단어를 찾아보면 아래와 같은 결과가 나온다.

     

    - most_similar함수에서 positive 옵션은 가까운 단어를 찾고 negative 옵션을 주면 멀리있는 단어를 찾는다.

     

    from gensim.models import word2vec
    model=word2vec.Word2Vec.load("toji.model")
    print(model.most_similar(negative=["땅"]))

     

    땅과 멀리있는 단어를 찾으면 아래와 같은 결과가 나온다. (negative 옵션 사용)

     

     

     

     

     

     

     

    참고자료

     

    실습 : 파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문_ 쿠지라 히코우즈쿠에 저  

     

    https://dreamgonfly.github.io/machine/learning,/natural/language/processing/2017/08/16/word2vec_explained.html

     

    쉽게 씌어진 word2vec

    텍스트 기반의 모델 만들기는 텍스트를 숫자로 바꾸려는 노력의 연속이다. 텍스트를 숫자로 바꾸어야만 알고리즘에 넣고 계산을 한 후 결과값을 낼 수 있기 때문이다.

    dreamgonfly.github.io

    https://shuuki4.wordpress.com/2016/01/27/word2vec-%EA%B4%80%EB%A0%A8-%EC%9D%B4%EB%A1%A0-%EC%A0%95%EB%A6%AC/

     

    word2vec 관련 이론 정리

    예전에 포스팅한 Kaggle ‘What’s Cooking?’ 대회에서 word2vec 기술을 살짝 응용해서 사용해볼 기회가 있었다. 그 이후에도 word2vec이 쓰일만한 토픽들을 접하면서 이쪽에 대해 공부를 해보다가, 기존�

    shuuki4.wordpress.com

     

    반응형