본문 바로가기

Enginius/Machine Learning

Latent Dirichlet Allocation (LDA) with Matlab Code

1. 세팅

 1. 우리에게 여러 문서가 주어졌다. 

 2. 문서는 단어의 묶음이다. 

 3. 단어는 특정 단어의 집합(사전)에서 나왔다. 

 4. 문서는 특정 주제(토픽)을 가지고 있다. 

 5. 주제는 문서들 마다 공유된다. 


예를 들어서 생각해보면 우리에게 논문이 세 편 주어졌다고 하자. 조사는 모두 없다고 가정하겠다. 물론 한 논문에 단어는 중복되게 나올 수 있다. 


논문 1

양자 역학, 상대성 이론, 힉스 입자, 강아지, 고양이, 치킨, 상대성 이론, 상대성 이론, 양자 역학


논문 2

치킨, 강아지, 고양이, 비둘기, 비둘기, 강아지, 강아지, 고양이, 햄버거 


논문 3

치킨, 치킨, 치킨, 치킨, 치킨, 치킨, 햄버거, 피자, 치킨


 사실 논문이라고 하기엔 문제가 좀 있긴 하지만 위의 논문들을 보고 우리는 논문1은 물리학에 대한 논문, 논문 2는 동물에 대한 논문, 논문 3은 음식에 대한 논문임을 알 수 있다. 이렇게 물리학, 동물, 음식을 주제(토픽)이라고 부른다. 

 이렇게 알 수 있는 것은 논문에 들어가 있는 단어들이 해당 주제를 표현하고 있음을 우리가 알기 때문이다. 예를 들면 양자 역학, 힉스 입자 등은 당연히 물리학에 포함되는 단어이기 때문이다. 하지만 만약 이러한 사전 정보 없이, 무작정 단어의 뭉치들만 주어졌을 때도 이러한 분류를 하고 싶다면 어떻게 할 것인가? 이 때 사용될 수 있는 알고리즘이 Document Modelling의 대표적 알고리즘은 Latent Dirichlet Allocation (LDA)이다. 


2. Latent Dirichlet Allocation


 복잡한 알고리즘 설명은 생략하고, 시뮬레이션 결과를 보자. 자세한 것은 (http://enginius.tistory.com/394) 포스팅을 참고하도록 하자.. 

먼저 우리에게 다음과 같은 문서들이 주어졌다고 하자. 

이게 무슨 문서냐고 할 수 있겠지만.. 여튼 위의 그림이 의미하는 바는 다음과 같다. 먼저 각 문서는 총 16개의 단어로 이뤄져있다. 각 그림의 한 칸이 의미하는 것이 해당 단어이다. 그리고 색이 의미하는 것은 해당 단어가 몇 번이나 등장했냐는 것이다. 파란색이 짙을 수록 적게 나온 것이고, 초록색이 짙을 수록 많이 나온 것이다. 예를 들어 7번 문서의 경우 (3,4)에 해당하는 단어만 엄청 나온 것을 알 수 있다. 



위의 그림은 주제에 대한 분포를 나타낸다. 즉 해당 주제(토픽)이 어떤 단어들을 가지고 있는지를 나타낸다. 예를 들어 주제1(토픽1)의 경우는 첫 번째에서 네 번째 까지의 단어들만을 가르킨다. 물론 확률이기 때문에 모두 1/4씩의 확률을 갖게된다. 


실험 세팅은 다음과 같다. 우리에게 500개의 문서가 주어졌고, 해당 문서는 각각 100개의 단어로 이뤄져있다. 각 단어는 모두 16개의 단어로 이뤄져있다. 즉 50,000개의 단어가 있는 것이다. 물론 종류는 16가지이다. 이 때 이 문서들을 가지고 비지도학습(!)을 통해서 각 문서가 어느 주제를 갖는지 알아맞추는 일을 해보겠다. 


 


 


 


 

결론 부터(만) 말하면 위와 같이 각 주제를 찾게된다. 위의 그림은 각 iteration마다 어떻게 토픽들이 변해가는지를 나타낸 것이다. 

다시 한번 말하지만 토픽은 단어들에 대한 분포를 의미하고, 우리가 처음 가정한 8개의 토픽과 찾아낸 토픽이 비슷한 양상을 보이는 것을 알 수 있다. 


위의 그림은 각 문서에 대한 토픽의 분포를 나타낸 것인데 빨간색이 데이터를 만들 때 사용한 것이고 파란색이 LDA를 통해서 찾아낸 것이다. 비 지도학습이기 때문에 x축에 해당하는 토픽들의 순서는 무시했을 때 결국 대충 비슷하게 찾아내는 것을 알 수 있다. 


3. Matlab Code


가장 중요한 매트랩 코드이다. 


LDA.zip


물론 내가 처음부터 다 짠건 아니고, 어디 있는 코드에 주석을 열심히 달고, 알아보기 쉽게 바꾼 것이 대부분이다.