예제가 포함된 Word Embedding 및 Word2Vec 모델

워드 임베딩이란 무엇입니까?

워드 임베딩 기계 학습 알고리즘이 유사한 의미를 가진 단어를 이해할 수 있도록 하는 단어 표현 유형입니다. 신경망, 확률적 모델 또는 단어 동시 발생 행렬의 차원 감소를 사용하여 단어를 실수 벡터로 매핑하는 언어 모델링 및 기능 학습 기술입니다. 일부 단어 임베딩 모델은 Word2vec(Google), Glove(Stanford), fastest(Facebook)입니다.

워드 임베딩은 분산 의미 모델, 분산 표현 또는 의미 벡터 공간 또는 벡터 공간 모델이라고도 합니다. 이 이름을 읽다 보면 비슷한 단어를 함께 분류한다는 뜻의 의미론(semantic)이라는 단어를 접하게 됩니다. 예를 들어 사과, 망고, 바나나 같은 과일은 가까이 배치해야 하고, 책은 이러한 단어에서 멀리 배치해야 합니다. 더 넓은 의미에서 단어 임베딩은 책의 벡터 표현에서 멀리 떨어진 곳에 과일 벡터를 생성합니다.

워드 임베딩은 어디에 사용되나요?

단어 임베딩은 피처 생성, 문서 클러스터링, 텍스트 분류 및 자연어 처리 작업에 도움이 됩니다. 이를 나열하고 각 응용 프로그램에 대해 논의해 보겠습니다.

  • 비슷한 단어를 계산합니다. 단어 임베딩은 예측 모델의 대상이 되는 단어와 유사한 단어를 제안하는 데 사용됩니다. 이와 함께 가장 일반적인 단어뿐만 아니라 다른 단어도 제안합니다.
  • 관련 단어 그룹을 만듭니다. 유사한 특성을 가진 것들을 그룹화하고 멀리 떨어져 있는 다른 것들을 그룹화하는 의미론적 그룹화에 사용됩니다.
  • 텍스트 분류 기능: 텍스트는 학습 및 예측을 위해 모델에 제공되는 벡터 배열로 매핑됩니다. 텍스트 기반 분류 모델은 문자열에 대해 학습할 수 없으므로 텍스트를 기계 학습 가능한 형식으로 변환합니다. 또한 텍스트 기반 분류에서 의미론적 도움말을 구축하는 기능도 있습니다.
  • 문서 클러스터링: Word Embedding Word2vec이 널리 사용되는 또 다른 응용 프로그램입니다.
  • 자연 언어 처리: 단어 임베딩이 유용하고 품사 태깅, 감성 분석, 구문 분석과 같은 특징 추출 단계에서 승리하는 많은 애플리케이션이 있습니다. 이제 우리는 단어 삽입에 대한 지식을 얻었습니다. 단어 임베딩을 구현하기 위해 다른 모델에도 일부 조명이 적용됩니다. 이 전체 Word Embedding 튜토리얼은 모델 중 하나(Word2vec)에 중점을 둡니다.

Word2vec이란 무엇입니까?

워드투벡 더 나은 단어 표현을 위해 단어 임베딩을 생성하는 기술/모델입니다. 이는 다수의 정확한 구문적, 의미적 단어 관계를 포착하는 자연어 처리 방법입니다. 이는 동의어를 감지하고 학습된 후 부분 문장에 대해 추가 단어를 제안할 수 있는 얕은 XNUMX층 신경망입니다.

이 Word2vec 튜토리얼을 더 진행하기 전에 아래 Word 임베딩 예제 다이어그램에 표시된 것처럼 얕은 신경망과 심층 신경망의 차이점을 확인하세요.

얕은 신경망은 입력과 출력 사이에 은닉층 하나만으로 구성되는 반면, 심층 신경망은 입력과 출력 사이에 여러 개의 은닉층을 포함합니다. 입력에는 노드가 적용되는 반면, 숨겨진 레이어와 출력 레이어에는 뉴런이 포함됩니다.

얕은 학습과 심층 학습
얕은 학습과 심층 학습

Word2vec은 입력 하나의 숨겨진 레이어와 출력이 있는 XNUMX계층 네트워크입니다.

Word2vec은 Google의 Tomas Mikolov가 이끄는 연구원 그룹에 의해 개발되었습니다. Word2vec은 잠재 의미 분석 모델보다 더 우수하고 효율적입니다.

왜 Word2vec인가?

Word2vec는 벡터 공간 표현으로 단어를 표현합니다. 단어는 벡터 형태로 표현되고 유사한 의미의 단어는 함께 나타나고 다른 단어는 멀리 떨어져 있는 방식으로 배치됩니다. 이를 의미 관계라고도 합니다. 신경망은 텍스트를 이해하지 못하고 숫자만 이해합니다. 워드 임베딩은 텍스트를 숫자 벡터로 변환하는 방법을 제공합니다.

Word2vec은 단어의 언어적 맥락을 재구성합니다. 더 나아가기 전에 언어적 맥락이 무엇인지 이해해 봅시다. 일반적인 생활 속에서 우리가 의사소통을 위해 말하거나 글을 쓸 때, 다른 사람들은 문장의 목적이 무엇인지 파악하려고 노력합니다. 예를 들어, “인도의 온도는 얼마입니까?”, 여기서 컨텍스트는 사용자가 컨텍스트인 “인도의 온도”를 알고 싶어하는 것입니다. 즉, 문장의 주요 목적은 문맥입니다. 말이나 글을 둘러싼 단어나 문장(공개)은 맥락의 의미를 결정하는 데 도움이 됩니다. Word2vec은 문맥을 통해 단어의 벡터 표현을 학습합니다.

Word2vec은 무엇을 합니까?

워드 임베딩 전

Word Embedding에 앞서 어떤 접근 방식을 사용하는지, 단점은 무엇인지 아는 것이 중요하며, Word2vec 접근 방식을 사용하여 Word Embedding으로 단점을 어떻게 극복하는지에 대한 주제로 넘어가겠습니다. 마지막으로 Word2vec의 작동 방식을 이해하는 것이 중요하므로 WordXNUMXvec의 작동 방식을 살펴보겠습니다.

잠재 의미 분석을 위한 접근 방식

이는 단어 임베딩 이전에 사용되었던 접근 방식입니다. 단어를 인코딩된 벡터 형태로 표현하는 Bag of Words 개념을 사용했습니다. 차원이 어휘의 크기와 동일한 희소 벡터 표현입니다. 해당 단어가 사전에 나오면 그 단어는 계산되고, 그렇지 않으면 계산되지 않습니다. 자세한 내용을 보려면 아래 프로그램을 참조하세요.

Word2vec 예

Word2vec 예

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
data_corpus = ["guru99 is the best site for online tutorials. I love to visit guru99."]
vocabulary = vectorizer.fit(data_corpus)
X = vectorizer.transform(data_corpus)

print(X.toarray())
print(vectorizer.get_feature_names_out())

출력:

[[1 2 1 1 1 1 1 1 1 1]]

[u'best', u'guru99', u'is', u'love', u'online', u'sitefor', u'the', u'to', u'tutorials', u'visit']

코드 설명

  1. CountVectorizer는 단어에 맞는 어휘를 저장하는 데 사용되는 모듈입니다. 이것은 sklearn에서 가져옵니다.
  2. CountVectorizer 클래스를 사용하여 객체를 만듭니다.
  3. CountVectorizer에 들어갈 데이터를 목록에 작성합니다.
  4. 데이터는 CountVectorizer 클래스에서 생성된 개체에 맞습니다.
  5. 단어백 접근 방식을 적용하여 어휘를 사용하여 데이터의 단어 수를 계산합니다. 어휘에서 단어나 토큰을 사용할 수 없는 경우 해당 색인 위치는 XNUMX으로 설정됩니다.
  6. 5번째 줄의 변수 x는 배열로 변환됩니다(x에 사용 가능한 메서드). 그러면 3행에 제공된 문장이나 목록의 각 토큰 수가 제공됩니다.
  7. 이는 4행의 데이터를 사용하여 피팅될 때 어휘의 일부인 기능을 표시합니다.

잠재 의미론적 접근 방식에서 행은 고유한 단어를 나타내고 열은 해당 단어가 문서에 나타나는 횟수를 나타냅니다. 문서 매트릭스 형태로 단어를 표현한 것입니다. TFIDF(Term-Frequency Inverse Document Frequency)는 문서 내 단어의 빈도, 즉 문서 내 단어의 빈도/전체 말뭉치에서 해당 용어의 빈도를 계산하는 데 사용됩니다.

Bag of Words 방식의 단점

  • 예를 들어 this is bad = bad is this와 같이 단어의 순서를 무시합니다.
  • 단어의 맥락을 무시합니다. 내가 “그는 책을 좋아했다.”라는 문장을 쓴다고 가정해보자. 교육은 책에서 가장 잘 찾을 수 있습니다.” 이는 "그는 책을 사랑했습니다"에 대한 벡터와 "교육은 책에서 가장 잘 찾을 수 있습니다."에 대한 두 개의 벡터를 생성합니다. 둘 다 직교로 처리하여 독립적으로 만들지만 실제로는 서로 관련되어 있습니다.

이러한 한계를 극복하기 위해 단어 삽입이 개발되었으며 Word2vec은 이를 구현하는 접근 방식입니다.

Word2vec은 어떻게 작동하나요?

Word2vec은 주변 상황을 예측하여 단어를 학습합니다. 예를 들어, "그는 loves 축구."

우리는 사랑이라는 단어에 대한 Word2vec을 계산하려고 합니다.

가정

loves =  Vin. P(Vout / Vin) is calculated	
where,	
Vin is the input word. 	
P is the probability of likelihood.	
Vout is the output word. 	

워드 loves 말뭉치의 각 단어 위로 이동합니다. 단어 간의 의미론적 관계뿐만 아니라 구문론적 관계도 인코딩됩니다. 이것은 유사하고 유사한 단어를 찾는 데 도움이 됩니다.

단어의 모든 무작위 기능 loves 계산됩니다. 이러한 기능은 다음의 도움으로 이웃 또는 문맥 단어와 관련하여 변경되거나 업데이트됩니다. 역전파 방법.

또 다른 학습 방법은 두 단어의 문맥이 유사하거나 두 단어의 특징이 비슷한 경우 해당 단어가 관련되어 있다는 것입니다.

워드투벡 Archi강의

Word2vec에서는 두 가지 아키텍처가 사용됩니다.

  1. 연속 단어백(CBOW)
  2. 그램 건너뛰기

이 Word2vec 튜토리얼을 더 진행하기 전에, 이러한 아키텍처나 모델이 단어 표현 관점에서 왜 중요한지 논의해 보겠습니다. 단어 표현을 학습하는 것은 본질적으로 비지도 학습이지만, 모델을 훈련하기 위해서는 타겟/레이블이 필요합니다. 스킵그램과 CBOW는 비지도 학습 표현을 모델 훈련을 위한 지도 학습 형태로 변환합니다.

CBOW에서 현재 단어는 주변 컨텍스트 창의 창을 사용하여 예측됩니다. 예를 들어, wI-1,wI-2,wi + 1,wi + 2단어나 문맥이 주어지면 이 모델은 다음을 제공합니다.i

Skip-Gram은 단어에서 주어진 순서나 문맥을 예측한다는 것을 의미하는 CBOW와 반대되는 기능을 수행합니다. 예를 뒤집어서 이해하면 됩니다. 만약 wi 주어지면 이는 컨텍스트 또는 w를 예측할 것입니다.I-1,wI-2,wi + 1,w나+2.

Word2vec은 CBOW(continuous Bag of words)와 skim-gram 중에서 선택할 수 있는 옵션을 제공합니다. 이러한 매개변수는 모델을 학습하는 동안 제공됩니다. 부정적 샘플링이나 계층적 소프트맥스 계층을 사용할 수 있는 옵션이 있습니다.

연속 단어 가방

연속적인 백 형태의 단어 구조를 이해하기 위해 간단한 Word2vec 예제 다이어그램을 그려보겠습니다.

지속적인 단어 가방 Archi강의

지속적인 단어 가방 Archi강의

방정식을 수학적으로 계산해 보겠습니다. V가 어휘 크기이고 N이 은닉층 크기라고 가정합니다. 입력은 다음과 같이 정의됩니다. { xI-1, X나는-2, x나는+1, xi + 2}. V * N을 곱하여 가중치 행렬을 얻습니다. 또 다른 행렬은 입력 벡터를 가중치 행렬과 곱하여 얻습니다. 이는 다음 방정식으로도 이해할 수 있습니다.

h=xitW

어디 xit? W는 각각 입력 벡터와 가중치 행렬입니다.

문맥과 다음 단어 간의 일치를 계산하려면 아래 방정식을 참조하십시오.

u=예측 표현*h

여기서 예측된 표현은 위의 방정식에서 모델?h를 얻습니다.

스킵그램 모델

Skip-Gram 접근법은 입력 단어가 주어졌을 때 문장을 예측하는 데 사용됩니다. 더 잘 이해하기 위해 아래 Word2vec 예제와 같이 다이어그램을 그려 보겠습니다.

스킵그램 모델

스킵그램 모델

입력이 단어이고 모델이 컨텍스트 또는 시퀀스를 제공하는 연속 단어 가방 모델의 반대 방향으로 처리할 수 있습니다. 또한 대상이 입력에 공급되고 출력 레이어가 선택한 문맥 단어 수를 수용하기 위해 여러 번 복제된다는 결론을 내릴 수 있습니다. 모든 출력 레이어의 오류 벡터를 합산하여 역전파 방법을 통해 가중치를 조정합니다.

어떤 모델을 선택할 것인가?

CBOW는 Skip gram보다 몇 배 빠르며 자주 사용되는 단어에 대해 더 나은 빈도를 제공하는 반면 Skip gram은 소량의 훈련 데이터가 필요하고 희귀한 단어나 구문도 나타냅니다.

Word2vec과 NLTK의 관계

NLTK 자연어 툴킷입니다. 텍스트의 사전 처리에 사용됩니다. 품사 태그, 레마타이징, 어간 추출, 불용어 제거, 희귀 단어 또는 가장 적게 사용되는 단어 제거와 같은 다양한 작업을 수행할 수 있습니다. 텍스트를 정리하는 데 도움이 될 뿐만 아니라 효과적인 단어에서 특징을 준비하는 데 도움이 됩니다. 다른 방식으로 Word2vec는 의미적(밀접하게 관련된 항목) 및 구문적(시퀀스) 일치에 사용됩니다. Word2vec를 사용하면 유사한 단어, 유사하지 않은 단어, 차원 감소 및 기타 여러 가지를 찾을 수 있습니다. Word2vec의 또 다른 중요한 기능은 텍스트의 고차원 표현을 저차원 벡터로 변환하는 것입니다.

NLTK와 Word2vec을 어디에서 사용합니까?

위에서 언급한 토큰화, POS 태깅 및 구문 분석과 같은 일부 범용 작업을 수행해야 하는 경우 NLTK를 사용해야 하며 일부 컨텍스트, 주제 모델링 또는 문서 유사성에 따라 단어를 예측하려면 Word2vec을 사용해야 합니다.

코드의 도움으로 NLTK와 Word2vec의 관계

NLTK와 Word2vec를 함께 사용하면 유사한 단어 표현이나 구문적 일치를 찾을 수 있습니다. NLTK 툴킷을 사용하면 NLTK와 함께 제공되는 많은 패키지를 로드할 수 있으며 Word2vec를 사용하여 모델을 만들 수 있습니다. 그런 다음 실시간 단어에서 테스트할 수 있습니다. 다음 코드에서 두 가지의 조합을 살펴보겠습니다. 더 진행하기 전에 NLTK가 제공하는 코퍼스를 살펴보세요. 다음 명령을 사용하여 다운로드할 수 있습니다.

nltk(nltk.download('all'))

NLTK와 Word2vec의 관계

NLTK를 사용하여 다운로드된 말뭉치

코드는 스크린샷을 참조하세요.

import nltk
import gensim
from nltk.corpus import abc

model= gensim.models.Word2Vec(abc.sents())
X= list(model.wv.vocab)
data=model.most_similar('science')
print(data)

코드의 도움으로 NLTK와 Word2vec의 관계

출력:

[('law', 0.9415997266769409), ('practice', 0.9276568293571472), ('discussion', 0.9259148836135864), ('agriculture', 0.9257254004478455), ('media', 0.9232194423675537), ('policy', 0.922248125076294), ('general', 0.9166069030761719), ('undertaking', 0.916458249092102), ('tight', 0.9129181504249573), ('board', 0.9107444286346436)]

코드 설명

  1. nltk 라이브러리를 가져오면 다음 단계에서 사용할 abc 코퍼스를 다운로드할 수 있습니다.
  2. 젠심은 수입품입니다. Gensim Word2vec이 설치되어 있지 않은 경우 “pip3 install gensim” 명령을 사용하여 설치하세요. 아래 스크린샷을 참조하세요.
PIP를 사용하여 Gensim 설치

PIP를 사용하여 Gensim 설치
  1. nltk.download('abc')를 사용하여 다운로드한 코퍼스 abc를 가져옵니다.
  2. Gensim을 사용하여 문장으로 가져온 모델 Word2vec에 파일을 전달합니다.
  3. 어휘는 변수 형태로 저장됩니다.
  4. 이러한 파일은 과학과 관련되어 있으므로 모델은 샘플 단어 과학에서 테스트됩니다.
  5. 여기서는 유사한 "science"라는 단어가 모델에 의해 예측됩니다.

활성기 및 Word2Vec

뉴런의 활성화 함수는 입력 집합이 주어졌을 때 해당 뉴런의 출력을 정의합니다. 생물학적으로 다른 뉴런이 다른 자극을 사용하여 활성화되는 우리 뇌의 활동에서 영감을 받았습니다. 다음 다이어그램을 통해 활성화 함수를 이해해 보겠습니다.

Word2vec의 활성화 기능

활성화 기능 이해

여기서 x1,x2,..x4는 신경망의 노드입니다.

w1, w2, w3은 노드의 가중치이고,

? 활성화 함수로 작동하는 모든 가중치와 노드 값의 합입니다.

활성화 기능이 필요한 이유는 무엇입니까?

활성화 함수를 사용하지 않으면 출력은 선형이지만 선형 함수의 기능은 제한적입니다. 객체 감지, 이미지 분류, 음성을 사용한 텍스트 입력 및 기타 많은 비선형 출력과 같은 복잡한 기능을 구현하려면 활성화 함수를 사용하여 구현해야 합니다.

단어 임베딩(Word2vec)에서 활성화 레이어를 계산하는 방법

소프트맥스 계층(정규화된 지수 함수)은 각 노드를 활성화하거나 발사하는 출력 계층 함수입니다. 사용되는 또 다른 접근 방식은 복잡도가 O(log2V) 여기서 소프트맥스는 O(V)이고 V는 어휘 크기입니다. 이 두 가지의 차이점은 계층적 소프트맥스 계층의 복잡성 감소입니다. (계층적 소프트맥스) 기능을 이해하려면 아래의 단어 임베딩 예제를 살펴보세요.

계층적 소프트맥스 트리와 유사한 구조

계층적 소프트맥스 트리와 같은 구조

단어를 관찰할 확률을 계산한다고 가정합니다. 애정 특정 상황이 주어지면. 루트에서 리프 노드로의 흐름은 먼저 노드 2로 이동한 다음 노드 5로 이동합니다. 따라서 어휘 크기가 8인 경우 세 번의 계산만 필요합니다. 따라서 분해하여 한 단어의 확률을 계산할 수 있습니다(애정).

계층적 소프트맥스 이외에 어떤 다른 옵션을 사용할 수 있나요?

사용 가능한 단어 임베딩 옵션에 대해 일반적인 의미로 말하면 Differentiated Softmax, CNN-Softmax, Importance Sampling, Adaptive Importance sampling, Noise Contrastive Estimations, Negative Sampling, Self-Normalization 및 Infrequent Normalization이 있습니다.

Word2vec에 대해 구체적으로 말하면 부정적인 샘플링이 가능합니다.

네거티브 샘플링은 훈련 데이터를 샘플링하는 방법입니다. 확률적 경사하강법과 다소 비슷하지만 약간의 차이가 있습니다. 네거티브 샘플링은 네거티브 훈련 예제만 찾습니다. 이는 잡음 대비 추정을 기반으로 하며 문맥이 아닌 단어를 무작위로 샘플링합니다. 이는 빠른 훈련 방법이며 상황을 무작위로 선택합니다. 예측된 단어가 무작위로 선택된 컨텍스트에 나타나면 두 벡터는 서로 가깝습니다.

어떤 결론을 내릴 수 있습니까?

활성화자는 외부 자극을 사용하여 뉴런이 활성화되는 것처럼 뉴런을 활성화합니다. 소프트맥스 계층은 단어 임베딩의 경우 뉴런을 활성화하는 출력 계층 함수 중 하나입니다. Word2vec에는 계층적 소프트맥스 및 부정 샘플링과 같은 옵션이 있습니다. 활성화자를 사용하면 선형 함수를 비선형 함수로 변환할 수 있으며, 이를 사용하여 복잡한 머신 러닝 알고리즘을 구현할 수 있습니다.

젠심이란 무엇인가요?

겐심 는 오픈 소스 주제 모델링 및 자연어 처리 도구 키트로 구현됩니다. Python 그리고 사이썬. Gensim 툴킷을 사용하면 사용자는 주제 모델링을 위해 Word2vec을 가져와 텍스트 본문의 숨겨진 구조를 발견할 수 있습니다. Gensim은 Word2vec 구현뿐만 아니라 Doc2vec 및 FastText 구현도 제공합니다.

이 튜토리얼은 모두 Word2vec에 관한 것이므로 현재 주제를 계속 다루겠습니다.

Gensim을 사용하여 Word2vec을 구현하는 방법

지금까지 Word2vec가 무엇인지, 다양한 아키텍처, 단어 가방에서 Word2vec로 전환된 이유, 라이브 코드와 활성화 함수가 포함된 Word2vec와 NLTK의 관계에 대해 논의했습니다.

다음은 Gensim을 사용하여 Word2vec을 구현하는 단계별 방법입니다.

1단계) 데이터 수집

기계 학습 모델을 구현하거나 자연어 처리를 구현하는 첫 번째 단계는 데이터 수집입니다.

아래 Gensim Word2vec 예제에서 보이는 것처럼 지능형 챗봇을 구축하기 위해 데이터를 관찰해 보세요.

[{"tag": "welcome",
"patterns": ["Hi", "How are you", "Is any one to talk?", "Hello", "hi are you available"],
"responses": ["Hello, thanks for contacting us", "Good to see you here"," Hi there, how may I assist you?"]

        },
{"tag": "goodbye",
"patterns": ["Bye", "See you later", "Goodbye", "I will come back soon"],
"responses": ["See you later, thanks for visiting", "have a great day ahead", "Wish you Come back again soon."]
        },

{"tag": "thankful",
"patterns": ["Thanks for helping me", "Thank your guidance", "That's helpful and kind from you"],
"responses": ["Happy to help!", "Any time!", "My pleasure", "It is my duty to help you"]
        },
        {"tag": "hoursopening",
"patterns": ["What hours are you open?", "Tell your opening time?", "When are you open?", "Just your timing please"],
"responses": ["We're open every day 8am-7pm", "Our office hours are 8am-7pm every day", "We open office at 8 am and close at 7 pm"]
        },

{"tag": "payments",
"patterns": ["Can I pay using credit card?", " Can I pay using Mastercard?", " Can I pay using cash only?" ],
"responses": ["We accept VISA, Mastercard and credit card", "We accept credit card, debit cards and cash. Please don’t worry"]
        }
   ]

데이터를 통해 우리가 이해한 내용은 다음과 같습니다.

  • 이 데이터에는 태그, 패턴, 응답 세 가지가 포함됩니다. 태그는 의도(토론 주제가 무엇인지)입니다.
  • 데이터는 JSON 형식입니다.
  • 패턴은 사용자가 봇에게 묻는 질문입니다.
  • 응답은 챗봇이 해당 질문/패턴에 대해 제공하는 답변입니다.

2단계) 데이터 전처리

원시 데이터를 처리하는 것은 매우 중요합니다. 정리된 데이터가 기계에 공급되면 모델은 더 정확하게 반응하고 데이터를 더 효율적으로 학습하게 됩니다.

이 단계에는 중지 단어, 형태소 분석, 불필요한 단어 등을 제거하는 작업이 포함됩니다. 계속 진행하기 전에 데이터를 로드하고 데이터 프레임으로 변환하는 것이 중요합니다. 이에 대해서는 아래 코드를 참조하세요.

import json
json_file =’intents.json'
with open('intents.json','r') as f:
    data = json.load(f)

코드 설명:

  1. 데이터는 json 형식이므로 json을 가져옵니다.
  2. 파일은 변수에 저장됩니다
  3. 파일이 열려 있고 데이터 변수에 로드되어 있습니다.

이제 데이터를 가져왔고 데이터를 데이터 프레임으로 변환할 차례입니다. 다음 단계를 보려면 아래 코드를 참조하세요.

import pandas as pd
df = pd.DataFrame(data)
df['patterns'] = df['patterns'].apply(', '.join) 

코드 설명:

1. 위에서 가져온 pandas를 사용하여 데이터를 데이터 프레임으로 변환합니다.

2. 열 패턴의 목록을 문자열로 변환합니다.

from nltk.corpus import stopwords
from textblob import Word
stop = stopwords.words('english')
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x.lower() for x in x.split()))
df['patterns't']= df['patterns''].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)
df['patterns']= df['patterns'].str.replace('[^\w\s]','')
df['patterns']= df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if  not x.isdigit()))
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x for x in x.split() if not x in stop))
df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))

코드 설명 :

1. 영어 불용어는 nltk 툴킷의 불용어 모듈을 사용하여 가져옵니다.

2. 조건문과 람다 함수를 이용하여 텍스트의 모든 단어를 소문자로 변환합니다. 람다 함수 익명 함수입니다.

3. 데이터 프레임에 있는 텍스트의 모든 행에 문자열 구두점이 있는지 확인하고 이를 필터링합니다.

4. 숫자나 점과 같은 문자는 정규 표현식을 사용하여 제거됩니다.

5. Digits가 텍스트에서 제거됩니다.

6. 이 단계에서는 불용어가 제거됩니다.

7. 이제 단어가 필터링되고, 동일한 단어의 다른 형태가 표제어 추출을 사용하여 제거됩니다. 이로써 데이터 전처리가 완료되었습니다.

출력:

, patterns, responses, tag
0,hi one talk hello hi available,"['Hello, thanks for contacting us', 'Good to see you here', ' Hi there, how may I assist you?']",welcome
1,bye see later goodbye come back soon,"['See you later, thanks for visiting', 'have a great day ahead', 'Wish you Come back again soon.']",goodbye
2,thanks helping thank guidance thats helpful kind,"['Happy to help!', 'Any time!', 'My pleasure', 'It is my duty to help you']",thankful
3,hour open tell opening time open timing please,"[""We're open every day 8am-7pm"", 'Our office hours are 8am-7pm every day', 'We open office at 8 am and close at 7 pm']",hoursopening
4,pay using credit card pay using mastercard pay using cash,"['We accept VISA, Mastercard and credit card', 'We accept credit card, debit cards and cash. Please don’t worry']",payments

3단계) ​​Word2vec을 이용한 신경망 구축

이제 Gensim Word2vec 모듈을 사용하여 모델을 구축할 차례입니다. Gensim에서 Word2vec을 가져와야 합니다. 이렇게 한 다음 빌드하고 마지막 단계에서 실시간 데이터를 기반으로 모델을 확인하겠습니다.

from gensim.models import Word2Vec

이제 이 Gensim Word2vec 튜토리얼에서는 Word2Vec을 사용하여 모델을 성공적으로 구축할 수 있습니다. Word2Vec을 사용하여 모델을 생성하는 방법을 알아보려면 다음 코드 줄을 참조하세요. 텍스트는 목록 형태로 모델에 제공되므로 아래 코드를 사용하여 데이터 프레임의 텍스트를 목록으로 변환합니다.

Bigger_list=[]
for i in df['patterns']
     li = list(i.split(""))
     Bigger_list.append(li)	
Model= Word2Vec(Bigger_list,min_count=1,size=300,workers=4)

코드 설명:

1. 내부 목록이 추가되는 더 큰 목록을 생성했습니다. 이것은 Word2Vec 모델에 제공되는 형식입니다.

2. 루프가 구현되고 데이터 프레임 패턴 열의 각 항목이 반복됩니다.

3. 열 패턴의 각 요소는 분할되어 내부 목록 li에 저장됩니다.

4. 내부 목록은 외부 목록과 함께 추가됩니다.

5. 이 목록은 Word2Vec 모델에 제공됩니다. 여기에 제공된 일부 매개변수를 이해해 보겠습니다.

최소 개수: 총 빈도가 이보다 낮은 모든 단어를 무시합니다.

크기 : 이는 단어 벡터의 차원을 알려줍니다.

노동자 : 모델을 훈련하기 위한 스레드입니다.

사용할 수 있는 다른 옵션도 있으며, 몇 가지 중요한 옵션은 아래에 설명되어 있습니다.

창 : 문장 내에서 현재 단어와 예측 단어 사이의 최대 거리입니다.

Sg: 이것은 훈련 알고리즘이며, 1은 skip-gram이고 0은 Continuous bag of words입니다. 위에서 이것들에 대해 자세히 논의했습니다.

Hs : 만약 이 값이 1이라면, 우리는 학습을 위해 계층적 소프트맥스를 사용하고, 만약 0이라면, 음수 샘플링을 사용합니다.

알파 : 초기 학습률

아래에 최종 코드를 표시해 보겠습니다.

#list of libraries used by the code
import string
from gensim.models import Word2Vec
import logging
from nltk.corpus import stopwords
from textblob import Word
import json
import pandas as pd
#data in json format
json_file = 'intents.json'
with open('intents.json','r') as f:
    data = json.load(f)
#displaying the list of stopwords
stop = stopwords.words('english')
#dataframe
df = pd.DataFrame(data)

df['patterns'] = df['patterns'].apply(', '.join)
# print(df['patterns'])
#print(df['patterns'])
#cleaning the data using the NLP approach
print(df)
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x.lower() for x in x.split()))
df['patterns']= df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation))
df['patterns']= df['patterns'].str.replace('[^\w\s]','')
df['patterns']= df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if  not x.isdigit()))
df['patterns'] = df['patterns'].apply(lambda x:' '.join(x for x in x.split() if not x in stop))
df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
#taking the outer list
bigger_list=[]
for i in df['patterns']:
    li = list(i.split(" "))
    bigger_list.append(li)
#structure of data to be taken by the model.word2vec
print("Data format for the overall list:",bigger_list)
#custom data is fed to machine for further processing
model = Word2Vec(bigger_list, min_count=1,size=300,workers=4)
#print(model)

4단계) 모델 저장

모델은 bin, 모델 형태로 저장할 수 있습니다. Bin은 바이너리 형식입니다. 모델을 저장하려면 아래 줄을 참조하십시오.

model.save("word2vec.model")
model.save("model.bin")

위 코드에 대한 설명

1. 모델은 .model 파일 형태로 저장됩니다.

2. 모델은 .bin 파일 형식으로 저장됩니다.

우리는 이 모델을 사용하여 유사한 단어, 다른 단어, 가장 일반적인 단어와 같은 실시간 테스트를 수행할 것입니다.

5단계) 모델 로딩 및 실시간 테스트 수행

모델은 아래 코드를 사용하여 로드됩니다.

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

어휘를 인쇄하려면 아래 명령을 사용하면 됩니다.

vocab = list(model.wv.vocab)

결과를 확인하세요:

['see', 'thank', 'back', 'thanks', 'soon', 'open', 'mastercard', 'card', 'time', 'pay', 'talk', 'cash', 'one', 'please', 'goodbye', 'thats', 'helpful', 'hour', 'credit', 'hi', 'later', 'guidance', 'opening', 'timing', 'hello', 'helping', 'bye', 'tell', 'come', 'using', 'kind', 'available']

6단계) 가장 유사한 단어 확인

실제로 구현해 보겠습니다.

similar_words = model.most_similar('thanks')	
print(similar_words)	

결과를 확인하세요:

[('kind', 0.16104359924793243), ('using', 0.1352398842573166), ('come', 0.11500970274209976), ('later', 0.09989878535270691), ('helping', 0.04855936020612717), ('credit', 0.04659383371472359), ('pay', 0.0329081267118454), ('thank', 0.02484947443008423), ('hour', 0.0202352125197649), ('opening', 0.018177658319473267)]

7단계) 제공된 단어의 단어가 일치하지 않습니다.

dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split())
print(dissimlar_words)

우리는 단어를 제공했습니다 '나중에 뵙겠습니다. 방문해 주셔서 감사합니다.' 이 뜻 이 단어들과 가장 다른 단어를 인쇄하세요. 이 코드를 실행하고 결과를 찾아보겠습니다.

위 코드를 실행한 후의 결과는 다음과 같습니다.

Thanks

8 단계) 두 단어 사이의 유사성 찾기

이는 두 단어 사이의 유사성 확률 결과를 알려줍니다. 이 섹션을 실행하는 방법은 아래 코드를 참조하세요.

similarity_two_words = model.similarity('please','see')
print("Please provide the similarity between these two words:")
print(similarity_two_words)

위 코드의 결과는 아래와 같습니다.

0.13706

아래 코드를 실행하면 유사한 단어를 더 찾을 수 있습니다.

similar = model.similar_by_word('kind')
print(similar)

위 코드의 출력:

[('credit', 0.11764447391033173), ('cash', 0.11440904438495636), ('one', 0.11151769757270813), ('hour', 0.0944807156920433), ('using', 0.0705675333738327), ('thats', 0.05206916481256485), ('later', 0.04502468928694725), ('bye', 0.03960943967103958), ('back', 0.03837274760007858), ('thank', 0.0380823090672493)] 

결론

  • 워드 임베딩은 머신 러닝 알고리즘이 유사한 의미를 가진 단어를 이해할 수 있도록 하는 단어 표현 유형입니다.
  • 단어 임베딩은 유사한 단어를 계산하고, 관련 단어 그룹을 생성하고, 텍스트 분류 기능, 문서 클러스터링, 자연어 처리에 사용됩니다.
  • Word2vec 설명: Word2vec은 더 나은 단어 표현을 위해 단어 임베딩을 생성하는 얕은 XNUMX계층 신경망 모델입니다.
  • Word2vec은 벡터 공간 표현의 단어를 나타냅니다. 단어는 벡터 형태로 표현되며 비슷한 의미의 단어는 함께 나타나고, 다른 단어는 멀리 위치하는 방식으로 배치됩니다.
  • Word2vec 알고리즘은 CBOW(Continuous Bag of Words) 및 Skip gram의 2가지 아키텍처를 사용합니다.
  • CBOW는 Skip gram보다 몇 배 빠르며 자주 사용되는 단어에 대해 더 나은 빈도를 제공하는 반면 Skip gram은 소량의 훈련 데이터가 필요하고 희귀한 단어나 구문도 나타냅니다.
  • NLTK와 Word2vec을 함께 사용하면 강력한 애플리케이션을 만들 수 있습니다.
  • 뉴런의 활성화 함수는 일련의 입력이 주어지면 해당 뉴런의 출력을 정의합니다. Word2vec에서. Softmax Layer(정규화된 지수 함수)는 각 노드를 활성화하거나 실행하는 출력 계층 함수입니다. Word2vec에는 네거티브 샘플링도 가능합니다.
  • Gensim은 Python으로 구현된 주제 모델링 툴킷입니다.