최근 1년 간 집중적으로 자연언어처리 기술 중 토픽 모델링을 공부했었는데요, 공부하면서 느꼈던것은 토픽 모델링이 유용하게 쓰일수 있는 기법임에도 사용하려면 코딩이나 스크립트를 짜야해서 진입장벽이 생각보다 높을 것 같다는 것이었습니다.
예시로 자연언어처리로 유명한 Stanford 대학에서 만든 Topic Modeling Toolbox가 있는데 확인해보시면 알겠지만 스크립트를 짜서 텍스트를 전처리하면 이를 토픽 모델에 넣어 시각화를 할수있게 해주는 툴입니다. 생각보다 간단하지는 않죠.
또한 토픽 모델링의 경우 굉장히 다양한 모델이 등장했고, 모델마다 특성이 다르기에 상황에 따라 사용해야할 모델이 다른데, 이 코드들이 다 흩어져 있다(프로그래밍 언어도 제각각입니다. c/java/python은 예사..)는 것이 문제입니다. 모델 간 성능 비교를 하려해도 서로 다른 코드들을 긁어모아서 잘 컴파일하고 실행시켜야 하죠. 그나마 잘 정리되어 있는 Mallet이라는 Java 라이브러리가 있지만 하필이면 자바로 짜여있어서 여러 한계도 있구요.
그래서! 직접 만들어 보았습니다. 처음에는 command line으로 토픽 모델링을 돌릴 수 있는 프로그램을 c++ 기반으로 작성했지만, 그래도 사용하기 어려운거 같아서 GUI 툴을 만들어 개인적으로 사용하던걸 좀더 다듬어서 공개하기로 마음을 먹었습니다! 그 이름하여 Tomoto(Topic Modeling Tool: 무려 아주 아주 존경하는 분이 직접 지어준 이름입니다.)
처음에 프로그램을 실행시키면 위와 같은 모습입니다.
우리는 새로운 분석을 실시할 것이므로 [File]을 눌러 [New Model...]을 선택해줍니다. 이렇게 [New Model...]로 생성한 모델은 나중에 [Open Model...]을 사용하여 다시 열 수도 있습니다.
새 모델 생성 대화상자입니다. 왼쪽에 보시면 [Models]에서 원하는 토픽 모델을 고를 수 있구요 (현재는 LDA, DMR, HDP만 지원하지만 여러 모델을 더 추가할 예정입니다.) [Input Documents]에서 입력 문헌을 고를 수 있습니다. [Use raw text files]를 이용해 날 것의 텍스트 파일을 입력할 수도 있고, 이미 전처리된 파일의 경우 [Use preprocessed file]을 사용하면 됩니다. 저희는 아직 전처리가 안됐으므로 [Use raw text files]를 누를게요.
위와 같이 전처리 대화상자가 뜹니다. 저희가 사용할 입력 파일은
점수 [탭] 제목 [탭] 본문
5 런던 중심가의 위치한 훌륭한 호텔 런던 중심가 최고의 위치...
2 불편하고 지저분한 호텔 객실은 너무 오래되고, 벽 넘어...
와 같이 한 줄에 문헌 1개가 들어가 있고, 필드는 Tab으로 구분되어 있습니다. 이 경우는 [Add TSV Files...]을 사용하여 입력하면 됩니다. 만약 이와 같이 구분된게 아니라 텍스트 파일에 문헌 하나가 다 들어가 있는 경우 [Add Text Files...]나 [Add Text Files In Folder...]를 이용해 일반 txt 파일을 불러올 수 있습니다. 단 파일 인코딩은 반드시 UTF-8로 되어 있어야 합니다!!
전처리는 현재 한국어와 영어만 지원됩니다. 영어의 경우 대소문자가 통합되고 Stemming이 실시되며 기본적인 불용어가 제거되고, 한국어의 경우 형태소 분석이후 조사와 어미 등이 제거됩니다. (사실 개발할때 한국어 형태소 분석기를 붙이기가 난감했는데 다행히도 제가 작년에 개발해둔 형태소 분석기 Kiwi가 있어서 이걸 그대로 재활용했습니다. 성능은 조금 낮지만 편하게 사용할 수 있어서..)
[Suggest Stopwords] 를 체크해두면, 전처리 이후에도 자주 등장하는 단어들을 찾아 불용어로 사용할 것인지 추천해주는 부분이 나타납니다. 유용한 기능이라고 할 수 있죠.
호텔 리뷰를 불러왔더니 다음과 같이 불러오기 도우미 창이 떴습니다. 각 필드가 어떤 역할을 하는지 컴퓨터는 모르므로 위의 콤보박스를 선택해 각 필드의 역할을 알맞게 부여해줍시다.
첫번째 필드는 Metadata1, 두번째~세번째 필드는 Contents를 선택했습니다. Metadata1은 DMR 분석에 있어서 중요한 자질로 쓰이므로 빼먹지 않고 선택하시길 바랍니다.
그러고 나면 [Input Documents]에 입력파일이 잘 들어갔다고 위와 같이 표시됩니다. [Models]에서 DMR을 선택하고 몇가지 파라미터를 설정해볼게요. K(토픽 개수) = 20, α = 0.1, β = 0.01로 두겠습니다.
+ 만약 컴퓨터에 좋은 그래픽 카드가 달려있고, 드라이버도 잘 설치되어 있다면 OpenCL 가속을 사용할 수 있습니다. [OpenCL Acceleration] 부분에서 사용할 장치를 고르시면 되는데 (학습 과정이 최대 10배 이상 빨라질 수도 있습니다.) 본 예제에서는 사용하지 않기로 해요. 수치를 다 입력했다면 [Train Model]을 눌러 모델을 저장합시다.
파일 이름을 적당히 지으시고 [저장]!
전처리가 쭈루룩 진행됩니다. 텍스트가 너무 길지 않으면 금방 끝납니다.
불용어 제안 대화상자가 뜹니다. 전체 17000여개의 문헌중에서 좋/VA는 9261개의 문헌에서, 호텔/NNG는 8954개의 문헌에서 등장했다네요. 이렇게 너무 흔하게 등장하는 단어는 전체 분석 성능을 낮추므로 [Add these into stopwords]를 눌러서 이 단어들을 제거해줍니다.
그럼 이제는 토픽 모델링 타임입니다! 진행 메세지가 뜨면서 Training이 진행됩니다.
끝나고 나면 위와 같이 iteration에 따른 Perplexity 그래프가 뜨면서 학습이 잘 진행되었는지를 보여줍니다. iteration이 증가함에 따라 Perplexity가 계속 줄어들다가 특정 수치에 수렴한것으로 보이므로 모델이 잘 학습되었다고 볼 수 있겠네요.
[Topic Result] 탭을 눌러봅시다. K = 20개로 설정했으니 총 20개의 토픽이 뜨는데 각 토픽들에 어떤 단어가 분포하는지 쉽게 보여줍니다. 그리고 상위 단어를 바탕으로 라벨도 자동적으로 적당히 붙여줍니다. (#0 and, hotel, good을 보니깐 텍스트 내에 영어가 섞여 있었나 보네요. 분명 한국어 리뷰만 모아뒀었는데...)
[Document Result] 탭을 눌러봅시다. 학습에 사용된 문헌들이 나타나구요, 해당 문헌들이 어떤 토픽을 담고 있는지 개략적으로 보여줍니다.
[Contents] 탭을 누르면 실제 Raw Text도 볼 수 있습니다. 어떤 단어가 어느 토픽에 배정되었는지도 확인 가능하구요.
좌상단의 필터링 도구를 이용해서 특정 토픽을 많이 담고 있는 텍스트를 골라낼 수 있어요. #18 수영장, 아이를 0.5 이상 담고있는 문헌만 골라내 보았습니다.
또한 DMR 모델에서는 [Parameter Result]도 볼 수 있습니다. 아까 전처리 시에 부여한 Metadata1이 기억나시죠? 호텔 리뷰에 붙어있던 점수를 Metadata로 주었기에 호텔 리뷰 점수에 따른 주제 분포의 차이도 볼 수 있습니다. [Topic By Metadata] 부분에서는 해당 토픽이 어떤 점수에서 자주 등장했는지를 볼 수 있습니다. #13 최고, 위치라는 토픽은 예상대로 5점에서 가장 많이 등장했네요.
혹은 [Metadata By Topic]을 선택하여 각 점수에서 어떤 주제가 많이 등장했는지를 볼수도 있습니다. 5점인 문헌들에 어떤 주제가 등장하는지를 살펴보았는데, 보시다시피 #17 위치, 만족, 친절이라는 주제가 약 42%로 가장 큰 비중을 차지하고 있음을 알 수 있습니다. 리뷰 5점을 받는 호텔이 되려면 위치와 직원들의 친절이 중요한 요소라고 볼 수 있겠네요.
AdaGram : 동음이의어를 구분하는 Word2Vec (1) | 2018.09.23 |
---|---|
Word2Vec을 이용한 한국어 관련어 네트워크 보기 (0) | 2018.09.17 |
Kneser-Ney 언어 모형을 활용한 한국어 초성체 해석기 개발 (0) | 2018.06.17 |
[토픽 모델링] 깁스 샘플링의 병렬화 & GPU 위에서 돌리기 (3) | 2018.02.20 |
[Python] 3변수 상호정보량을 활용한 연어 추출 코드 (3) | 2018.01.30 |
[Kiwi] 지능형 한국어 형태소 분석기 GUI 버전 (32) | 2017.10.31 |
댓글 영역