AI/NLP

NLP - word embedding

우당탕탕인생기 2023. 12. 20. 14:25

 

이전 글에 나오는 NLP 방법론은 단어간의 순서나 관계를 학습하기 어렵다는 단점이 있었습니다.

이번 글에서는 단어 간의 관계를 학습해 백터에 저장하는 word embedding 모델에 대해 알아보고자 한다.

 

 

word embedding

 

워드임베딩이란 기존에 원핫백터로 상당히 많은 차원을 문제점을 해결하는 방법입니다.(단어가 많으면 많을 수록 몇천 또는 몇만까지 커질 수 있습니다). 또한 대부분의 값이 1 아니면 0 으로 채워져 있기 때문에 비효율적이기도 합니다.

 

워드임베딩은 차원을 압축시켜 아무리 단어가 많고, 문장이 길어도 사전에 세팅한 차원으로 압축시켜줍니다. 

 

word2vec

워드임베딩을 위한 가장 유명한 방법 중 하나 입니다.

앞서 원핫백터는 단어간의 유의미한 유사도를 계산할 수 없다는 단점이 있었는데, word2vec은 단어간의 유사도를 확인 할 수 있다.

worde2vec는 같은 문장에서 나타난 인접 단어들 간의 의미가 서로 유사할 것이라는 전제를 가정한다. 즉 어떤 한 단어가 주변에 등장하는 단어를 통해 그 의미를 유추할 수 있다는 아이디어이다. 

 

주변 단어를 통해서 중심 단어의 의미를 파악 할 수 있다는 것이다.

 

word2vec 에는 크게 두가지 방법이 있는데

1) CBOW - 주변 단어들을 모두 합쳐 본 후 타겟 단어 맞추기

2) skipgram - 타깃단어를보고 주변 단어를 맞추기

 

 

 

아래와 같이 해당 단어의 주변단어들을 통해서 단어간 유사도를 구할 수 있다.

 

 

 

 

 

 

-

 

train_data = pd.read_table('ratings.txt')
train_data = train_data.dropna(how = 'any') # Null 값이 존재하는 행 제거
train_data['document'] = train_data['document'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")
stopwords = ['의','가','이','은','들','는','좀','잘','걍','과','도','를','으로','자','에','와','한','하다']
okt = Okt()
tokenized_data = []
for sentence in train_data['document']:
    tokenized_sentence = okt.morphs(sentence, stem=True) # 토큰화
    stopwords_removed_sentence = [word for word in tokenized_sentence if not word in stopwords] # 불용어 제거
    tokenized_data.append(stopwords_removed_sentence)

 

기본적인 영화리뷰 데이터를 가져와 간단한 전처리 이후 토큰화 하였다.

 

 

이제 Word2Vec 모델로 임베딩을 한다.

model = Word2Vec(sentences=tokenized_data , vector_size=100 , window=5,  min_count=5, workers=4, sg=0)

 

파라미터별 설명은 다음과 같다.

vector_size : 임베딩 된 백터의 차원 

window : 컨텍스트 윈도우 크기( 중심단어로부터 얼마나 멀리까지 포함시킬지)

min_count : 단어 최소 빈도 수 제한(빈도가 적은 단어들은 학습하지 않는다)

workers : 학습을 위한 프로세스 수

sg : 0은 CBOW 1은 skipgram

 

유사도를 확인하기 위해 model.wv.most_similar 를 사용하였다.

 

이렇게 한국 이라는 단어와 유사도가 높은것들을 가져 왔다

'AI > NLP' 카테고리의 다른 글

NLP-RAG : 검색 증강 생성 모델  (0) 2024.03.13
NLP - seq2seq  (1) 2023.12.27
NLP - RNN , LSTM  (1) 2023.12.27
NLP- LM(N-gram)  (0) 2023.12.21
NLP - BoW , N-gram, TF-IDF  (0) 2023.12.20