Word embedding 은 단어의 의미정보를 벡터에 잘 반영함으로써 다양한 자연어처리 문제의 성능을 향상시켰습니다. Word2Vec 은 대표적인 word embedding 방법으로, Word2Vec 의 학습 과정에 대해서는 잘 알려져 있습니다. 이 포스트에서는 학습 방법을 넘어 Word2Vec 이 학습한 벡터 공간 자체를 살펴봅니다. 고차원 공간에 각 정보들이 어떤 형식으로 저장되어 있는지 알아봄으로써, word embedding 공간에 대한 이해를 높입니다. 이 포스트에는 All-but-the-top: simple and effective postprocessing for word representations (ICLR 2018) 의 리뷰 일부와 open questions 이 포함되어 있습니다.
Word Piece Model (a.k.a sentencepiece)
토크나이징 (tokenizing) 은 문장을 토큰으로 나누는 과정입니다. 텍스트 데이터를 학습한 모델의 크기는 단어의 개수에 영향을 받습니다. 특히 Google neural machine translator (GNMT) 와 같은 Recurrent Neural Network (RNN) 기반 알고리즘들은 단어 개수에 비례하여 계산비용이 증가합니다. 그렇기 때문에 RNN 에 이용되는 vocabulary, word embedding 벡터의 종류가 제한됩니다. 하지만 vocabulary 의 개수가 제한되면 임베딩 벡터로 표현하지 못하는 단어가 생깁니다. 이 역시 미등록단어 문제입니다. RNN 기반 모델에서 이를 해결하기 위하여 Word Piece Model (WPM) 이 제안되었습니다. 단어를 한정적인 유닛 (finite subword units) 으로 표현합니다. WPM 은 언어에 상관없이 모두 적용할 수 있기 때문에 적용할 언어마다 해당 언어의 특징을 반영한 토크나이저를 만들지 않아도 됩니다. 그러나 모든 데이터 분석에 적합한 것은 아닙니다. WPM 이 유용할 수 있는 상황과 그렇지 않은 상황에 대해서 알아봅니다.
Left-side substring tokenizer, the simplest tokenizer.
토크나이징 (tokenizing) 은 문장을 토큰으로 나누는 과정입니다. 토큰의 정의는 분석의 목적에 따라 어절, 단어, 형태소가 될 수 있습니다. 토크나이징이 된 결과는 term frequency matrix 혹은 doc2vec 과 같은 형식의 벡터로 데이터를 표현하는데 이용됩니다. 트렌드 분석, 키워드 추출에서는 미등록단어 문제를 반드시 풀어야 합니다. 미등록단어들이 트렌드의 키워드일 가능성이 높기 때문입니다. 그러나 문서 판별, 감정 분류, 번역과 같은 문제를 풀 때는 토크나이저가 반드시 제대로 된 단어를 인식할 필요는 없습니다. 분석의 대상이 단어가 아닌 문장이나 문서이기 때문에 질 좋은 벡터만 만들어지면 됩니다. 단어를 제대로 인식할 필요가 없는 경우에 쓸만한 토크나이저에 대하여 이야기합니다.
Part of speech tagging, Tokenization, and Out of vocabulary problem
텍스트 데이터 분석을 위하여 우리는 문장을 단어나 토큰으로 분리합니다. 텍스트 분석의 단위는 단어, 구문, 문장, 문서가 될 수 있습니다. 문서/문장은 분리된 토큰을 이용하여 tf 나 tfidf 와 같은 one hot representation 과 doc2vec 과 같은 distributed representation 의 벡터로 표현합니다. 연관어 분석이나 토픽모델링은 문장에서 나뉘어진 단어의 co-occurrence 정보를 이용합니다. 이들은 모두 모두 문장을 단어나 토큰으로 잘 분리되었다고 가정합니다. 여기서 잘 분리된 토큰은 분석의 대상과 목적에 따라 정의가 다릅니다. 이번 포스트에서는 한국어 텍스트 데이터를 단어나 토큰으로 만드는 과정에 대하여 논의합니다. 미등록단어 (out of vocabulary) 문제의 원인과 해결 방향에 대해 이야기합니다.
Python plotting kit Bokeh
Python 에서 chart, plot 을 그리는 도구로 널리 알려진 것들 중에는 matplotlib, seaborn, plotly, ggplot 등이 있습니다. 그 중에서 Bokeh 는 Python 혹은 Jupyter notebook 환경에서 d3 만큼이나 멋진 plot 을 그릴 수 있도록 도와줍니다. Bokeh 의 documentation 과 tutorials 은 설명이 매우 친절합니다. 하지만 quick starting 보다 더 quick 하게 이용하고 싶어, 자주 쓰는 기능과 설명을 정리하였습니다. 이 포스트에는 각 라이브러리의 비교가 포함되어있지 않습니다.
Random Projection and Locality Sensitive Hashing
k-nearest neighbor (k-NN) 문제는 모든 query 와 reference data 의 모든 점들 간의 거리를 계산하기 때문에 많은 거리 계산 비용과 정렬 비용이 든다고 알려져 있습니다. 하지만 approximated nearest neighbor search (ANNS) 방법들은 아주 조금 정확하지 않더라도 매우 빠르게 nearest neighbors 를 찾습니다. Locality Sensitive Hashing (LSH) 는 hashing 기반 방법으로, 가장 널리 이용되는 ANNS 입니다. 더 이상 k-NN 은 비싼 알고리즘이 아닙니다.
Word / Document embedding (Word2Vec / Doc2Vec)
Word2Vec 은 비슷한 문맥을 지니는 단어를 비슷한 벡터로 표현하는 distributed word representation 방법입니다. 또한 word2vec 은 embedding 의 원리에 대하여 이해할 수 있는 아주 좋은 주제이기도 합니다. 이 방법을 확장하면 Doc2Vec 같은 문서의 distributed representation 도 학습할 수 있습니다.
From text to term frequency matrix (KoNLPy)
텍스트마이닝을 수행하기 위해서는 텍스트 형식의 데이터를 머신러닝 알고리즘이 이해할 수 있는 벡터 형식으로 변환해야 합니다. 문서를 벡터로 표현하는 방식은 크게 두 가지로 나뉘어집니다. One hot representation 혹은 Bag of words model 로 불리는 방법은 한 문서 에 단어 의 등장횟수 (혹은 중요도)로 weight 를 표현하는 term frequency vector 로 문서를 표현합니다. KoNLPy 를 이용하여 한국어 텍스트 문서를 term frequency matrix 로 변환하는 과정에 대하여 알아봅니다.
Logistic regression with L1, L2 regularization and keyword extraction
Logistic regression 은 feature X 와 클래스 Y 간의 관계인 클래스의 대표벡터를 coefficients 에 학습합니다. 대표벡터 (coefficient) 를 구성하는 값 들은 j 번째 feature, 와 클래스 k 와의 상관성입니다. 때로는 coefficients vector 가 sparse vector 가 되도록 유도함으로써 classification 에 중요한 몇 개의 features 만을 이용하도록 강제할 수 있습니다. 이를 L1 regularization 혹은 LASSO model 이라 부릅니다. LASSO 는 feature selection 의 역할을 합니다. 그리고 이를 응용하여 keyword extraction 을 할 수 있습니다.
Logitsic regression and Softmax regression for document classification
Logistic regression 은 binary classification 에 널리 이용되는 방법입니다. 이에 대한 기하학적인 의미를 알아봅니다. 또한 클래스가 3 개 이상일 경우의 일반화된 logistic regression 인 Softmax regression 으로 의미를 확장해봅니다. Softmax regression 을 이해하면 Word2Vec 과 같은 word embedding, representation learning 의 원리를 이해할 수 있습니다.