brunch

You can make anything
by writing

C.S.Lewis

by 생계형 개발자 Apr 04. 2021

욕설/수위 콘텐츠 분류기 개발기

간단한 머신러닝으로 수위/욕설 글 분류기 개발

* 주의: 수위/욕설 콘텐츠에 포함된 단어를 예시로 사용하고 있습니다.


현재 내가 속한 팀에서 운영 중인 서비스는 블로그, 인스타, 틱톡, 유튜브처럼 유저들이 콘텐츠를 만들고 다른 사람과 공유할 수 있는 UGC(User Generated Content) 플랫폼이다. UGC 플랫폼을 만드는 사람으로서 우리의 주 업무는 유저들이 더 재미있는 콘텐츠를 만들 수 있는 환경을 기획하고 개발하는 일이다. 대부분의 유저들은 우리가 제공한 기능을 이용해 창의적이고 재미있는 콘텐츠를 올린지만 몇몇 유저들은 눈살을 찌푸리게 하는 콘텐츠를 올리기도 한다. 타인을 저격하거나 욕설이 담긴 콘텐츠, 음란행위를 묘사한 수위 콘텐츠처럼 우리 서비스에 부적합한 콘텐츠가 이런 경우고 서비스가 성장할수록 이런 콘텐츠는 늘어난다.


우리 서비스는 12세 이용가다


다른 UGC 플랫폼처럼 우리 팀도 주기적으로 플랫폼에 노출되는 콘텐츠를 관리해야 했다. 그래서 매주 수요일마다 모든 팀원이 모여서 신고가 들어온 콘텐츠를 직접 읽어보고 부적합한 콘텐츠를 차단하는 시간을 가지곤 했다. 매주 모이는 팀원이 10명 정도 됐고 1시간 정도 소요됐으니 팀 차원에선 10시간이 매주 소요되는 것이라 적지 않는 시간을 써야 했고 개별 팀원들에겐 단순 반복 작업이긴 하지만 보고 싶지 않은 욕설, 음란글을 매번 읽어봐야 했기 때문에 이 시간이 괴로운 일이기도 했다. 좋은 서비스를 만들기 위해선 꼭 필요한 작업이긴 했지만 시간적으로, 정신적으로 우리 팀에 좋지 못한 영향을 주고 있는 일이었다. 그래서 내가 속한 개발팀에선 욕설/수위 글을 자동으로 분류해줄 수 있는 분류기를 만들기로 했다. 단순 반복 작업인 만큼 충분히 학습이 가능할 것이라는 판단이 들었다.


처음에는 글에 포함된 단어를 추출해서 판단하는 접근법을 시도했다. 예를 들어 '씨발'이라는 단어가 포함되면 욕설 콘텐츠로, '섹스'라는 단어가 포함되면 수위 글 콘텐츠로 분류하는 간단한 방식이다. 서비스에서 금지어로 지정한 단어 집합을 만든 후 콘텐츠에 집합에 해당하는 단어의 유무로 판단하면 되기 때문에 가장 간단하고 구현이 쉽다. 하지만 이 접근은 가장 간단한 만큼 문제가 있는데 '흐읏'과 같은 의성어와 '침대', '키스' 같은 음란물 콘텐츠에서 주로 등장하는 단어지만 금지어에 포함시키기 애매한 단어로 이뤄진 부적합 콘텐츠는 분류할 수가 없었다. 차단을 피하기 위해 나날이 발전해가는 유저들의 문장력(?)을 고려해봤을 때 이 방식은 적합하다고 볼 수 없었다.


두 번째 방식은 단어마다 점수를 주는 방식이다. 스팸 필터에서 주로 쓰는 방식인데 단어가 부적합한 콘텐츠에서 빈번하게 등장해도 정상 콘텐츠에서도 등장한다면 점수를 낮게 주고, 단어가 자주 등장하지 않더라도 문제가 되는 콘텐츠에서만 발생한다면 점수가 높게 주게 된다. '섹스' 나 '씨발' 같은 단어는 자주 등장하진 않지만 부적합 콘텐츠에서만 쓰이기 때문에 점수를 높다. 반면 앞서 예로든 '침대', '흐읏', '키스'같은 단어는 정상 콘텐츠에도 나오고, 부적합 콘텐츠에도 나오기 때문에 점수가 낮다. 그러나 모든 단어의 점수 총합으로 분류하기 때문에 '침대', '흐읏', '키스'가 동시에 등장하는 경우 합산된 점수로 본다면 부적합한 콘텐츠에 가까워지게 된다. 첫 번째 시도에서 애매한 금지어를 해결하지 못했던 우리 유즈 케이즈에 가장 적합한 방식이었고 이 방식을 활용해서 학습을 시도했다.


지금까지 우리 팀이 차단한 콘텐츠 양이 꽤 많았기 때문에 욕설/수위 글 용 데이터로 학습할 데이터는 충분했다. 단 부적합한 데이터만 학습시키면 정상적인 단어에도 가중치가 올라갈 수 있기 때문에(아래 그림 참고) 정상으로 분류된 콘텐츠 데이터도 필요했고 운영에서 직접 관리하는 콘텐츠와 일반 유저들이 올려준 콘텐츠를 섞어서 학습을 시켰다. 비율로는 부적합 콘텐츠 60%, 정상 콘텐츠 40% 정도로 맞췄다. 파이썬에서 제공하는 konlpy 형태소 분석기 라이브러리를 이용해 콘텐츠에서 한국어 단어를 추출할 수 있었고 sklearn 라이브러리에서 제공하는 CountVectorizer를 이용해 단어 사전을 만들고 BernoulliNB 모델을 이용해서 학습시켰다. 모델에 대해서 알고싶으신 분은 이 링크를 보시면 좋을 것 같다.


욕설, 수위 글에 가장 많이 사용된 단어 Top 10중 일부


테스트한 결과 정확도는 94%. 금기어를 이용한 방식보다 정확도가 확연하게 증가했다. 물론 만족스러운 수치는 아니다. 100개 중 6개는 잘못 분류하고 있으니 억울하게 차단되는 유저가 생길 수 있다는 점에서 이 모델을 완전히 도입하기에는 무리가 있었다. 도입 전에 차단 예정인 콘텐츠에 대해서 확인해본 결과 학습 모델이 98% 정도 확신을 하는 경우는 부적합한 콘텐츠로 분류해도 될 것 같았다. 나머지 경우에 대해선 아직 팀원들의 수작업이 필요했다. 다행히 부적합한 글은 98% 이상 정직하게 높은 확률로 작성하는 경우가 대부분이었고 덕분에 우리 팀은 괴로운 차단 시간에서 조금은 자유로워졌다.


내겐 처음으로 실제로 라벨링 한 데이터를 학습해 운영 서비스에 적용해본 일이었는데 어려운 인공지능 기술을 도입한 게 아닌데도 강력한 효과를 볼 수 있다는 점과 이미 파이썬에서 제공하는 라이브러리가 많다는 점이 인상적이었다. 앞으로도 간단한 머신러닝 지식과 파이썬 라이브러리를 활용만 잘할 수 있다면 다양한 분야에도 적용이 가능할 것 같다는 생각이 든다.


작가의 이전글 젊은 꼰대가 될 뻔한 사연

작품 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari