▲ 넥슨 인텔리전스랩스 어뷰징탐지팀 조용래 데이터 분석가

게임을 하며 우리는 욕설과 마주한다. 때로는 상대방이, 때로는 본인이 채팅으로 내뱉기도 하는 욕설은 서로에게 상처가 된다. 그래서 게임사는 욕설을 최대한 막는 방법들을 동원한다. 필터링을 거쳐 욕설을 다른 언어로 바꾸거나, **와 같은 모자이크 처리를 하는 등 각고의 노력을 기울인다.

하지만 사람의 창의력은 예상을 뛰어넘는다. 가운데에 1을 붙이거나, 비속어를 사용하지 않고도 상대를 모욕하는 등 방법은 무궁무진하다. 때때로 욕설이 아님에도 욕설로 인식하는 문제가 발생하기도 한다. 그렇다면 우리는 게임 속의 욕설을 어떻게 효율적으로 탐지하고 대응을 해야 할까.

넥슨 코리아 인텔리전스랩스 어뷰징탐지팀의 조용래 데이터 분석가는 NDC 2018 의 '딥러닝으로 욕설 탐지하기'강연을 통해 구체적으로 어떻게 욕설을 탐지하는지를 설명한다. 해당 강연에서는 딥러닝을 이용한 구체적인 욕설 탐지 시스템의 구축 과정, 딥러닝과 자연어 처리 과정을 통해 현실의 문제를 해결하는 방법을 제시하고자 했다.




■ PART 1. 굳이 왜 욕설 탐지기를 딥러닝으로 만들어요?

누구나 한번 이상은 게임을 플레이하며 욕을 먹은 경험이 있다. 당연한 이야기지만, 욕설이 심한 경우에 게이머들은 게임에서 이탈하기도 한다. 극단적으로는 모욕죄로 이어져 법적인 문제가 될 때도 있다. 그래서 욕설을 제재하는 것은 게임사에 중요한 문제가 된다. 그리고 이를 위해 크고 작은 규모의 욕설 탐지와 제재 시스템을 운영하고 있다.

그렇다면 굳이 왜. 이미 존재하는 것을 딥러닝을 통해 만들 생각을 했을까. 지금까지의 욕설 탐지는 금칙어에 기반을 둔 시스템이다. 해서는 안 될 단어를 선정하고, 해당 단어가 포함된 문장을 말하면 제재하거나 마스킹(**을 의미함)하는 방법을 뜻한다.

하지만 이러한 금칙어 기반의 시스템은 몇 가지 문제점이 있었다. 먼저, '우회가 쉽다는 점'이다. '시발'은 시스템에서 잡아낼 수 있지만 '시1발'은 잡아내지 못한다. 게임뿐만 아니라 게시판 등에서 익숙하게 볼 수 있는 광경이기도 하다. 두 번째로는 '오탐이 잦다는 점'을 들 수 있다. 타인을 공격하지 않는 '제가 병신이었네요'도 금칙어 시스템 내에서는 마스킹 및 제재가 이루어진다. 마지막으로는 '욕이 아닌 공격적인 표현을 잡지 못한다'는 점이다. 욕을 하나도 사용하지 않고 일상적인 대화로 공격적인 표현은 시스템 내에서 잡아낼 수 없다.

▲ 금칙어 기반은 한계점이 분명하다

이러한 문제점 탓에 현재는 욕설 신고를 받고 나서 운영자가 직접 읽고 판단을 내리는 프로세스를 가지고 있다. 수많은 신고를 직접 확인해야 한다는 것은 시간이 많이 들어간다는 것을 의미한다. 공격적인 언어를 지속해서 마주하며 운영자들의 정신적 스트레스도 발생하게 된다.

강연자는 이러한 운영자들의 수고를 덜게 하려고 딥러닝으로 욕설 탐지기를 만들어보자는 아이디어를 냈다. 딥러닝 욕설 탐지기 프로젝트는 이렇게 시작하게 됐다.



■ PART 2. 딥러닝 욕설 탐지기의 프로토타입은 어떻게 만들었나요?

프로젝트의 지향점은 욕설 탐지기를 통해 1차적으로 자동 분류를 하고, 이후 수동 식별을 하는 것이었다. 기존의 수동으로 읽고 식별하는 프로세스를 개선한 형태다. 이를 탐지기로 한번 추출하고 정렬하여 실제 업무를 진행하는 사람들이 읽기 좋은 형태로 바꾸고, 쉽게 욕설 탐지를 할 수 있는 형태로 만들고자 했다.

▲ 한 번 욕설 탐지기가 걸러주는 형태로.

이를 위하여 탐지기가 욕설을 판단할 수 있도록 데이터를 확보하는 과정을 거쳤다. 여기서 말하는 데이터는 라벨링을 의미한다. 라벨링은 말 그대로 무엇이 정상이고 무엇이 욕설인지 표현에 태그를 달아주는 것이다. 욕설의 종류가 다양하므로 말 그대로 데이터를 확보하는 과정에서 노가다를 해야만 했다. 크롤링 외에도 자체 제작(개발자들이 욕을 직접 했다는 의미다)을 하는 과정은 단체로 진행해야 했다.

모델링에 있어서는 1DCNN을 사용했다. CNN(Convolutional Neural Network)은 이미지 처리 분야에서 쓰이는 알고리즘이다. 이미지에 지역적인 필터를 만들어서 특징을 추출하고 인식하는 개념이다. 예를 들면, 고양이의 눈과 귀, 수염을 인식하는 필터를 만든다. 그리고 이를 고양이 필터로 적용해, 고양이라는 특성을 기준으로 다른 이미지에서도 고양이임을 판단하는 것이다.

▲ CNN은 이미지 기반으로 학습해서, 판단을 내리는 과정을 의미한다

또한, 입력으로는 자모를 받는다. 우리가 게임을 하며 나오는 채팅 데이터는 띄어쓰기도 잘되어있지 않고, 오타도 많다. 단어에 기반을 두면 탐지기가 인식하기 어렵다. 하지만 자모 단위로 쪼개면 비슷한 자모를 사용해도 인식이 가능해진다. 이후 텍스트를 숫자로 바꾸는 임베딩(Embedding)을 거쳐 입력을 인식시키고, 이를 통해 비슷한 텍스트를 비슷한 숫자로 바꿀 수 있도록 구성한다. 이는 비슷한 욕이 들어왔을 때에도 기존과 유사한 탐지결과를 얻기 위함이다.

컨볼루션(Convolution)은 필터를 여러 개 사용하여 다양한 특성을 추출할 수 있도록 구성한다. 욕설과 관련한 많은 특성을 학습할 수 있도록 하기 위함이다. 풀링(Pooling) 레이어는 가장 특징적인 것만 남겨놓고 버리는 방법을 선택했다. 불필요한 부분을 버림으로써 노이즈를 줄이고, 텍스트 길이와 상관없이 같은 개수의 특성을 뽑아내기 위한 선택이었다. 마지막으로 출력 레이어는 앞서 설정한 특성들을 바탕으로 텍스트가 욕설일 확률을 계산하도록 설계했다. 이렇게 '입력 - 임베딩 - 컨볼루션 - 풀링 - 출력'의 다섯 단계를 거쳐서 텍스트가 욕설인지 아닌지를 판단하는 모델이 만들어졌다.

▲ 탐지기는 텍스트를 이미지화 하여 욕설 여부를 판단한다

해당 모델은 금칙어 사전이 없어도 욕설을 학습할 수 있다는 장점이 있었다. 정확도는 금칙어 사전을 적용했을 때가 56%, 딥러닝 탐지기를 이용했을 때가 88%로 정확도에서 우위를 가지고 있었다. 금칙어 사전을 적용한 시스템은 금칙어와 일치해야만 욕설을 탐지할 수 있기 때문에 상대적으로 정확도가 낮았다.

다음으로는 모델의 신뢰성을 판단하기 위한 모델 해석이 이루어졌다. 모델 해석은 어떠한 부분 때문에 욕설로 판단했는가를 알아보는 과정이다. 그리고 모델이 잘못된 판단을 했을 때 이유를 찾아보는 디버깅 과정, 마스킹(** 처리)를 하기 위해 어느 부분을 욕으로 판단하는지 확인하는 과정이 수반됐다.

해석을 하는 과정은 글자를 빼는 것으로 이루어졌다. 욕설을 담은 문장에서 각 요소들을 하나씩 빼면서 어떤 것이 욕이고 어떤 것이 정상인지 판단했다. 아래의 예시처럼, 단어 하나씩을 제거하는 과정을 거쳐서 탐지기가 'ㅈ같네'를 욕으로 판단하고 있음을 확인할 수 있다. 이러한 과정을 효율적으로 진행하기 위해서 라임(Lime) 알고리즘을 도입해 욕설 탐지에 적용하기도 했다.


결과적으로는 프로토타입은 준수한 정확도를 만들어낼 수 있는 형태로 설계됐다. "게임 참 ㅈ같이 하네"를 탐지기에 돌렸을 때, 'ㅈ'과 '같'을 욕설로 정확하게 판단했다. "시111발 미친놈인가 진짜"와 같이 중간에 1을 집어넣은 경우에도 탐지기는 '시'와 '발'이 욕설에 기여한 것으로 해석했다.

이외에도 "니 놀아줄 친구 없지 애미도 없는 듯"은 '애'와 '미', '없'을 욕설에 기여한 것으로 판단했다. 해당 결과는 탐지기가 단어조합을 탐지할 수 있음을 의미하는 것이다. 이외에도 "뭐하고 있냐 개년아"와 "경제 발전 5개년 계획"을 비교했을 때, 앞의 문장에서는 '개'와 '년'을 욕설로 판단했지만, 뒤의 문장에서는 정상으로 판단하는 결과를 내놓기도 했다. 즉, 문맥을 구분해서 욕설을 판단할 수 있다는 의미다.



▲ 문맥과 단어 조합, 문장에서의 욕설을 찾을 수 있게 됐다.

▲ 프로토타입은 데이터야놀자 행사장에서 시연을 거치기도 했다.



■ PART 3. 욕설 탐지기를 고도화 하기

프로타입에서 가능성을 확인했으니, 다음으로는 이를 발전시킬 차례다. 데이터 면에서는 더 효율적인 노가다 방법을 고민하고, 모델링은 더 깊고 강력하게, 해석에서는 더 빠르고 직관적인 해석이 가능하도록 고민하고 구현하는 과정을 거쳤다.


데이터 면에서는 액티브 러닝을 이용하여 레이블이 붙은 데이터를 스마트하게 선택할 수 있도록 방향을 잡았다. 여기서 핵심은 다음 노가다를 위한 데이터를 어떻게 선택할 것인지 기준을 잡는 점이었다. 개발팀은 이를 위해 모델이 가장 헷갈리는 데이터, 욕설일 확률 50%에 가까운 데이터를 선택하는 것으로 결정했다.

모델링에서는 처리 레이어가 증가하면서 발생하는 학습 속도가 느려지는 문제를 '숏컷 커넥션'을 통해 개선했다. 숏컷 커넥션은 레이어를 건너뛰어서 지름길을 만드는 개념이다. 지름길이 있어 뒤에 있는 레이어까지 신호가 빠르게 전달되고, 학습이 빨리 이루어질 수 있도록 설계했다.


해석 부분도 라임 알고리즘의 처리 속도가 느리다는 라임 알고리즘의 단점을 개선하고자 했다. 그래서 결과를 뽑아내는 것과 동시에 해석을 할 수 있는 모델을 생각하게 됐다. 이는 모델이 어디에 집중할지 생각하는 '어텐션'을 적용하여 해결했다. 모델이 집중하는 곳이 결과에 더 많이 반영되므로, 여러 문장을 동시에 해석할 수 있는 결과를 낳았다. 결과물 자체의 정확도는 비슷하지만, 처리 과정이 더 빨라졌다.



■ PART 4. 그래서, 실제로 도움이 됐나요?

이렇게 구성된 욕설 탐지기는 서든어택에서 시험적으로 사용하여 결과를 얻었다. 서든어택에서 발생하는 신고와 수동 검토에 솔루션을 제공했다. 신고가 들어오면 수동으로 검토하는 기존의 구조를 개선하기 위함이었다. 솔루션에서 제공한 기능은 1. 채팅 중 욕설인 부분만 추출하여 보여주는 것. 2. 제재 확률이 높은 순으로 정렬하는 기능의 두 가지다.

실무에 적용할 수 있는 단계는 아니었지만, 테스트 결과는 1분당 모니터링 건수가 기존 23건에서 욕설 탐지기 사용 시 35건으로 증가했다. 제재 대상을 선별하는 부분에서는 기존 41%, 욕설 탐지기 96%로 크게 차이가 났다. 제재 확률이 높은 사례로 정렬하는 기능은 실무 담당자들에게 있어서 큰 효과를 가져다줄 수 있었다. 10회 테스트에서는 모든 경우에 걸쳐서 욕설 탐지기 쪽이 더 좋은 결과를 보여준 것이 확인됐다.


단순한 아이디어에서 출발한 딥러닝 욕설 탐지기는 이렇게 실무에 이로운 결과를 줄 수 있는 형태로 탄생했다. 욕설의 변형은 물론, 맥락을 고려하여 판단하는 형태는 실무에 많은 도움을 줄 수 있었다. 이처럼 인공지능을 활용한 결과물을 두고 강연자는 "인공지능은 스카이넷이 아니라 자비스같은 물건이라고 생각한다"고 전했다.

욕설 제재와 같이 한 건이라도 무고가 있으면 안 되는 상황에서는 인공지능이 사람을 대체할 수 없다는 설명이다. 그렇기에 스카이넷이 아니라, 사람을 보조하고 도움을 줄 수 있는 자비스와 같다는 것이다. 자비스를 이용해 효율적으로 절약된 시간을 아이언맨이 유용하게 사용하듯, 인공지능 또한 업무를 효율적으로 하기 위한 존재임을 강조하며 강연을 마쳤다.