1. 임베딩의 정의
컴퓨터는 인간이 사용하는 자연어(Natural Language)를 있는 그대로 이해할 수 없다. 따라서, 우리는 컴퓨터가 글자데이터를 분석할 수 있도록, 글자를 숫자형 데이터로 변형하여 전달해야 한다.
기계가 이해할 수 있는 숫자의 배열은 벡터라고도 하기 때문에, 일반적으로 문자를 숫자로 변환하는 과정을 '벡터화한다' 혹은 '워드를 임베딩한다'라고 말한다.
임베딩의 형태는 크게 두가지가 있다.
1) 희소표현 (Sparse Representation Matrix)
One-Hot encoding을 통해, 코퍼스에 사용된 단어에 인덱스번호를 부여하고 해당 단어를 인덱스값으로 치환하는 방식이다. 즉, 10000개의 단어가 있다면 벡터는 10000차원의 데이터가 된다.
ex) 코퍼스의 사이즈가 10이고, '자연어'라는 단어가 3번, '처리'라는 단어가 5번이라면 '자연어 처리'는 다음과 같이 치환된다.
[ [ 0 0 1 0 0 0 0 0 0 0 ] ,
[ 0 0 0 0 1 0 0 0 0 0] ]
이러한 희소 표현은 단어의 개수가 늘어나는 만큼 벡터의 차원이 한없이 커진다는 문제점이 있다. 만약, 코퍼스의 단어가 10,000개라면 벡터의 차원은 10,000차원이다. 그리고 단어에 해당되는 부분만 1이고, 나머지는 9999개는 0이라는 무의미한 값을 가지게 된다. 이러한 임베딩 방식은 공간적 낭비가 극심하다. 또한, 그냥 단어가 인덱스값으로 변환된 것이기 때문에, 원-핫 벡터는 해당 단어의 의미를 담지 못한다는 단점을 갖는다.
2) 밀집행렬 (Dense RepresentationMatrix)
Google에서 2013년 발표한 word2vec으로 인해 등장한 개념이다. 기존에는 희소행렬로 표현하는 것이 당연하다고 생각했지만, 이러한 편견은 word2vec의 등장과 함께 깨지게 됐다.
밀집 표현은 벡터의 차원을 단어 집합의 크기로 정하지 않고, 사용자가 설정한 값에 맞춰서 벡터의 차원을 맞춘다. 단어들은 차원축소과정을 거쳐 중요한 기준에 따라 새롭게 표현된다.
만약에 위의 예시를 10차원으로 표현하기로 정하면 다음과 같아진다.
ex) 자연어 = [ 1.4 -0.3 2.2 -1.3 3.0 2.8 -3.0 -2.1 -0.4 0.8 ]
즉, 코퍼스의 단어가 10000개일지라도, 내가 차원을 300으로 지정한다면 모든 단어들은 300차원의 임베딩 벡터값으로 전환된다. 또한, 이 과정에서 더 이상 0과 1만 가진 값이 아니라 실수 값을 가지게 된다.
2. 임베딩의 의의
단어를 밀집표현하는 방식이 등장하면서, 임베딩은 다양한 의미와 역할을 가질 수 있게 되었다.
<1> 단어간의 유사도 계산
밀집행렬은 코사인 유사도를 계산할 수 있다. 코사인 유사도는 두 벡터(단어)의 방향이 얼마나 다른지를 계산해서 1에 가까울 수록 유사도가 높다고 판단하는 방식이다.
코사인 유사도에 관해서는 다음 링크를 참고하자.
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
<2> 단어간의 사칙연산이 가능.
워드 임베딩을 거친 벡터들은 사칙연산이 가능하다.
즉, 단어 간의 덧셈과 뺄셈을 통해 단어 사이의 의미적, 문법적 관계를 구할 수 있다.
ex) King - Man + Woman = Queen
ex) Korea - Seoul + Beijing = China
Korea-Seoul은 00을 수도로 하는 국가라는 의미적 벡터값을 계산하며, Beijing을 더해준다면 베이징을 수도로 하는 국가인 중국을 구할 수 있다.
<3> 다양한 모델에서 사용가능
Word2Vec 이나 FastText, Bert 등의 임베딩 모델에서 나온 워드 임베딩 값들은 어느 모형에서나 사용이 가능하다.
Seq2Seq인 기계번역이나 Word분석인 NER(Named Entity Recognition)과 같은 다양한 과제에서 사용해도 강력한 성능을 보여준다.
(기존의 희소행렬로 표현된 방식과 성능을 비교하면 천지차이이다.)
3. 향후 과제
현재 NLP분야는 구글이 주도를 하고 있기 때문에, 영어 분석이 BaseLine이다.
한국은 구글이 발표하는 모델을 간신히 따라가고 있는 상황.
하지만, 최신 모델들은 모두 영어에 최적화된 모델이다보니, 한국어를 분석하는 프로젝트의 정확도가 비교적 낮은 편이다.
또한, 한국어는 한국어의 특성 상 많은 조사와 형태소를 분석해야한다는 문제점이 있어 더욱 어렵다.
'Python > NLP(자연어처리)' 카테고리의 다른 글
4. 텍스트 전처리(정규화) (0) | 2020.09.04 |
---|---|
3. khaiii 설치 및 사용법 (0) | 2020.09.03 |
2. konlpy 사용법 (0) | 2020.09.02 |
BeautifulSoup4를 사용한 간단한 크롤러 만들기 (0) | 2020.04.15 |