반응형
반응형

 

영어/한국어 Word2Vec 실습

wikidocs.net/50739

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

반응형
반응형

Word2Vec 모델 만들기  sdc-james.gitbook.io/onebook/5./6.1./6.1.3.-word2vec

 

6.1.3. Word2Vec 모델 만들기

 

sdc-james.gitbook.io

 

다음 예제는 네이버 영화 리뷰를 정리해둔 Naver sentiment movie corpus v1.0(https://github.com/e9t/nsmc) 사용하여 Word Embedding Model (Word2Vec)을 빌드하는 것입니다.

일단 다음 명령으로 genism 라이브러리를 설치합니다. NLTK는 자연어 처리를 위해 광범위하게 쓰이는 Python library입니다.

(onebook) > pip install lxml
(onebook) > pip install utils
(onebook) > pip install paramiko
(onebook) > pip install nltk
(onebook) > pip install genism

다음은 https://github.com/e9t/nsmc 에서 Corpus를 다운로드 합니다.

Naver sentiment movie corpus는 3개의 파일로 되어 있습니다.

  • ratings.txt: All 200K reviews

  • ratings_test.txt: 50K reviews held out for testing

  • ratings_train.txt: 150K reviews for training

각 파일에 있는 Column 은 <영화 아이디, 영화 평, 영화 평점> 입니다.

위의 세개의 파일을 raw형태로 다운로드 합니다.

 

Onebook 가상환경 하단에 NLP라는 폴더를 만들고 다운받은 파일을 이동합니다. "NaverMovieWord2Vec.py" 파이썬 파일을 새로 만들고 프로그래밍을 시작하겠습니다.

일단 저장된 파일을 csv를 사용해서 읽겠습니다. CSV란 Comma-separated values의 약자로서 CSV 파일은 각 라인의 컬럼들이 콤마로 분리된 텍스트 파일 포맷입니다. CSV 파일을 읽기 위해서는 먼저 파이썬에 기본 내장된 csv 모듈을 import 합니다. 다음 .csv 파일을 오픈하고 파일객체를 csv.reader(파일객체) 에 넣으면 됩니다. csv.reader() 함수는 Iterator 타입인 reader 객체를 리턴하므로 for 루프를 돌며 한 라인씩 가져올 수 있습니다. CSV 파일과 비슷하지만, 콤마 대신 Tab으로 컬럼을 분리하는 파일포맷을 TSV 파일이라 합니다. TSV 파일은 컬럼 delimiter만 차이가 나므로, csv 모듈의 reader() 혹은 writer() 함수에서 delimiter='\t' 옵션만 지정해 주면 나머지는 CSV와 동일합니다. Naver sentiment movie corpus는 탭으로 구분되어 있으므로 TSV를 읽는 방식으로 읽습니다.

import csv

 f = open('ratings_train.txt', 'r', encoding='utf-8')
 rdr = csv.reader(f, delimiter='\t')
 r = list(rdr)
 print("Id=%s : Name=%s" % (r[0][0], r[0][1]))
 print("Id=%s : Name=%s" % (r[1][0], r[1][1]))
 print("Id=%s : Name=%s" % (r[2][0], r[2][1]))

 f.close()
 
# 결과 
Id=id : Name=document
Id=9976970 : Name=아 더빙.. 진짜 짜증나네요 목소리
Id=3819312 : Name=흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나

이제 본격적으로 형태소 분석 코드를 넣어 보겠습니다. 여기서 'konlpy'의 여러 품사 태깅 클래스 중 'Twitter'를 사용했습니다. Konlpy의 Twitter은 Okt로 변경되었습니다.

실제 형태소를 분석한 결과는 다음과 같습니다.

[('재미', 'Noun'), ('잇다', 'Verb'), ('매우', 'Noun'), ('~~', 'Punctuation')]
[('진짜', 'Noun'), ('자다', 'Verb'), ('만들다', 'Verb'), ('수작', 'Noun')]
[('제발', 'Noun'), ('2', 'Number'), ('좀', 'Noun'), ('찍다', 'Verb'), ('.', 'Punctuation'), ('현기증', 'Noun'), ('나다', 'Verb'), ('말', 'Noun'), ('이에요', 'Josa')]
[('너무나도', 'Adverb'), ('따뜻하다', 'Adjective'), (',', 'Punctuation'), ('마음', 'Noun'), ('이', 'Josa'), ('따뜻하다', 'Adjective'), ('...', 'Punctuation'), ('한번', 'Noun'), ('쯤', 'Suffix'), ('자신', 'Noun'), ('을', 'Josa'), ('되돌아보다', 'Verb'), ('만들다', 'Verb'), ('영화', 'Noun')]

여기에서 “Josa”, “Eomi”, “'Punctuation”는 제외하고 처리해야 합니다. 전체 소스는 다음과 같습니다.

 import csv
 from konlpy.tag import Okt
 from gensim.models import word2vec

 #네이버 영화 코퍼스를 읽는다.
 f = open('ratings_train.txt', 'r', encoding='utf-8')
 rdr = csv.reader(f, delimiter='\t')
 rdw = list(rdr)
 f.close()

 #트위터 형태소 분석기를 로드한다. Twiter가 KoNLPy v0.4.5 부터 Okt로 변경 되었다.
 twitter = Okt()

 #텍스트를 한줄씩 처리합니다.
 result = []
 for line in rdw:
     #형태소 분석하기, 단어 기본형 사용
     malist = twitter.pos( line[1], norm=True, stem=True)
     r = []
     for word in malist:
         #Josa”, “Eomi”, “'Punctuation” 는 제외하고 처리
         if not word[1] in ["Josa","Eomi","Punctuation"]:
             r.append(word[0])
     #형태소 사이에 공백 " "  을 넣습니다. 그리고 양쪽 공백을 지웁니다.
     rl = (" ".join(r)).strip()
     result.append(rl)
     #print(rl)

 #형태소들을 별도의 파일로 저장 합니다.
 with open("NaverMovie.nlp",'w', encoding='utf-8') as fp:
     fp.write("\n".join(result))

 #Word2Vec 모델 만들기
 wData = word2vec.LineSentence("NaverMovie.nlp")
 wModel =word2vec.Word2Vec(wData, size=200, window=10, hs=1, min_count=2, sg=1)
 wModel.save("NaverMovie.model")
 print("Word2Vec Modeling finished")

위의 코드를 실행하면 종료 할 때까지 많은 시간이 걸립니다. 결과는 NaverMovie.model 파일입니다. 어미, 조사, 구두점을 제외하고 동사와 형용사는 기본형으로 학습하도록 입력 텍스트를 만들었습니다. 공백으로 구분된 텍스트 파일을 Word2Vec에 전달하고 생성된 모델을 save()로 저장했습니다.

 

이제 위에서 생성한 모델을 사용하여 단어 유사도를 확인해 보겠습니다.

 

다시 NaverMovieModelTest.py 라는 파일을 만들어 다음의 코드를 입력 해 봅니다.

from gensim.models import word2vec

model = word2vec.Word2Vec.load("NaverMovie.model")

print(model.most_similar(positive=["재미"]))

print(model.most_similar(positive=["최고"]))

위 코드의 수행 결과는 다음과 같습니다.

 

“재미”라는 단어와 유사한 단어들을 벡터로 나타낸 것입니다.

 

[('없슴', 0.6063779592514038), ('나용', 0.6040781736373901), ('지렁이', 0.5945030450820923), ('칙스', 0.5877454280853271), ('오랬', 0.5862023830413818), ('원도', 0.5712456703186035), ('잼', 0.5703416466712952), ('무것', 0.5685503482818604), ('푸시', 0.5684186816215515), ('유익', 0.5595628023147583)]

 

“최고”라는 단어와 유사한 단어들의 벡터는 다음과 같습니다.

 

[('꼽을', 0.6920815110206604), ('꼽는', 0.6835036873817444), ('최고다', 0.6749817132949829), ('단연', 0.6692216396331787), ('손꼽다', 0.6552967429161072), ('으뜸', 0.6476656198501587), ('하이스쿨', 0.6261676549911499), ('정치드라마', 0.6205614805221558), ('꼽겠다', 0.6203451156616211), ('였슴', 0.6191103458404541)]

 

 

 

models.word2vec – Word2vec 임베딩

radimrehurek.com/gensim/models/word2vec.html

 

Gensim: topic modelling for humans

Efficient topic modelling in Python

radimrehurek.com

 

programmers.co.kr/learn/courses/21/lessons/1698

 

실습으로 배우는 데이터 사이언스 - Gensim을 통해 벡터화 & t-SNE로 시각화

Gensim을 통해 벡터화 & t-SNE로 시각화 Word2Vec 모델을 학습 전처리를 거쳐 파싱된 문장의 목록으로 모델을 학습시킬 준비가 되었다. Gensim Word2Vec 모델의 파라메터 아키텍처 : 아키텍처 옵션은 skip-gra

programmers.co.kr

 

반응형
반응형

Gensim을 사용하여 Python에서 Word 임베딩을 개발하는 방법

 

단어 임베딩은 자연어 처리에서 텍스트를 표현하기위한 현대적인 접근 방식입니다.

word2vec 및 GloVe와 같은 단어 임베딩 알고리즘 은 기계 번역과 같은 자연어 처리 문제에 대한 신경망 모델을 통해 얻은 최첨단 결과의 핵심입니다.

이 튜토리얼에서는 Gensim을 사용하여 Python에서 자연어 처리 애플리케이션을위한 단어 임베딩 모델을 학습하고로드하는 방법을 알아 봅니다.

이 자습서를 완료하면 다음을 알게됩니다.

  • 텍스트 데이터에서 자신 만의 word2vec 단어 임베딩 모델을 훈련하는 방법.
  • 주성분 분석을 사용하여 훈련 된 단어 임베딩 모델을 시각화하는 방법.
  • 사전 훈련 된 word2vec 및 GloVe 단어 임베딩 모델을 Google 및 Stanford에서로드하는 방법.

단계별 자습서  모든 예제에 대한 Python 소스 코드 파일을 포함하여 저의 새 저서 Deep Learning for Natural Language Processing으로 프로젝트  시작하십시오 .

 

튜토리얼 개요

이 튜토리얼은 6 개 부분으로 나뉩니다.  

  1. 단어 임베딩
  2. Gensim 도서관
  3. Word2Vec 임베딩 개발
  4. 단어 임베딩 시각화
  5. Google의 Word2Vec 임베딩로드
  6. Stanford의 GloVe 임베딩로드

단어 임베딩

단어 임베딩은 단어의 의미에 대한 무언가를 포착하는 단어의 조밀 한 벡터 표현을 제공하는 접근 방식입니다.

단어 임베딩은 문서를 설명하지만 단어의 의미가 아닌 크고 희소 한 벡터 (대부분 0 값)를 생성하는 단어 개수 및 빈도와 같은 단순한 단어 모음 모델 단어 인코딩 체계보다 개선 된 것입니다.

단어 임베딩은 알고리즘을 사용하여 큰 텍스트 코퍼스를 기반으로 고정 길이 밀도 및 연속 값 벡터 세트를 훈련하는 방식으로 작동합니다. 각 단어는 임베딩 공간의 한 지점으로 표시되며 이러한 지점은 대상 단어를 둘러싼 단어를 기반으로 학습 및 이동됩니다.

단어 임베딩이 단어의 의미에 대해 학습 할 수 있도록 유지하는 단어를 회사에서 정의하는 것입니다. 단어의 벡터 공간 표현은 유사한 의미를 가진 단어가 공간 내에서 로컬로 클러스터되는 투영을 제공합니다.

다른 텍스트 표현보다 단어 임베딩을 사용하는 것은 기계 번역과 같은 문제에 대해 심층 신경망을 사용하여 획기적인 성능을 이끌어 낸 핵심 방법 중 하나입니다.

이 튜토리얼에서는 Google 연구원이 word2vec, Stanford 연구원이 GloVe라는 두 가지 단어 임베딩 방법을 사용하는 방법을 살펴 봅니다.

 

Gensim Python 라이브러리

Gensim 은 주제 모델링에 중점을 둔 자연어 처리를위한 오픈 소스 Python 라이브러리입니다.

 

Gensim은 체코 자연어 처리 연구원 인 Radim Řehůřek 과 그의 회사 인 RaRe Technologies 가 개발하고 유지 관리합니다 .

NLTK와 같은 부엌 싱크대 NLP 연구 라이브러리를 포함한 모든 것이 아닙니다. 대신 Gensim은 주제 모델링을위한 성숙하고 집중적이며 효율적인 NLP 도구 모음입니다. 특히이 튜토리얼에서는 텍스트에서 새로운 단어 벡터를 학습하기위한 Word2Vec 단어 임베딩 구현을 지원합니다.

또한 사전 학습 된 단어 임베딩을 몇 가지 형식으로로드하고로드 된 임베딩을 사용하고 쿼리하기위한 도구를 제공합니다.

이 튜토리얼에서는 Gensim 라이브러리를 사용합니다.

Python 환경 설정이없는 경우이 가이드를 사용할 수 있습니다.

Gensim은 pip 또는 easy_install을 사용하여 쉽게 설치할 수 있습니다 .

예를 들어, 명령 줄에 다음을 입력하여 pip로 Gensim을 설치할 수 있습니다.

pip install --upgrade gensim


시스템에 Gensim을 설치하는 데 도움이 필요하면 Gensim 설치 지침을 참조하십시오 .

 

 

 

Word2Vec 임베딩 개발

Word2vec 은 텍스트 말뭉치에서 단어 임베딩을 학습하는 하나의 알고리즘입니다.

텍스트에서 임베딩을 학습하는 데 사용할 수있는 두 가지 주요 학습 알고리즘이 있습니다. CBOW (Continuous Bag of Words)이며 그램을 건너 뜁니다.

우리는 일반적으로 각 대상 단어에 대한 단어 창을보고 문맥을 제공하고 단어에 대한 의미를 제공한다고 말하는 것 외에는 알고리즘을 사용하지 않을 것입니다. 이 접근 방식은 이전에 Google에서 현재 Facebook에서 근무 했던 Tomas Mikolov에 의해 개발되었습니다 .

Word2Vec 모델에는 전체 Wikipedia 말뭉치와 같은 많은 텍스트가 필요합니다. 그럼에도 불구하고 우리는 작은 메모리 내 텍스트 예제를 사용하여 원리를 보여줄 것입니다.

Gensim은  Word2Vec 모델 작업을위한 Word2Vec 클래스를 제공합니다 .

텍스트에서 단어 임베딩을 학습하려면 텍스트를 문장으로로드 및 구성하고 새 Word2Vec () 인스턴스 의 생성자에 제공하는 작업이 포함됩니다 . 예를 들면 :

sentences = ...
model = Word2Vec(sentences)

특히, 각 문장은 토큰 화되어야합니다. 의미는 단어로 나뉘어 준비되어야합니다 (예 : 사전 필터링되고 선호되는 경우로 변환 될 수 있음).

문장은 메모리에로드 된 텍스트이거나 매우 큰 텍스트 말뭉치에 필요한 텍스트를 점진적으로로드하는 반복 기일 수 있습니다.

이 생성자에는 많은 매개 변수가 있습니다. 구성 할 수있는 몇 가지 주목할만한 인수는 다음과 같습니다.

  • size : (기본값 100) 임베딩의 차원 수 (예 : 각 토큰 (단어)를 나타내는 조밀 한 벡터의 길이).
  • window : (기본값 5) 대상 단어와 대상 단어 주변 단어 사이의 최대 거리입니다.
  • min_count : (기본값 5) 모델 학습시 고려할 최소 단어 수입니다. 이 개수보다 적은 발생이있는 단어는 무시됩니다.
  • worker : (기본값 3) 훈련 중에 사용할 스레드 수입니다.
  • sg : (기본값 0 또는 CBOW) 훈련 알고리즘, CBOW (0) 또는 스킵 그램 (1).

기본값은 처음 시작할 때 충분합니다. 대부분의 최신 컴퓨터처럼 코어가 많은 경우 코어 수 (예 : 8)에 맞게 작업자를 늘리는 것이 좋습니다.

모델이 학습 된 후 " wv "속성을 통해 액세스 할 수 있습니다 . 이것은 질의를 할 수있는 실제 단어 벡터 모델입니다.

예를 들어, 다음과 같이 토큰 (단어)의 학습 된 어휘를 인쇄 할 수 있습니다.

words = list(model.wv.vocab)
print(words)

다음과 같이 특정 토큰에 대한 포함 된 벡터를 검토 할 수 있습니다.

print(model['word'])

마지막으로 단어 벡터 모델에서 save_word2vec_format () 함수를 호출하여 훈련 된 모델을 파일에 저장할 수 있습니다 .

기본적으로 모델은 공간을 절약하기 위해 이진 형식으로 저장됩니다. 예를 들면 :

model.wv.save_word2vec_format('model.bin')

시작할 때 학습 된 모델을 ASCII 형식으로 저장하고 내용을 검토 할 수 있습니다.

save_word2vec_format () 함수를 호출 할 때 binary = False 를 설정하여이를 수행 할 수 있습니다 . 예를 들면 다음과 같습니다.

model.wv.save_word2vec_format('model.txt', binary=False)

그런 다음 Word2Vec.load () 함수를 호출하여 저장된 모델을 다시로드 할 수 있습니다 . 예를 들면 :

model = Word2Vec.load('model.bin')

이 모든 것을 실제 예제와 함께 묶을 수 있습니다.

파일에서 큰 텍스트 문서 나 말뭉치를로드하는 대신 미리 토큰 화 된 문장의 작은 메모리 내 목록을 사용하여 작업합니다. 모델이 학습되고 단어의 최소 개수가 1로 설정되어 단어가 무시되지 않습니다.

모델을 학습 한 후 요약하고 어휘를 인쇄 한 다음 ' 문장 ' 이라는 단어에 대한 단일 벡터를 인쇄합니다 .

마지막으로 모델은 바이너리 형식의 파일에 저장되고로드 된 다음 요약됩니다.

from gensim.models import Word2Vec
# define training data
sentences = [['this', 'is', 'the', 'first', 'sentence', 'for', 'word2vec'],
			['this', 'is', 'the', 'second', 'sentence'],
			['yet', 'another', 'sentence'],
			['one', 'more', 'sentence'],
			['and', 'the', 'final', 'sentence']]
# train model
model = Word2Vec(sentences, min_count=1)
# summarize the loaded model
print(model)
# summarize vocabulary
words = list(model.wv.vocab)
print(words)
# access vector for one word
print(model['sentence'])
# save model
model.save('model.bin')
# load model
new_model = Word2Vec.load('model.bin')
print(new_model)

참고 : 알고리즘 또는 평가 절차의 확률 적 특성 또는 수치 정밀도의 차이에 따라 결과가 달라질 수 있습니다 . 예제를 몇 번 실행하고 평균 결과를 비교해보십시오.

예제를 실행하면 다음 출력이 인쇄됩니다.

Word2Vec(vocab=14, size=100, alpha=0.025)
['second', 'sentence', 'and', 'this', 'final', 'word2vec', 'for', 'another', 'one', 'first', 'more', 'the', 'yet', 'is']
[ -4.61881841e-03  -4.88735968e-03  -3.19508743e-03   4.08568839e-03
  -3.38211656e-03   1.93076557e-03   3.90265253e-03  -1.04349572e-03
   4.14286414e-03   1.55219622e-03   3.85653134e-03   2.22428422e-03
  -3.52565176e-03   2.82056746e-03  -2.11121864e-03  -1.38054823e-03
  -1.12888147e-03  -2.87318649e-03  -7.99703528e-04   3.67874932e-03
   2.68940022e-03   6.31021452e-04  -4.36326629e-03   2.38655557e-04
  -1.94210222e-03   4.87691024e-03  -4.04118607e-03  -3.17813386e-03
   4.94802603e-03   3.43150692e-03  -1.44031656e-03   4.25637932e-03
  -1.15106850e-04  -3.73274647e-03   2.50349124e-03   4.28692997e-03
  -3.57313151e-03  -7.24728088e-05  -3.46099050e-03  -3.39612062e-03
   3.54845310e-03   1.56780297e-03   4.58260969e-04   2.52689526e-04
   3.06256465e-03   2.37558200e-03   4.06933809e-03   2.94650183e-03
  -2.96231941e-03  -4.47433954e-03   2.89590308e-03  -2.16034567e-03
  -2.58548348e-03  -2.06163677e-04   1.72605237e-03  -2.27384618e-04
  -3.70194600e-03   2.11557443e-03   2.03793868e-03   3.09839356e-03
  -4.71800892e-03   2.32995977e-03  -6.70911541e-05   1.39375112e-03
  -3.84263694e-03  -1.03898917e-03   4.13251948e-03   1.06330717e-03
   1.38514000e-03  -1.18144893e-03  -2.60811858e-03   1.54952740e-03
   2.49916781e-03  -1.95435272e-03   8.86975031e-05   1.89820060e-03
  -3.41996481e-03  -4.08187555e-03   5.88635216e-04   4.13103355e-03
  -3.25899688e-03   1.02130906e-03  -3.61028523e-03   4.17646067e-03
   4.65870230e-03   3.64110398e-04   4.95479070e-03  -1.29743712e-03
  -5.03367570e-04  -2.52546836e-03   3.31060472e-03  -3.12870182e-03
  -1.14580349e-03  -4.34387522e-03  -4.62882593e-03   3.19007039e-03
   2.88707414e-03   1.62976081e-04  -6.05802808e-04  -1.06368808e-03]
Word2Vec(vocab=14, size=100, alpha=0.025)

텍스트 문서를 준비하는 약간의 작업으로 Gensim으로 매우 쉽게 자신의 단어 임베딩을 만들 수 있음을 알 수 있습니다.

 

단어 임베딩 시각화

텍스트 데이터에 대한 단어 임베딩을 배운 후 시각화를 통해 탐색하는 것이 좋습니다.

고전적인 프로젝션 방법을 사용하여 고차원 워드 벡터를 2 차원 플롯으로 줄이고 그래프에 플롯 할 수 있습니다.

시각화는 학습 된 모델에 대한 정 성적 진단을 제공 할 수 있습니다.

다음과 같이 훈련 된 모델에서 모든 벡터를 검색 할 수 있습니다.

X = model[model.wv.vocab]

그런 다음 scikit-learn에서 제공되는 방법과 같은 벡터에 대한 투영 방법을 훈련 한 다음 matplotlib를 사용하여 투영을 산점도로 플롯 할 수 있습니다.

Principal Component Analysis 또는 PCA 를 사용한 예제를 살펴 보겠습니다 .

 

 

PCA를 사용하여 단어 벡터 플로팅하기

다음과 같이 scikit-learn PCA 클래스  사용하여 단어 벡터의 2 차원 PCA 모델을 만들 수 있습니다 .

pca = PCA(n_components=2)
result = pca.fit_transform(X)

결과 투영은 다음과 같이 matplotlib를 사용하여 플로팅 할 수 있으며 두 차원을 x 및 y 좌표로 끌어낼 수 있습니다.

pyplot.scatter(result[:, 0], result[:, 1])

한 단계 더 나아가 그래프의 포인트에 단어 자체로 주석을 달 수 있습니다. 좋은 오프셋이없는 조잡한 버전은 다음과 같습니다.

words = list(model.wv.vocab)
for i, word in enumerate(words):
	pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))

이 모든 것을 이전 섹션의 모델과 함께 종합하면 전체 예제가 아래에 나열됩니다.

from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
# define training data
sentences = [['this', 'is', 'the', 'first', 'sentence', 'for', 'word2vec'],
			['this', 'is', 'the', 'second', 'sentence'],
			['yet', 'another', 'sentence'],
			['one', 'more', 'sentence'],
			['and', 'the', 'final', 'sentence']]
# train model
model = Word2Vec(sentences, min_count=1)
# fit a 2d PCA model to the vectors
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# create a scatter plot of the projection
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model.wv.vocab)
for i, word in enumerate(words):
	pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

예제를 실행하면 단어로 주석이 추가 된 점이있는 산점도가 생성됩니다.

참고 : 알고리즘 또는 평가 절차의 확률 적 특성 또는 수치 정밀도의 차이에 따라 결과가 달라질 수 있습니다 . 예제를 몇 번 실행하고 평균 결과를 비교해보십시오.

이러한 작은 말뭉치가 모델에 적합하게 사용 되었기 때문에 그래프에서 많은 의미를 끌어 내기는 어렵습니다.

Word2Vec 모델의 PCA 투영 산점도

 

Google의 Word2Vec 임베딩로드

자신의 단어 벡터를 훈련하는 것이 주어진 NLP 문제에 대한 최선의 접근 방식 일 수 있습니다.

그러나 시간이 오래 걸리고 RAM과 디스크 공간이 많은 빠른 컴퓨터, 입력 데이터 및 학습 알고리즘을 미세 조정하는 데 일부 전문 지식이 필요할 수 있습니다.

대안은 단순히 기존의 사전 훈련 된 단어 임베딩을 사용하는 것입니다.

word2vec에 대한 문서 및 코드와 함께 Google은 Word2Vec Google 코드 프로젝트 에 사전 학습 된 word2vec 모델도 게시했습니다 .

사전 훈련 된 모델은 토큰 및 관련 단어 벡터를 포함하는 파일에 지나지 않습니다. 사전 학습 된 Google word2vec 모델은 Google 뉴스 데이터 (약 1,000 억 단어)에서 학습되었습니다. 300 만 개의 단어와 구가 포함되어 있으며 300 차원 단어 벡터를 사용하여 적합했습니다.

1.53 기가 바이트 파일입니다. 여기에서 다운로드 할 수 있습니다.

압축을 푼 바이너리 파일 (GoogleNews-vectors-negative300.bin)은 3.4GB입니다.

Gensim 라이브러리는이 파일을로드하는 도구를 제공합니다. 특히 다음과 같이 KeyedVectors.load_word2vec_format () 함수를 호출 하여이 모델을 메모리로로드 할 수 있습니다 .

from gensim.models import KeyedVectors
filename = 'GoogleNews-vectors-negative300.bin'
model = KeyedVectors.load_word2vec_format(filename, binary=True)

내 최신 워크 스테이션에서는로드하는 데 약 43 초가 걸립니다.

여러분이 할 수있는 또 다른 흥미로운 일은 단어로 선형 대수 연산을하는 것입니다.

예를 들어, 강의 및 소개 문서에 설명 된 인기있는 예는 다음과 같습니다.

queen = (king - man) + woman

그것은 여왕이라는 단어가 왕에서 남자라는 개념을 빼고 여자라는 단어를 더한 가장 가까운 단어입니다. 왕의“남자 다움”은 우리에게 여왕을주기 위해“여자 다움”으로 대체됩니다. 매우 멋진 개념입니다.

Gensim은 훈련되거나로드 된 모델  most_similar () 함수 에서 이러한 유형의 작업을 수행하기위한 인터페이스를 제공합니다 .

예를 들면 :

result = model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
print(result)

이 모든 것을 다음과 같이 통합 할 수 있습니다.

from gensim.models import KeyedVectors
# load the google word2vec model
filename = 'GoogleNews-vectors-negative300.bin'
model = KeyedVectors.load_word2vec_format(filename, binary=True)
# calculate: (king - man) + woman = ?
result = model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
print(result)

예제를 실행하면 Google 사전 훈련 된 word2vec 모델이로드 된 다음 (king – man) + woman =? 그 단어에 대한 단어 벡터에 대한 연산.

우리가 예상했듯이 대답은 여왕입니다.

[('queen', 0.7118192315101624)]

더 흥미로운 산술 예제를 살펴 보려면 추가 읽기 섹션의 게시물 중 일부를 참조하십시오.

 

 

 

Stanford의 GloVe 임베딩로드

스탠포드 연구원들은 또한 단어 표현을위한 글로벌 벡터 ( Global Vectors for Word Representation ) 또는 줄여서 글 로베 ( GloVe)라고하는 word2vec와 같은 자체 단어 임베딩 알고리즘을 가지고 있습니다 .

여기서는 word2vec과 GloVe의 차이점에 대해 자세히 설명하지 않겠지 만 일반적으로 NLP 실무자들은 결과를 기반으로 현재 GloVe를 선호하는 것 같습니다.

word2vec과 마찬가지로 GloVe 연구원은 사전 훈련 된 단어 벡터를 제공합니다.이 경우에는 선택할 수있는 훌륭한 선택이 있습니다.

GloVe 사전 훈련 된 단어 벡터를 다운로드하고 gensim을 사용하여 쉽게로드 할 수 있습니다.

첫 번째 단계는 GloVe 파일 형식을 word2vec 파일 형식으로 변환하는 것입니다. 유일한 차이점은 작은 헤더 행을 추가한다는 것입니다. glove2word2vec () 함수를 호출하면 됩니다. 예를 들면 :

from gensim.scripts.glove2word2vec import glove2word2vec
glove_input_file = 'glove.txt'
word2vec_output_file = 'word2vec.txt'
glove2word2vec(glove_input_file, word2vec_output_file)

일단 변환되면 위의 word2vec 파일처럼 파일을로드 할 수 있습니다.

예를 들어 구체적으로 만들어 보겠습니다.

GloVe 웹 사이트 에서 가장 작은 GloVe 사전 훈련 된 모델을 다운로드 할 수 있습니다 . 60 억 개의 토큰과 400,000 개의 단어 어휘로 Wikipedia 데이터에 대해 학습 된 4 가지 모델 (50, 100, 200 및 300 차원 벡터)이 포함 된 822MB zip 파일입니다.

직접 다운로드 링크는 다음과 같습니다.

모델의 100 차원 버전을 사용하여 다음과 같이 파일을 word2vec 형식으로 변환 할 수 있습니다.

from gensim.scripts.glove2word2vec import glove2word2vec
glove_input_file = 'glove.6B.100d.txt'
word2vec_output_file = 'glove.6B.100d.txt.word2vec'
glove2word2vec(glove_input_file, word2vec_output_file)

이제 gloVe 모델의 파일 ​​이름이 glove.6B.100d.txt.word2vec 인 word2vec 형식의 복사본이 있습니다.

이제 우리는 그것을로드하고 동일한 (king – man) + woman =? 이전 섹션에서와 같이 테스트하십시오. 전체 코드 목록은 아래에 제공됩니다. 변환 된 파일은 바이너리가 아닌 ASCII 형식이므로 로드 할 때 binary = False로 설정 합니다.

from gensim.models import KeyedVectors
# load the Stanford GloVe model
filename = 'glove.6B.100d.txt.word2vec'
model = KeyedVectors.load_word2vec_format(filename, binary=False)
# calculate: (king - man) + woman = ?
result = model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
print(result)

예제를 실행하면 'queen'과 동일한 결과가 인쇄됩니다.

[('queen', 0.7698540687561035)]

추가 읽기

이 섹션에서는 더 자세히 살펴보고자하는 경우 주제에 대한 더 많은 리소스를 제공합니다.

Gensim

게시물

요약

이 튜토리얼에서는 Gensim을 사용하여 Python에서 단어 임베딩 레이어를 개발하고로드하는 방법을 발견했습니다.

구체적으로 다음을 배웠습니다.

  • 텍스트 데이터에서 자신 만의 word2vec 단어 임베딩 모델을 훈련하는 방법.
  • 주성분 분석을 사용하여 훈련 된 단어 임베딩 모델을 시각화하는 방법.
  • 사전 훈련 된 word2vec 및 GloVe 단어 임베딩 모델을 Google 및 Stanford에서로드하는 방법.

 

 

 

 

 

 

※machinelearningmastery.com/develop-word-embeddings-python-gensim/

 

How to Develop Word Embeddings in Python with Gensim

Word embeddings are a modern approach for representing text in natural language processing. Word embedding algorithms like word2vec and GloVe are key to the state-of-the-art results achieved by neural network models on natural language processing problems

machinelearningmastery.com

 

반응형
반응형


단어 임베딩(Word Embedding)이란 텍스트를 구성하는 하나의 단어를 수치화하는 방법의 일종이다.

텍스트 분석에서 흔히 사용하는 방식은 단어 하나에 인덱스 정수를 할당하는 Bag of Words 방법이다. 이 방법을 사용하면 문서는 단어장에 있는 단어의 갯수와 같은 크기의 벡터가 되고 단어장의 각 단어가 그 문서에 나온 횟수만큼 벡터의 인덱스 위치의 숫자를 증가시킨다.

즉 단어장이 "I", "am", "a", "boy", "girl" 다섯개의 단어로 이루어진 경우 각 단어에 다음과 같이 숫자를 할당한다.

"I": 0
"am": 1
"a": 2
"boy": 3 
"girl": 4

이 때 "I am a girl" 이라는 문서는 다음과 같이 벡터로 만들 수 있다.

[11101]

단어 임베딩은 하나의 단어를 하나의 인덱스 정수가 아니라 실수 벡터로 나타낸다. 예를 들어 2차원 임베딩을 하는 경우 다음과 같은 숫자 벡터가 될 수 있다.

"I": (0.3, 0.2)
"am": (0.1, 0.8)
"a": (0.5, 0.6)
"boy": (0.2, 0.9) 
"girl": (0.4, 0.7)

단어 임베딩이 된 경우에는 각 단어 벡터를 합치거나(concatenation) 더하는(averaging, normalized Bag of Words) 방식으로 전체 문서의 벡터 표현을 구한다.

Feed-Forward 신경망 언어 모형 (Neural Net Language Model)

이러한 단어 임베딩은 신경망을 이용하여 언어 모형을 만들려는 시도에서 나왔다. 자세한 내용은 다음 논문을 참고한다.

V개의 단어를 가지는 단어장이 있을 때, 단어를 BOW 방식으로 크기 V인 벡터로 만든 다음 다음 그림과 같이 하나의 은닉층(Hidden Layer)을 가지는 신경망을 사용하여 특정 단어 열(word sequence)이 주어졌을 때 다음에 나올 단어를 예측하는 문제를 생각해 보자. 입력과 출력은 모두 BOW 방식으로 인코딩되어 있다.

이미지 출처: "word2vec Parameter Learning Explained", Xin Rong

입력 x가 들어가면 입력 가중치 행렬 WT이 곱해져서 은닉층 벡터 h가 되는데 x가 one-hot-encoding 된 값이므로 h 벡터는 입력 가중치 행렬 W의 행 하나가 된다.

h=WTx=viT

여기에서 i는 입력 벡터 x 의 값이 1인 원소의 인덱스이다. 즉, BOW 단어장에서 i번째 단어를 뜻한다.

벡터 h는 다시 출력 가중치 행렬 WT와 곱해져서 출력 벡터 y가 된다.

y=WTh

출력 가중치 행렬 W의 j번째 열을 vj라고 하면 출력 벡터 y의 j번째 원소의 값은 다음과 같다.

yj=vjTh

가중치 행렬을 갱신하는 최적화 공식을 살펴본다. 자세한 유도과정은 논문을 참조한다.

우선 출력 가중치 행렬의 갱신 공식은 다음과 같다.

vj(new)=vj(old)ηejh=vj(old)ηejviT

이 식에서 η는 최적화 스텝 사이즈, ej는 출력 오차가 된다. 이 공식에 따르면 벡터 vj는 vj 방향으로 수렴해 간다. 즉, i번째 단어와 j번째 단어가 연속하는 관계라면 vj가 vi와 유사한 위치로 수렴한다는 뜻이다.

다음으로 입력 가중치 행렬의 갱신 공식은 다음과 같다.

vi(new)=vi(old)ηkejwik

이 공식에 따르면 벡터 vi는 여러 vk 벡터의 가중합으로 수렴해 간다. 이렇게 단어간의 관계에 의해 i번째 단어를 뜻하는 vi의 값들이 연관성을 가지게 되는데 이 vi 벡터 값을 해당 단어에 대한 분산 표현 (distributed representation) , 벡터 표현 (vector representation) 또는 단어 임베딩 (word embedding)이라고 한다.

이미지 출처: https://www.tensorflow.org/versions/master/tutorials/word2vec/index.html

CBOW (Continuous Bag of Words) Embedding

위의 방식은 하나의 단어로부터 다음에 오는 단어를 예측하는 문제였다. 이러한 문제를 단어 하나짜리 문맥(single-word context)를 가진다고 한다.

CBOW (Continuous Bag of Words) 방식은 복수 단어 문맥(multi-word context)에 대한 문제 즉, 여러개의 단어를 나열한 뒤 이와 관련된 단어를 추정하는 문제이다. 즉, 문자에서 나오는 n개의 단어 열로부터 다음 단어를 예측하는 문제가 된다. 예를 들어

the quick brown fox jumped over the lazy dog

라는 문장에서 (thequickbrown) 이라는 문맥이 주어지면 fox라는 단어를 예측해야 한다.

CBOW는 다음과 같은 신경망 구조를 가진다. 여기에서 각 문맥 단어를 은닉층으로 투사하는 가중치 행렬은 모든 단어에 대해 공통으로 사용한다.

이미지 출처: "word2vec Parameter Learning Explained", Xin Rong

Skip-Gram Embedding

Skip-Gram 방식은 CBOW 방식과 반대로 특정한 단어로부터 문맥이 될 수 있는 단어를 예측한다. 보통 입력 단어 주변의 k개 단어를 문맥으로 보고 예측 모형을 만드는데 이 k 값을 window size 라고 한다.

위 문장에서 window size k=1인 경우,

  • quick -> the
  • quick -> brown
  • brown -> quick
  • brown -> fox

과 같은 관계를 예측할 수 있어야 한다.

이미지 출처: "word2vec Parameter Learning Explained", Xin Rong

word2vec

word2vec은 CBOW 방식과 Skip-Gram 방식의 단어 임베딩을 구현한 C++ 라이브러리로 구글에 있던 Mikolov 등이 개발하였다.

파이썬에서는 gensim이라는 패키지에 Word2Vec이라는 클래스로 구현되어 있다. nltk의 영화 감상 corpus를 기반으로 Word2Vec 사용법을 살펴보자.

우선 단어 임베딩을 위한 코퍼스를 만든다. 코퍼스는 리스트의 리스트 형태로 구현되어야 한다. 내부 리스트는 하나의 문장을 이루는 단어 열이 된다.

from nltk.corpus import movie_reviews
sentences = [list(s) for s in movie_reviews.sents()]
sentences[0]
[u'plot',
 u':',
 u'two',
 u'teen',
 u'couples',
 u'go',
 u'to',
 u'a',
 u'church',
 u'party',
 u',',
 u'drink',
 u'and',
 u'then',
 u'drive',
 u'.']

다음으로 이 코퍼스를 입력 인수로 하여 Word2Vec 클래스 객체를 생성한다. 이 시점에 트레이닝이 이루어진다.

from gensim.models.word2vec import Word2Vec
%%time
model = Word2Vec(sentences)
CPU times: user 12.2 s, sys: 400 ms, total: 12.6 s
Wall time: 7.33 s

트레이닝이 완료되면 init_sims 명령으로 필요없는 메모리를 unload 시킨다.

model.init_sims(replace=True)

이제 이 모형에서 다음과 같은 메서드를 사용할 수 있다. 보다 자세한 내용은 https://radimrehurek.com/gensim/models/word2vec.html 를 참조한다.

  • similarity : 두 단어의 유사도 계산
  • most_similar : 가장 유사한 단어를 출력
model.similarity('actor', 'actress')
0.87472425755991945
model.similarity('he', 'she')
0.85470770334392587
model.similarity('actor', 'she')
0.21756392610362227
model.most_similar("villain")
[(u'hero', 0.7978197932243347),
 (u'doctor', 0.7952470779418945),
 (u'actress', 0.7806568145751953),
 (u'performer', 0.775442361831665),
 (u'charming', 0.7602461576461792),
 (u'impression', 0.7583950757980347),
 (u'commoner', 0.7538788318634033),
 (u'janitor', 0.7536816000938416),
 (u'dude', 0.7528475522994995),
 (u'genius', 0.7506694793701172)]

most_similar 메서드는 positive 인수와 negative 인수를 사용하여 다음과 같은 단어간 관계도 찾을 수 있다.

he + (actress - actor) = she

model.most_similar(positive=['actor', 'he'], negative='actress', topn=1)
[(u'she', 0.2471558153629303)]

이번에는 네이버 영화 감상 코퍼스를 사용하여 한국어 단어 임베딩을 해보자.

import codecs

def read_data(filename):
    with codecs.open(filename, encoding='utf-8', mode='r') as f:
        data = [line.split('\t') for line in f.read().splitlines()]
        data = data[1:]   # header 제외
    return data

train_data = read_data('/home/dockeruser/data/nsmc/ratings_train.txt')
from konlpy.tag import Twitter
tagger = Twitter()

def tokenize(doc):
    return ['/'.join(t) for t in tagger.pos(doc, norm=True, stem=True)]

train_docs = [row[1] for row in train_data]
sentences = [tokenize(d) for d in train_docs]
from gensim.models import word2vec
model = word2vec.Word2Vec(sentences)
model.init_sims(replace=True)
model.similarity(*tokenize(u'악당 영웅'))
0.6062297706048696
model.similarity(*tokenize(u'악당 감동'))
-0.0041346659756955097
from konlpy.utils import pprint
pprint(model.most_similar(positive=tokenize(u'배우 남자'), negative=tokenize(u'여배우'), topn=1))
[(여자/Noun, 0.6258430480957031)]

더 많은 한국어 코퍼스를 사용한 단어 임베딩 모형은 다음 웹사이트에서 테스트해 볼 수 있다.


반응형
반응형
gensim.models.Word2Vec.train 


 Update the model’s neural weights from a sequence of sentences (can be a once-only generator stream). For Word2Vec, each sentence must be a list of unicode strings. (Subclasses may accept other examples.)
문장의 시퀀스에서 모델의 신경 가중치를 업데이트하십시오 (한 번만 생성기 스트림 일 수 있음). Word2Vec의 경우 각 문장은 유니 코드 문자열 목록이어야합니다. 서브 클래스는 다른 예를 받아들이는 일이 있습니다.

 To support linear learning-rate decay from (initial) alpha to min_alpha, either total_examples (count of sentences) or total_words (count of raw words in sentences) should be provided, unless the sentences are the same as those that were used to initially build the vocabulary.
(초기) alpha에서 min_alpha까지의 선형 학습 률 감소를 지원하려면, 문장이 처음 빌드에 사용 된 것과 같지 않으면 total_examples (문장의 수) 또는 total_words (문장의 원시 단어의 수)가 제공되어야합니다 어휘.






import gensim

sentences = [["my", "name", "is", "jamie"], ["jamie", "is", "cute"]]
model = gensim.models.Word2Vec(sentences)


#----------------------------------------------------------------------

sentences_vocab = SentenceReader('corpus.txt')
sentences_train = SentenceReader('corpus.txt')

model = gensim.models.Word2Vec()
model.build_vocab(sentences_vocab)
model.train(sentences_train)

#----------------------------------------------------------------------

class SentenceReader:

    def __init__(self, filepath):
        self.filepath = filepath

    def __iter__(self):
        for line in codecs.open(self.filepath, encoding='utf-8'):
            yield line.split(' ')


#----------------------------------------------------------------------

model.save('model')
model = gensim.models.Word2Vec.load('model')


model.most_similar(positive=["한국/Noun", "도쿄/Noun"], negative=["서울/Noun"], topn=1)
# [("일본/Noun", 0.6401702165603638)]


#----------------------------------------------------------------------

import multiprocessing

config = {
    'min_count': 5,  # 등장 횟수가 5 이하인 단어는 무시
    'size': 300,  # 300차원짜리 벡터스페이스에 embedding
    'sg': 1,  # 0이면 CBOW, 1이면 skip-gram을 사용한다
    'batch_words': 10000,  # 사전을 구축할때 한번에 읽을 단어 수
    'iter': 10,  # 보통 딥러닝에서 말하는 epoch과 비슷한, 반복 횟수
    'workers': multiprocessing.cpu_count(),
}
model = gensim.models.Word2Vec(**config)


#----------------------------------------------------------------------

...


반응형
반응형

gensim + word2vec 모델 만들어서 사용하기 



참고 : https://www.lucypark.kr/courses/2015-ba/text-mining.html



#Load data

from konlpy.corpus import kobill

docs_ko = [kobill.open(i).read() for i in kobill.fileids()]


#Tokenize

from konlpy.tag import Twitter; t = Twitter()

pos = lambda d: ['/'.join(p) for p in t.pos(d)]

texts_ko = [pos(doc) for doc in docs_ko]


#Train

from gensim.models import word2vec

wv_model_ko = word2vec.Word2Vec(texts_ko)

wv_model_ko.init_sims(replace=True)

wv_model_ko.save('ko_word2vec.model')    #model create


#Test - 유사도 분석

wv_model_ko.most_similar(pos('정부'))

wv_model_ko.most_similar(pos('초등학교'))





  * 저장된 model 사용하기 : https://radimrehurek.com/gensim/models/word2vec.html


Initialize a model with e.g.:

>>> model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)

Persist a model to disk with:

>>> model.save(fname)
>>> model = Word2Vec.load(fname)  # you can continue training with the loaded model!

The word vectors are stored in a KeyedVectors instance in model.wv. This separates the read-only word vector lookup operations in KeyedVectors from the training code in Word2Vec.

>>> model.wv['computer']  # numpy vector of a word
array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)


model 이 잘 불러와졌는지 확인하려면 model의 내용을 보자. 

model.vocab 하며 내용을 볼 수 있다. 

most_similar 에서 vocaburary에 단어가 없다고 에러나오면 내용을 확인 후 다시 검색해보면 된다. 

저장된 vocab이 '국어' 인지, '국어/Noun' 인지 확인 바람요! 


>>>len(model.vocab)

9867

>>>model.vocab 



Code for the word2vec HTTP server running at https://rare-technologies.com/word2vec-tutorial/#bonus_app



*** 대화 형 word2vec 데모 용 전체 HTTP 서버 코드 : 

     https://github.com/RaRe-Technologies/w2v_server_googlenews



모델 저장 및로드

표준 gensim 메소드를 사용하여 모델을 저장 /로드 할 수 있습니다.

1
2
model.save('/tmp/mymodel')
new_model = gensim.models.Word2Vec.load('/tmp/mymodel')

내부적으로 피클을 사용하는 선택적 mmap를 프로세스 간 메모리 공유 디스크 파일에서 직접 가상 메모리에 모델의 내부 큰 NumPy와 행렬을 보내고 '.

또한 텍스트 및 이진 형식을 사용하여 원본 C 도구로 만든 모델을로드 할 수 있습니다.

1
2
model = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False)
# using gzipped/bz2 input works too, no need to unzip:
model = Word2Vec.load_word2vec_format('/tmp/vectors.bin.gz', binary=True)

온라인 교육 / 훈련 재개

고급 사용자는 모델을로드하고 더 많은 문장으로 계속 교육 할 수 있습니다.

1
2
model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)

시뮬레이트 할 학습 속도 감소에 따라 total_words 매개 변수를 train ()에 맞게 조정해야 할 수도 있습니다 .

C 도구 load_word2vec_format ()에 의해 생성 된 모델로는 교육을 재개 할 수 없습니다 당신은 여전히 ​​그것들을 질의 / 유사성을 위해 사용할 수 있지만, 훈련에 필수적인 정보 (보캐 트리)가 거기에 없습니다.

모델 사용

Word2vec는 여러 단어 유사 작업을 즉시 지원합니다.

1
2
4
5
6
model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
[('queen', 0.50882536)]
model.doesnt_match("breakfast cereal dinner lunch";.split())
'cereal'
model.similarity('woman', 'man')
0.73723527

응용 프로그램에서 원시 출력 벡터가 필요한 경우에는 단어 단위로 이들에 액세스 할 수 있습니다

1
2
model['computer'# raw NumPy vector of a word
array([-0.00449447, -0.003100970.02421786, ...], dtype=float32)

... 또는 en-masse를 model.syn0 의 2D NumPy 행렬로 사용 하십시오 .



...

반응형

+ Recent posts