Gensim-워드 임베딩 개발

이 장은 Gensim에서 단어 임베딩 개발을 이해하는 데 도움이 될 것입니다.

단어 및 문서를 표현하는 접근 방식 인 단어 임베딩은 동일한 의미를 가진 단어가 비슷한 표현을 갖는 텍스트에 대한 조밀 한 벡터 표현입니다. 다음은 단어 임베딩의 몇 가지 특성입니다.

  • 사전 정의 된 벡터 공간에서 개별 단어를 실수 벡터로 표현하는 기술 클래스입니다.

  • 이 기술은 모든 단어가 하나의 벡터에 매핑되고 벡터 값이 NN (신경망)과 동일한 방식으로 학습되기 때문에 DL (딥 러닝) 분야에 집중되는 경우가 많습니다.

  • 단어 임베딩 기술의 주요 접근 방식은 모든 단어에 대한 조밀 한 분산 표현입니다.

다른 단어 포함 방법 / 알고리즘

위에서 설명한 것처럼 단어 임베딩 방법 / 알고리즘은 텍스트 코퍼스에서 실수 값 벡터 표현을 학습합니다. 이 학습 프로세스는 문서 분류와 같은 작업에서 NN 모델과 함께 사용할 수 있거나 문서 통계와 같은 비지도 프로세스입니다. 여기서 우리는 텍스트에서 단어 임베딩을 배우는 데 사용할 수있는 두 가지 방법 / 알고리즘에 대해 논의 할 것입니다.

Google의 Word2Vec

Tomas Mikolov 등이 개발 한 Word2Vec. al. 2013 년 Google에서는 텍스트 말뭉치에서 임베딩 된 단어를 효율적으로 학습하기위한 통계적 방법입니다. 실제로 NN 기반의 단어 임베딩 학습을보다 효율적으로 만들기위한 응답으로 개발되었습니다. 그것은 단어 임베딩의 사실상의 표준이되었습니다.

Word2Vec에 의한 단어 임베딩에는 학습 된 벡터 분석과 단어 표현에 대한 벡터 수학 탐구가 포함됩니다. 다음은 Word2Vec 방법의 일부로 사용할 수있는 두 가지 학습 방법입니다.

  • CBoW (Continuous Bag of Words) 모델
  • 연속 스킵 그램 모델

GloVe by Standford

GloVe (단어 표현을위한 글로벌 벡터)는 Word2Vec 메서드의 확장입니다. Pennington et al.에 의해 개발되었습니다. 스탠포드에서. GloVe 알고리즘은 두 가지가 혼합되어 있습니다.

  • LSA (Latent Semantic Analysis)와 같은 매트릭스 분해 기술의 글로벌 통계
  • Word2Vec의 로컬 컨텍스트 기반 학습.

창을 사용하여 로컬 컨텍스트를 정의하는 대신 작동에 대해 이야기하면 GloVe는 전체 텍스트 코퍼스에 대한 통계를 사용하여 명시적인 단어 동시 발생 행렬을 구성합니다.

Word2Vec 임베딩 개발

여기에서는 Gensim을 사용하여 Word2Vec 임베딩을 개발합니다. Word2Vec 모델로 작업하기 위해 Gensim은Word2Vec 가져올 수있는 클래스 models.word2vec. 구현을 위해 word2vec에는 전체 Amazon 리뷰 코퍼스와 같은 많은 텍스트가 필요합니다. 그러나 여기서 우리는 작은 메모리 텍스트에이 원칙을 적용 할 것입니다.

구현 예

먼저 다음과 같이 gensim.models에서 Word2Vec 클래스를 가져와야합니다.

from gensim.models import Word2Vec

다음으로 훈련 데이터를 정의해야합니다. 큰 텍스트 파일을 사용하는 대신이 원칙을 구현하기 위해 몇 가지 문장을 사용하고 있습니다.

sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]

훈련 데이터가 제공되면 모델을 훈련해야합니다. 다음과 같이 할 수 있습니다-

model = Word2Vec(sentences, min_count=1)

모델을 다음과 같이 요약 할 수 있습니다.

print(model)

어휘를 다음과 같이 요약 할 수 있습니다.

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

다음으로 한 단어에 대한 벡터에 액세스 해 보겠습니다. 우리는 '튜토리얼'이라는 단어를 위해 그것을하고 있습니다.

print(model['tutorial'])

다음으로 모델을 저장해야합니다.

model.save('model.bin')

다음으로 모델을로드해야합니다.

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

마지막으로 저장된 모델을 다음과 같이 인쇄합니다.

print(new_model)

완전한 구현 예

from gensim.models import Word2Vec
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
print(model)
words = list(model.wv.vocab)
print(words)
print(model['tutorial'])
model.save('model.bin')
new_model = Word2Vec.load('model.bin')
print(new_model)

산출

Word2Vec(vocab=20, size=100, alpha=0.025)
[
   'this', 'is', 'gensim', 'tutorial', 'for', 'free', 'the', 'tutorialspoint', 
   'website', 'you', 'can', 'read', 'technical', 'tutorials', 'we', 'are', 
   'implementing', 'word2vec', 'learn', 'full'
]
[
   -2.5256255e-03 -4.5352755e-03 3.9024993e-03 -4.9509313e-03
   -1.4255195e-03 -4.0217536e-03 4.9407515e-03 -3.5925603e-03
   -1.1933431e-03 -4.6682903e-03 1.5440651e-03 -1.4101702e-03
   3.5070938e-03 1.0914479e-03 2.3334436e-03 2.4452661e-03
   -2.5336299e-04 -3.9676363e-03 -8.5054158e-04 1.6443320e-03
   -4.9968651e-03 1.0974540e-03 -1.1123562e-03 1.5393364e-03
   9.8941079e-04 -1.2656028e-03 -4.4471184e-03 1.8309267e-03
   4.9302122e-03 -1.0032534e-03 4.6892050e-03 2.9563988e-03
   1.8730218e-03 1.5343715e-03 -1.2685956e-03 8.3664013e-04
   4.1721235e-03 1.9445885e-03 2.4097660e-03 3.7517555e-03
   4.9687522e-03 -1.3598346e-03 7.1032363e-04 -3.6595813e-03
   6.0000515e-04 3.0872561e-03 -3.2115565e-03 3.2270295e-03
   -2.6354722e-03 -3.4988276e-04 1.8574356e-04 -3.5757164e-03
   7.5391348e-04 -3.5205986e-03 -1.9795434e-03 -2.8321696e-03
   4.7155009e-03 -4.3349937e-04 -1.5320212e-03 2.7013756e-03
   -3.7055744e-03 -4.1658725e-03 4.8034848e-03 4.8594419e-03
   3.7129463e-03 4.2385766e-03 2.4612297e-03 5.4920948e-04
   -3.8912550e-03 -4.8226118e-03 -2.2763973e-04 4.5571579e-03
   -3.4609400e-03 2.7903817e-03 -3.2709218e-03 -1.1036445e-03
   2.1492650e-03 -3.0384419e-04 1.7709908e-03 1.8429896e-03
   -3.4038599e-03 -2.4872608e-03 2.7693063e-03 -1.6352943e-03
   1.9182395e-03 3.7772327e-03 2.2769428e-03 -4.4629495e-03
   3.3151123e-03 4.6509290e-03 -4.8521687e-03 6.7615538e-04
   3.1034781e-03 2.6369948e-05 4.1454583e-03 -3.6932561e-03
   -1.8769916e-03 -2.1958587e-04 6.3395966e-04 -2.4969708e-03
]
Word2Vec(vocab=20, size=100, alpha=0.025)

워드 임베딩 시각화

시각화로 임베딩이라는 단어를 탐색 할 수도 있습니다. 고전적인 프로젝션 방법 (예 : PCA)을 사용하여 고차원 워드 벡터를 2D 플롯으로 줄임으로써 수행 할 수 있습니다. 축소되면 그래프에 그릴 수 있습니다.

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

먼저 다음과 같이 훈련 된 모델에서 모든 벡터를 검색해야합니다.

Z = model[model.wv.vocab]

다음으로, 다음과 같이 PCA 클래스를 사용하여 단어 벡터의 2-D PCA 모델을 만들어야합니다.

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

이제 다음과 같이 matplotlib를 사용하여 결과 투영을 플로팅 할 수 있습니다.

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

또한 단어 자체로 그래프의 점에 주석을 달 수 있습니다. 다음과 같이 matplotlib를 사용하여 결과 투영을 플롯합니다.

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
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
	['this', 'is', 'the', 'tutorials' 'point', 'website'],
	['you', 'can', 'read', 'technical','tutorials', 'for','free'],
	['we', 'are', 'implementing','word2vec'],
	['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
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()

산출