[토픽 모델링] hLDA(Hierarchical LDA) 실험

Posted by 적분 ∫2tdt=t²+c
2017.07.23 02:25 그냥 공부

요즘 계속 토픽 모델링 쪽으로 공부를 해보고 있는데요, 앞서 다뤘던 LDA, DMR, HDP-LDA 같은 모델은 모두 각각의 주제가 독립적이라 가정하고, 단일 수준에 모든 주제들을 배치했었습니다. 이번에 살펴보는 hLDA(Hierarchical LDA)는 주제를 계층적으로 찾아서, 최상위 주제 아래 하위 주제 여러 개를 배치할 수 있게 해줍니다. 배경이 되는 수학 이론이 생각보다 까다로워서 아직 완벽하게 이해는 하지 못했구요, 샘플 코드를 가지고 요리조리 실험을 해본 결과를 간단하게 살펴보는 시간을 가지려고 합니다.



주제는 서로 독립이 아니다

LDA와 같은 토픽 모델링은 문헌 집합 내의 주제를 발견하는데에 큰 도움을 주지만, 아쉽게도 어떤 주제끼리 서로 연관이 있는지를 밝혀주지는 못합니다. 예를 들어 정치라는 주제는 해외 정치, 국내 정치 등으로 나눠질 수도 있습니다. 해외 정치와 국내 정치는 서로 다른 주제이지만, 굉장히 유사한 부분을 가지고 있겠죠. LDA를 사용할 경우 여러 문헌들을 정치라는 주제로 뭉뜽그려 버리거나, 문헌들을 해외 정치, 국내 정치로 나누더라도 두 주제가 연관이 있는지를 밝혀줄 수는 없죠. 사실 이 문제는 토픽 모델링 분야에서 생각보다 중요한 문제였습니다. LDA의 경우 주제 개수 K, HDP-LDA의 경우 집중 파라미터 α를 어떻게 잡느냐에 따라서 추출되는 주제의 개수가 달라지는데, 이에 따라 유사한 주제들이 하나로 뭉뚱그려지거나 서로 다른 주제가 합쳐지는 일이 발생하기 때문에 주제의 구조를 파악할 수 없기 때문이죠. Blei, D. M., Griffiths, T. L., & Jordan, M. I. (2010). The nested chinese restaurant process and bayesian nonparametric inference of topic hierarchies. Journal of the ACM (JACM)57(2), 7. 의 논문에서는 중첩된 중국집 프로세스를 통해 이 문제를 해결하는 토픽 모델링 기법을 제시했습니다.


중첩된 중국집 프로세스(nested Chinese Restaurant Process)

중국집 프로세스는 [그냥 공부] - [토픽 모델링] HDP와 토픽 모델링 포스팅에서 잘 설명했으니 다시 설명하지 않고 넘어가도록 하겠습니다. HDP에서는 중국집을 본사-체인점 2계층으로 나누어 본사에서 각 체인점(문헌)의 식탁(단어 클러스터)들에게 음식(주제)을 배분해주도록 하여 임의 개수의 주제에 대해 토픽 모델링을 수행하게 했습니다. 

중첩된 중국집 프로세스에서는 2계층이 아니라 무한한 계층의 중국집을 가정합니다. 최상위 계층에는 중국집 1개가 있고, 이 중국집에서 밥은 먹은 사람들이 갈수 있는 두번째 계층의 중국집들이 있습니다. 마찬가지로 두번째 계층에서 밥을 먹는 사람들은 세번째 계층의 중국집으로 갈 수 있고 이렇게 n번째 계층의 중국집까지 사람들은 계속 식사 투어를 하게 되는거죠.

단 이때 중국집의 계층 구조는 트리형태를 따릅니다. 반드시 중국집은 n번째 계층에서 n+1번째 계층으로 연결되어 있고, 한 중국집은 하나의 부모 계층만을 가집니다. 즉 상위 계층 두 군데에서 오는 손님을 받을 수는 없어요. 아래 그림처럼 말이죠

(출처) Blei, D. M., Griffiths, T. L., & Jordan, M. I. (2010). The nested chinese restaurant process and bayesian nonparametric inference of topic hierarchies. Journal of the ACM (JACM), 57(2), 7.


여기서 각 계층의 중국집은 주제를 뜻합니다. 그리고 중국집에서 식사를 하며 다니는 사람은 하나의 문헌을 뜻하구요, 즉 각 문헌은 각 계층마다 하나의 중국집을 지나게 되죠. 그 결과 n개의 계층을 통과하는 경로가 생기고, 이 경로가 해당 문헌의 주제 경로가 되겠죠.


이 과정은 다음과 같이 정리될 수 있습니다.

(출처) Blei, D. M., Griffiths, T. L., & Jordan, M. I. (2010). The nested chinese restaurant process and bayesian nonparametric inference of topic hierarchies. Journal of the ACM (JACM), 57(2), 7.

여기서 크게 4개의 파라미터가 등장합니다. η와 γ, 그리고 m과 π입니다. m과 π는 GEM 분포의 파라미터인데 아직 GEM 분포를 정확하게 이해 못해서 생략... 대게 0.5, 100으로 설정한답니다.

η는 주제에 포함되는 어휘를 결정하는 파라미터입니다. 이 값이 작을수록 한 주제에 적은 어휘가 포함되고(즉 많은 주제가 생성되고), 클수록 한 주제에 많은 어휘가 포함됩니다(즉, 적은 주제가 생성됩니다). γ는 nCRP의 파리미터인데 한 중국집에서 갈수 있는 다음 중국집가 어느 정도가 될지를 정합니다. 이 값이 클 수록 한 중국집 아래에 더 많은 중국집이 생성되고, 작을때는 반대가 되겠죠?

아주 흥미로운 토픽 모델링 기법이어서 실제로 논문에서 제시하는 것처럼 결과가 잘 나올지 궁금해졌습니다. 그래서 제가 가지고 있는 데이터를 가지고 실험해보기로 했습니다.


실험을 돌려보자

파이썬에서 간단하게 사용할 수 있는 라이브러리가 있으면 좋을테지만 찾아보니 없는듯하고, 대신 저자가 c로 작성한 샘플 코드가 github에 공유되어 있습니다. https://github.com/blei-lab/hlda  코드가 어렵지는 않으니 관심있는 분은 살펴보시는 것도 좋을듯합니다. 불행히도 제 Windows 10과 Visual Studio에서는 컴파일되지가 않기에 약간 수정하여 사용했습니다.

실험에 사용한 데이터는 저번에 프로젝트 때문에 수집해둔 2016년 1년간 정치/사회 분야 신문기사 약 15만 건이고 형태소 분석은 하되 불용어 제거는 하지 않은채로 hLDA를 실시했습니다. 파라미터는 다음과 같이 설정했습니다.


DEPTH 5

ETA 2.0 1.0 0.5 0.25 0.125

GAM 1.0 1.0 1.0 1.0

GEM_MEAN 0.5

GEM_SCALE 100

SCALING_SHAPE 1.0

SCALING_SCALE 0.5

SAMPLE_ETA 1

SAMPLE_GEM 1


깊이는 5단계. η값은 1계층에서는 크게 해서 한 주제에 많은 단어들이 뭉치게 했고, 5계층으로 갈수록 한 주제에 적은 단어들이 뭉치게 했습니다. γ값은 그냥 다 1로. 그리고 SAMPLE_ETA 및 SAMPLE_GEM을 On하여서 매 반복시마다 새롭게 최적의 η 파라미터와 GEM 파라미터를 계산하도록 했습니다. 문헌 집합이 크다보니 (그리고 원체 hLDA가 계산량이 많다보니) 이틀 가까이 돌렸습니다. (147회 반복하고 종료시켰어요...) 실행 후 조절된 파라미터는 아래와 같습니다.

SCORE -1.599e+08

ITER 147

ETA        0.1311 0.6433 0.9471 1.3465 1.4543

GAMMA      1.0 1.0 1.0 1.0

GEM_MEAN 0.4128

GEM_SCALE 0.4888


약 700여개의 주제가 등장했는데요, 포함된 단어의 수가 너무 적은 것들은 추리고 나니 92개의 주제가 남았습니다.

결과는 어떻게 나왔을까요?


먼저 제일 최상위 계층에는 다음 단어들이 등장했습니다.


하다, 있다, 되다, 대하다, 없다, 대통령, 보다, 의원, 국민 ...

가장 상위 계층이니 모든 신문기사에 두루 쓰이는 단어들(대체로 불용어겠죠)이 등장했습니다. 그 아래계층은 8개가 나왔습니다. 8개의 주제와 그 주제의 하위 주제들이 어떤 것이 나왔는지 도표로 정리해보았어요.


8개중 첫번째 주제는 국회 및 정치 전반에 대한 내용인듯합니다. 하위 주제로는 위와 같은것들이 나왔습니다.

두번째는 대선 후보에 관한 내용입니다. 엉뚱하게도 그 하위 주제로 등장한 국회 총선 관련 주제 아래에는 일본과 관련된 주제들이 등장하네요. 아마 국회 총선 주제 문헌에 일본 관련 언급이 있었고, 그래서 그 어휘들이 국회 총선 아래에서 두 분류로 갈려서 나타나는 듯합니다.

세번째는 대북 문제 관련입니다. 좀 거칠긴 하지만 잘못된건 없어보입니다.

네번째는 특검 수사 관련 주제입니다.

다섯번째는 개혁 관련 주제인데, 해석하기가 난해하군요.

여섯번째는 좀 우습네요. 정당 내 선거에 관한 주제인듯한데, 더민주 경선에서 경쟁과 관련된 어휘가 많이 언급되어 그런지, 리우 올림픽을 그 아래에 분류해버렸네요... (경쟁이라는 측면에서보면...)

일곱번째입니다. 이 부분은 갈길이 좀 멀어보이네요. iteration을 더 반복해야 좋은 결과가 나올거 같습니다.

마지막 여덟번째입니다. 지역 사회와 관련된 하위 주제는 왼쪽 하나밖에 없는거 같군요.


정리

보다시피 계층적으로 주제 분류가 되기는 합니다...만 파라미터 설정을 잘하고 iteration을 오래 돌려야 제대로 된 결과가 나올 것 같습니다. 좀 사용하기에 어려운 기법이지만 나름대로 쓸만한 곳이 있을 것 같네요. 계층적으로 분류가 필요한 분야 (택소노미 자동 구축이라던지 자동 분류 등)에서 사용하기에 좋지 않을까 싶어요. 문제는 계층이 늘어날 수록 처리속도가 정말 기하급수적으로 늘어난다는 것인데, 아마 이 문제 때문에 대량의 데이터를 대상으로는 널리 쓰이지 못하고 있는듯합니다.

저작자 표시 비영리 동일 조건 변경 허락
신고
이 댓글을 비밀 댓글로
    • 2017.08.29 00:07
    비밀댓글입니다
    • 리눅스를 쓰시면 github에 있는 코드 그대로 사용하실수 있구요, 윈도우를 쓰시면 조금 수정해야합니다.
      어느 부분 수정했는지가 궁금하신거죠?
    • bazzy123
    • 2017.09.04 17:30 신고
    윈도우사용하고있습니다. 수정본좀 볼수있을까요..?