들어가며
안녕하세요. AI Services Lab 팀의 ML 엔지니어 박희웅입니다. 저희 팀에서는 LINE 오픈챗과 관련해 다양한 AI/ML 모델을 개발해 서빙하고 있는데요. 지난 오프라인과 온라인 A/B 테스트를 통해 오픈챗 추천 모델 개선하기 포스트에서는 개인 취향에 맞는 오픈챗들을 추천하는 모델의 개선 과정에 대해 공유드렸고, 이후 오픈챗 해시태그 예측을 위한 다중 레이블 분류 모델 개발하기 포스트에서는 오픈챗을 생성할 때 해시태그 지정을 돕는 해시태그 예측 모델을 어떻게 개발했는지 공유드린 바 있습니다.
이번 글에서는 오픈챗들에서 오가는 메시지 콘텐츠로부터 유행하는 주제 키워드를 어떻게 추출할 수 있는지 소개드리고자 합니다.
배경
현재 오픈챗 서비스의 메인 화면은 채팅방 검색과 추천, 랭킹 기능 위주로 구성돼 있으며, 추천으로 노출되는 아이템은 대부분 채팅방 그 자체입니다. 오픈챗 주제를 키워드 나열 형태로 추천하고 있기는 하지만 키워드를 클릭하면 결국 이와 연관된 채팅방들이 노출되는 방식입니다.
이와 같은 메인 화면은 사용자에 따라서 지속적으로 재방문할만큼 매력적이지는 않을 수 있습니다. 각 채팅방은 일종의 작은 커뮤니티로 사용자가 하나의 채팅방을 파악하려면 커버뷰에 적힌 설명글과 메시지 요약글을 읽어보거나 실제로 채팅방에 입장해 이전에 오간 콘텐츠를 확인하는 등의 노력이 필요합니다. 따라서 이미 마음에 드는 채팅방을 발견하고 가입해서 활발히 참여하고 있는 사용자의 경우 새로운 채팅방을 탐색할 동기가 약해지면서 주로 채팅방 위주로 노출되는 메인 화면 방문이 뜸해질 수 있습니다.
여기서 고려해야 할 점은, 메인 화면 방문자 수가 오픈챗 서비스의 주요 KPI라는 것입니다. 서비스 활성도를 대표할 뿐 아니라 광고 매출과도 연결되기 때문입니다. 이러한 배경 하에 채팅방 대신 채팅방에서 주고받는 메시지 콘텐츠를 메인 화면에 노출해 보는 것을 구상하게 되었습니다.
오픈챗 서비스를 다른 마이크로 블로그 서비스와 비교해 보면 채팅방은 인플루언서의 계정에, 메시지는 계정에 게시된 포스트에 대응시킬 수 있는데요. 대부분의 마이크로 블로그 서비스는 주로 포스트를 메인 화면에 노출합니다. 일반적으로 마이크로 블로그 서비스는 신규 포스트를 보기 위해 서비스 메인 화면에 방문하는 사용자의 비율이 새로운 인물을 팔로잉하려는 비율보다 높을 것이기 때문입니다. 포스트를 탐색하는 와중에 취향에 맞는 계정을 발견하는 선순환이 발생할 수도 있고요.
그런데 마이크로 블로그의 포스트와는 달리 대부분의 오픈챗 채팅방의 메시지 단건은 독립된 콘텐츠로 제공하기에는 적합하지 않습니다. 빠르게 주고받는 모바일 채팅의 특성상 오타나 비문이 많고 생략된 부분도 많기 때문에 채팅 중간의 메시지 하나만 떼어 놓으면 전체 맥락이 잘 파악되지 않기 때문입니다.
이에 따라 저희는 비슷한 주제의 메시지들을 묶어서 콘텐츠화하는 방향으로 가닥을 잡았으며, 이때 주제가 가시적으로 드러나도록 메시지에 등장한 주요 키워드 기반으로 묶는 방식을 채택했습니다. 이와 같은 접근 방식의 핵심은 메시지 텍스트 말뭉치에서 유행하는 주제 키워드를 추출하는 기법인데요. 이 기법을 어떻게 구현해 적용했는지 소개하겠습니다.
빈도 기반 트렌딩 키워드 선정
먼저 메시지 텍스트 말뭉치에서 지금 유행하는 '트렌딩 키워드'가 무엇인지를 어떤 기준과 방법으로 선정했는지 살펴보겠습니다.
트렌딩 키워드 탐지
유행하는 키워드를 탐지하는 방법으로 단순히 최근 등장 빈도가 높은 단어를 선택하는 방식을 떠올릴 수 있습니다. 하지만 오픈챗에 이 방식을 사용하면 검색 포털의 검색어라든가 뉴스 포털의 댓글 같이 해당 시점의 화제가 적절히 반영된 단어들이 뽑히지 않고, 인삿말이나 고마움, 웃음 표현과 같은 너무나 일상적인 단어들이 뽑힙니다. 오픈챗 커뮤니티는 사용자들이 일상적으로 담소를 나누는 공간이자 새 멤버들이 수시로 가입하는 공간이기에 인사나 소개, 환영의 말 등이 대화에서 높은 비중을 차지하기 때문입니다.
따라서 저희는 일별로 단어의 등장 빈도를 집계하면서 빈도가 급격하게 증가하는 단어를 트렌딩 키워드로 정의했습니다. 집계 기간 단위를 하루로 설정한 이유는 두 가지입니다. 하나는 통계적으로 유의미한 샘플을 충분히 확보하기 위해, 또 하나는 대부분의 사용자들이 하루에 한번만 오픈챗 메인 화면에 방문한다는 데이터 분석 결과가 있었기 때문입니다.
빈도 증가량을 측정할 때는 일주일 전의 해당 단어의 빈도를 기준으로 삼았습니다. 이 방식에는 두 가지 이점이 있는데요. 첫 번째는 특정 주제가 화제로 떠오를 때 그 열기가 하루에 그치지 않는 경우가 종종 나타난다는 점에 기인합니다. 바로 전날과의 빈도 차이만 고려할 경우 화제성이 정점에 달해 피크가 지속되고 있음에도 증가량이 미미해 트렌딩 키워드로 탐지되지 않을 수 있습니다(이에 대한 사례는 아래에서 자세히 살펴보겠습니다). 두 번째는 이 방식을 사용하면 일주일마다 반복적으로 언급되는 요일 관련 단어들을 자연스럽게 억제할 수 있습니다. 참고로 같은 이유로 한 달 전 빈도와도 비교하도록 구현했는데요. 이 글에서는 논의를 간결히 하기 위해 해당 내용은 생략하겠습니다.
두 빈도값 간의 차이를 계량하는 지표로는 이표본 모비율 차 검정을 위한 Z-테스트 통계량을 사용했습니다. 각 단어별로 Z-테스트 통계량을 계산하고 이를 점수로 사용해 점수가 높은 키워드를 트렌딩 키워드로 선정합니다. 이 방식은 메시지 하나하나가 독립적으로 작성된 메시지라고 간주하기는 어렵기 때문에 유의 확률에 기반해 엄밀하게 가설을 검정할 수는 없지만, 트렌딩 키워드로 가히 분류할 수 있는 최소 점수 임곗값을 정규 분포 곡선을 참고해 결정할 수 있습니다. 또한 빈도수가 작을 때 영향력이 커지는 노이즈 효과를 확률 분포 이론에 근거해 감안할 수 있다는 것도 좋은 점입니다.
통계랑 Z를 수식으로 살펴보기 위해 수식에 사용할 기호를 다음과 같이 정의하겠습니다.
- fif_i: 타깃 단어의 출현 빈도(term frequency, TF). 해당 단어를 포함하는 메시지의 수이며, 현재 TF에는 i=1i = 1, 이전 기준선 TF에는 i=0i = 0 사용
- MiM_i: 해당 날짜의 전체 메시지 수
- p^i=fi/Mi\hat{p}_i = f_i / M_i
- p^=(f0+f1)/(M0+M1)\hat{p} = (f_0 + f_1) / (M_0 + M_1)
위와 같이 기호를 정의했을 때 통계량 Z값은 다음과 같습니다.
Z=(p^1−p^0)p^(1−p^)(1M1+1M0)Z={\Large \frac{(\hat{p}_1 - \hat{p}_0)}{\sqrt{\hat{p}(1-\hat{p})(\frac{1}{M_1}+\frac{1}{M_0})}}}
여기서 주의해야 할 점은 빈도가 커질수록 비율 차이가 크지 않음에도 통계량 Z값이 크게 측정되는 경향이 있다는 것인데요. 이를 고려해 빈도가 최소 30% 이상 증가한 단어들만 대상으로 선정했습니다.
다음은 일본에서 장마가 시작된 어느 일주일간 일본 오픈챗에서 '梅雨入り'(장마 시작) 키워드의 빈도수를 집계한 뒤, 이를 바탕으로 비교 기준이 되는 날을 달리 설정했을 때 각각 계산된 Z값들이 변화하는 양상을 보여주는 그래프입니다. 비교 기준일로는 하루 전(파란선), 이틀 전(노란선), 사흘 전(초록선), 일주일 전(빨간선)을 선정했습니다(참고로 모든 데이터 분석에는 공개된 오픈챗 메시지만 이용됩니다).
위 그래프에서 기준일이 하루 전(파란선)일 때를 보면, 6일째(day6)에서 빈도수가 계속 증가하고 있음에도 Z값이 급격하게 하락하는 것을 볼 수 있습니다. 또한 7일째에는 아직 빈도수가 4일째보다 높은 수준이지만, 기준일을 일주일 전(빨간선)으로 설정하지 않은 모든 그래프가 Z값이 3 미만으로 크게 낮아지는 것을 확인할 수 있습니다.
다음 표에서는 기준일에 따라 6일째에 상위 키워드 랭킹이 어떻게 선택되는지 보여줍니다. 사흘 전 또는 일주일 전을 비교 기준으로 삼을 때는 '梅雨入り' 키워드가 가장 트렌디한 것으로 선정됐지만, 기준일을 하루 전으로 두면 10위권 밖으로 밀려납니다. 또한 일주일 전을 기