top of page
검색

워드투벡터 Word2vec 설명 및 실제 코딩

  • yssskim1
  • 2023년 1월 11일
  • 3분 분량

‘13년 구글에서 개발한 Word2vec은 이름 그대로 단어(Word)를 벡터(Vector)로 수치화시키는 방법(임베딩, Embedding)이고, 이 방법을 통해 텍스트 같은 비정형 데이터를 좌표 평면에 나타낼 수 있다. 보통 여러 단어로부터 한 단어를 추측하는 CBOW 모형(Continuous bag of words model)과 한 단어로부터 여러 단어를 추측하는 skip-gram 모형이 존재한다. Word2vec 방법 이외에도 텍스트 데이터를 벡터화하는 방식이 여러 존재하지만, Word2vec은 이러한 방식에서 좀 더 발전되어 단어의 의미를 단어가 아닌 의미 자체를 벡터 형태로 표현하는 방법으로써 복잡한 개념 표현뿐만 아니라 다른 단어를 유추하는 추론까지도 구현할 수 있다. 네이버와 다음의 검색(예: 샴푸와 A 브랜드 샴푸 1년 치) 결과를 AI의 Word2vec 단어 유사도 분석한다고 가정해 보자.

- Embedding : [순서] 1) 네이버와 다음의 검색 결과 수집 2) 포스태깅(POS Tagging, Part-of-Speech Tagging, 형태소분석, 품사 태깅) *형태소분석이란 형태소를 비롯하여, 어근, 접두사/접미사, 품사(POS, part-of-speech) 등 다양한 언어적 속성의 구조를 파악하는 것이고, 품사 태깅은 형태소의 뜻과 문맥을 고려하여 그것에 마크업을 하는 일이다. 코딩에는 3가지가 있다. nouns(phrase)는 명사 추출, morphs(phrase)는 형태소 분석, pos(phrase, flatten=True)는 품사 태깅 “영수와 영희가 뒷동산에서 놀고 있다” 단어 : 어절(띄어쓰기 단위), 조사 어절 기준, 영수와 / 영희가 / 뒷동산에서 / 놀고 / 있다 에서 조사를 다시 구분하면 영수 / 와 / 영희 / 가 / 뒷동산 / 에서 / 놀고 / 있다는 것이라고 단어는 8개가 된다. 형태소 : 뜻을 가진 최소 단위로 단어에서 어간, 어미, 복합어를 이루는 어근이나 접사도 더 분리해야 한다. 영수 / 와 / 영희 / 가 / 뒷/ 동산 / 에서 / 놀- / -고 / 있- / -다 로 형태소는 11개가 된다. 품사는 명사, 대명사, 수사, 관형사, 부사, 동사, 형용사, 조사, 감탄사 등 학교문법에서는 9 품사 체계를 따른다. 영수(명사), 와(조사), 영희(명사), 가(조사), 놀고(동사), 있다(동사)가 있다. corpus는 우리말로 말뭉치이다. NLP에서는 자연어처리 관련 애플리케이션에 사용되는 많은 데이터 모음을 코퍼스라고 한다. 어떤 경우에는 코퍼스를 데이터 세트라고도 한다. 대표적인 한국어 포스태거로 KoNLPy(코엔엘파이라고 읽음)가 있다. Cohesion tokenizer를 사용하는데, 이는 KoNLPy처럼 품사 정보까지 반환하지는 않지만 토크나이징을 분석 대상으로 한다. 코퍼스의 출현 빈도를 학습한 결과를 토대로 토큰을 나눠 주기 때문에 분석 품질이 비교적 좋다. Word2vec에 품사 정보까지 넣을 필요는 없기도 하다. 3)토크나이징한 결과물을 파이션 gensim패키지를 활용해 Word2vec 방법론을 적용 from gensim.modelsimport Word2Vec embedding_model= Word2Vec(tokenized_contents, size=100, window = 2, min_count=50, workers=4, iter=100, sg=1) 위 코딩설명: 포스 태깅된 콘텐츠를 100차원의 벡터로 바꿔라. 주변 단어(window)는 앞뒤로 두 개까지 보되, 코퍼스 내 출현 빈도가 50번 미만인 단어는 분석에서 제외해라. CPU는 쿼드코어를 쓰고 100번 반복 학습해라. 분석방법론은 CBOW와 Skip-Gram 중 후자(sg)를 선택해라. 4) 단어 벡터로 가중치 행렬 만들기 (단어 벡터 행렬) 상기 Word2vec의 결괏값은 100차원의 단어 벡터 행렬이다. 행은 각 단어(‘min_count’ 조건을 만족하는 코퍼스 내 모든 단어)가 되고, 열은 V1, V2,…V100까지 벡터값(0.xxxx로 표현)이다. 즉, 100차원 벡터공간의 좌푯값들이다. (단어 벡터 행렬 → 거리행렬(distance matrix)) 이제 다시 앞의 행렬을 거리행렬로 바꿔본다. 거리를 재는 방식은 다양하지만, 일단은 가장 친숙한 유클리디안 방법을 사용해 본다. 직각삼각형의 너비와 높이를 알면 피타고라스 정리로 빗변의 길이를 구할 수 있는 것처럼 100차원 공간 안에 있는 벡터들 사이의 길이를 잰다. 그 결과 단어들이 행과 열에 순서대로 배열되고 행과 열에 같은 순서는 동일 단어로 거리는 0이 되며 가장 먼 거리는 10으로 표기된다. (거리행렬 → 가중치 행렬) 거리행렬을 다시 우리가 알고 싶은 특정 단어와 해당 문장(데이터 세트, 말뭉치)의 관계를 나타내는 가중치 행렬을 구해 보자. 특정 쿼리 단어와 거리가 가까운 단어는 높은 가중치, 그렇지 않은 단어는 낮은 가중치를 가지도록 가중치행렬을 만들어 보자. 이를 우리의 말뭉치 또는 문장에 대해 스코어를 매길 수 있다. 각 말뭉치/문장들 내 단어들과 해당 쿼리 단어와의 가중치를 Lookup 함수 방식을 활용하여 가져온다. 문장에 등장한 단어 하나하나마다 가중치행렬에서 Lookup 형식으로 가중치들을 가져오는 건 계산상 너무 비효율적이다. 이럴 때 단어문서행렬(Term-Document Matrix)를 사용한다. TDM의 행은 ‘단어’, 열은 ‘문서 또는 문장’이 된다. TDM과 가중치행렬을 내적(inner product; 벡터 사이의 거리나 벡터의 크기로 왼쪽 행렬의 행은 쿼리 단어들, 열은 문장의 각 단어이고, 오른쪽 행렬은 n x 1 행렬인데, 이때 n은 각 단어 수가 된다) 해주면 문장별로 스코어를 한 번에 구할 수 있다. 우선 말뭉치에 등장하는 전체 단어 수가 n개이고, 우리가 알고 싶은 쿼리 단어가 있으며, 각 쿼리 단어별 가중치 결괏값을 내적 결과치로 얻을 수 있다. (직접 해 본 코딩인데 좀 어렵게 느껴지기도 하다. 더 심플하게 설명해 주시는 분이 댓글 달아 주세요!)


 
 
 

최근 게시물

전체 보기
회사나 학교 등에서 AI 시스템을 구축할 때 나의 역할

모든 회사원이나 구성원이 직접 AI에 관심을 두고 시작해야 한다. ​ 왜냐하면 첫째로 Business AI는 이제 시작 단계이기 때문이다. 의사 결정이나 전략 수립을 위한 Decision Intelligence도 이제 걸음마 단계이다. 새로운...

 
 
 

Commentaires


bottom of page