[토픽 모델링] LDA에 용어 가중치를 적용하기

Posted by 적분 ∫2tdt=t²+c
2018.06.26 18:19 그냥 공부

지금까지 다양한 토픽 모델링 기법들을 살펴보았는데요, 곰곰히 생각해보면 여태까지 다룬 모든 토픽 모델들은 다 각각의 단어를 동등하게 보았습니다. the나 topic이나 model이나 project나 어떤 단어이던간에 순서나 위치에 상관없이 문헌 속에 몇 번 등장했느냐만을 고려했기 때문이지요. bag-of-words 모형이라고 하는데 이는 결국 모든 단어를 그 등장횟수로만 판단하겠다는 간결한 가정입니다. 그런데 말입니다, 과연 모든 단어를 동등하게 보는것이 맞을까요?


간단히 생각해봐도 the와 topic이라는 단어는 동등하게 볼 수 없을것 같습니다. the는 어디서나 쓰이는 흔한 단어라서 아무런 의미가 없고반면 topic은 주제를 드러내는데 도움이 되니까요. 그래서 LDA와 같은 토픽 모델의 성능을 높이기 위해서는 불용어를 잘 선정하는 것이 중요합니다. (물론 이는 다른 어떤 자연언어처리 기법에도 전부 해당하는 말이지만요). 좀만 더 생각해보면 단순히 모든 단어를 불용어와 불용어가 아닌, 이분법적으로 나누는것도 불완전한 방식입니다. 불용어처럼 완전 의미가 없는 경우도 있을테고, 어느 정도 의미는 있지만 그 의미가 크지 않은 경우도 있을테고, 주제를 완전히 잘 드러내는 단어도 있을테니깐요. 즉, 단어의 상대적 중요성을 반영할 수 있으면 이런 문제를 해결할 수 있을것 같습니다. 이런 아이디어에서 등장한 기법이 용어 가중치를 적용한 LDA 기법입니다.


Wilson, A. T., & Chew, P. A. (2010, June). Term weighting schemes for latent dirichlet allocation. In human language technologies: The 2010 annual conference of the North American Chapter of the Association for Computational Linguistics (pp. 465-473). Association for Computational Linguistics.


본 포스팅은 위의 논문을 바탕으로 쓰여졌으니, 자세한 정보가 필요하신 분들은 위 논문을 참고하시길 바랍니다.


LDA를 확장하자

전의 포스팅에서 설명했다시피 LDA의 깁스 샘플링식은 다음과 같이 계산됩니다.


이때 m은 현재 단어의 번호이고, d는 문헌의 번호, j는 토픽의 번호입니다. C_mj는 토픽 j에 할당된 단어 m의 개수, C_dj는 문헌 d에서 토픽 j에 할당된 단어의 개수이구요. α, β는 디리클레 분포의 하이퍼 파라미터라고 했었지요. 딱 보면 감이 오시겠지만, 이 모델에서는 오직 단어의 개수만 세고 있습니다. 즉 모든 단어를 동등하게 보고 있죠. 이제 여기에 단어의 가중치를 도입해봅시다. 단어 m의 가중치를 W_m이라고 표현하면 식은 다음과 같이 확장할 수 있겠습니다.


좌항은 단어m에 관해 이미 정리되어있었기에 깔끔하게 W_m을 곱함으로써 확장이 가능했지만, 우항은 단어별로 풀어서 써주느라고 시그마가 하나씩 더 붙었네요. 식이 조금 지저분해졌지만 기본 원리는 LDA와 같습니다. 다만 단순히 단어의 개수만 보는것이 아니라 단어마다 가중치를 부여하여 가중치의 총합을 가지고 확률을 계산하는 것이죠. W_m = 1이 된다면 이 식은 기본적은 LDA와 동일해진다는 것을 쉽게 알아 차리실 수 있을 겁니다.


가중치로 무엇을 넣을것인가

가장 간단한 것은 가중치에 0 또는 1로 이진값을 넣는 것입니다. 이렇게 되면 가중치가 0이 들어간 단어는 아예 영향을 주지 못하므로 실제로는 무시하는 것과 동일해집니다. 즉 불용어처리가 되는 것이죠. 따라서 불용어에 0, 불용어가 아닌 단어에 1을 부여하는 가중치 부여방식은 기존의 불용어를 제거하고 돌리는 LDA와 완전 동일한 모형이 된다는 것을 알 수 있습니다.


정보량(혹은 idf)

정보량을 넣는것도 좋은 방법입니다. 정보량은 해당 사건이 발생한 확률의 역수에 로그를 취한 값입니다.

여기서 사건은 해당 단어가 출현하는 것이므로, 해당 단어가 출현하는 문헌의 수를 df, 전체 문헌의 수를 N이라고 하면 위와 같이 다시 쓸수도 있습니다. 잘 보시면 이는 정보 검색에서 흔히 사용하는 idf 공식과 동일하죠. 검증된 가중치 식이라고 할 수 있겠습니다.


점별 상호정보량(PMI)

꼭 문헌별로 가중치가 동일해야 할 필요는 없습니다. 같은 단어라도 문헌에 따라 다른 가중치를 부여하는 것도 상황에 따라 좋을 수 있습니다. 예를 들어 대게의 문헌에서는 the가 흔히 쓰이기에 그냥 불용어처럼 보일수 있을지라도, 종종 the라는 단어에 관한 이야기를 하는 문헌이 있을수도 있죠. 이 경우 이 문헌에서는 the가 불용어가 아니라 주제어일 것입니다. 이런 경우를 가려내기 위해 저자는 PMI를 사용하는 방법도 제안하였습니다. 문헌이 출현할 확률과 단어가 출현할 확률의 PMI를 계산해 둘 간의 관계성을 본 것이죠.


복잡한 식이지만 결국 이 경우 PMI는 문헌 d내의 단어 m의 개수(C_md)에 전체 단어의 개수 C를 곱하고, 문헌 d의 전체 단어의 개수(C_d)와 단어 m의 전체 개수(C_m)로 나눠준것에 로그를 씌우면 됩니다.


만약 특정 문헌에 특정 단어가 집중적으로 분포할 경우 그 문헌과 단어의 PMI는 높아집니다. 반면 둘이 아예 상관이 없으면 PMI는 0이 되고, 혹여나 특정 문헌이 특정 단어를 피한다면 음의 PMI값이 나올 겁니다. 대게 음수가 나오는 경우는 많지 않지만 음의 값을 가중치로 쓸수 없으니 저자는 음수는 0으로 잘라냈다고 합니다. (음수가 나오는 경우는 전부 소위 말하는 불용어인것으로 확인되었다고 합니다)


성능은?

평가 방식이 조금 특이한데, 교차 언어 검색 실험을 실시하여 정확도를 평가했다고 합니다. tokenization을 단어 단위로 실시하였을 경우, 기존의 LDA가 0.505의 성능을 보인것에 비해 IDF를 이용한 경우 0.616, PMI를 이용한 경우 0.612를 보였고, 형태소 단위로 했을 경우 LDA가 0.544, IDF가 0.641, PMI가 0.686을 보여서 기존의 LDA보다 높은 성능을 보인것을 확인하였다고 합니다.


복잡한 방법 없이 용어의 가중치를 도입하는 것만으로도 20%에 가까운 성능 향상을 보인것은 고무적입니다. 다만 기존의 LDA는 별도로 불용어 제거를 한것으로 보이지는 않아서, 공정한 비교라고 보기는 조금 어려울 것 같습니다. 단 정확하게 불용어가 주어지지 않는 미상의 언어를 가지고 분석을 한다던지, 텍스트의 성격상 불용어가 일반적인 텍스트와 다른 경우 등, 불용어를 정확하게 파악하기 어려운 경우 유용할 것으로 보입니다.


+

실은 처음 LDA를 공부하고 난 뒤 들었던 생각이 이와 거의 유사했는데, 약간 방향이 달랐습니다. 그 당시에는 용어별로 가중치를 매기기보다는 중요 문헌과 비중요 문헌을 나눠 가중치를 매기고, 단어의 출현 위치(제목인지 초록인지 서론인지 등)에 따라 가중치를 다르게 주는 식으로 실험을 진행했었는데 유의미한 차이는 발견하지 못했었거든요. 역시 이미 연구될 건 거의 연구되었다는 말이 사실이긴한가 봅니다.

이 댓글을 비밀 댓글로
    • 2018.07.30 18:48
    비밀댓글입니다
    • 제가 실험을 돌린 것은 아니라서 코드를 작성하지는 않았구요, 코드를 짜셔야한다면 기존의 LDA가 구현된 코드를 가져다가 word counting하는 부분을 가중치를 반영하도록 수정하시면 될듯합니다.

      그리고 word2vec에 LDA를 접목하시려면 이 모델보다는 Gaussian LDA라는 모델이 더 적합하다고 생각합니다. 해당 모델에 대해서는 https://github.com/rajarshd/Gaussian_LDA 에 코드가 공개되어 있으니 이를 참고하심을 추천드립니다.
    • 김선미
    • 2018.08.02 15:33 신고
    우와... 정말 친절한 답변 감사합니다!!!