2026년 8월 16일
비속어 필터링에 KoELECTRA와 Rule 기반 필터를 함께 사용한 이유
동숲 프로젝트에서 게시글과 채팅 내 부적절한 표현을 탐지하기 위해 KoELECTRA 기반 문맥 판단과 Rule 기반 필터링을 함께 적용한 과정을 정리했습니다.
비속어 필터링에 KoELECTRA와 Rule 기반 필터링을 함께 적용한 이유
왜 Rule 기반 필터링을 적용했나
동숲 프로젝트에서 사용자가 작성하는 게시글, 댓글, 채팅 내용에서 부적절한 표현을 탐지하고 차단하는 기능이 필요했습니다.
이 기능은 단순히 서버에서 차단하는 것이 아니라, 사용자가 어느 부분을 수정해야 하는지 알 수 있도록 클라이언트에 시각적으로 안내하는 것을 목표로 했습니다. 또한 게시글 작성이나 채팅 입력 과정에서 사용되는 기능이기 때문에 실시간으로 처리하거나 빠른 응답을 제공할 수 있어야 했습니다.
처음에는 KoELECTRA 기반 분류 모델만으로 비속어 여부를 판단하는 방식을 고려했습니다. 하지만 명확한 금칙어나 변칙적으로 등장하는 표현까지 매번 모델 추론으로 처리하는 것은 비효율적이라고 판단했습니다.
또한 특수문자, 초성, 띄어쓰기 변형처럼 사용자가 의도적으로 우회한 표현을 모델만으로 안정적으로 잡아내는 것도 어려웠습니다.
따라서 명확한 금칙어와 우회 표현은 Rule 기반 필터로 먼저 탐지하고, 문맥 판단이 필요한 표현은 KoELECTRA 모델을 통해 추가로 검증하는 구조를 적용했습니다.
기존 모델 기반 필터링의 문제점
모델 기반 필터링만 사용할 경우, 새로운 우회 표현이나 신조어가 등장할 때마다 데이터를 추가로 수집하고 재라벨링한 뒤 재학습해야 한다는 문제가 있었습니다.
물론 수집된 로그를 기반으로 주기적으로 재학습을 진행하는 것도 하나의 해결 방법이 될 수 있습니다. 하지만 담당자가 직접 데이터를 확인하고 라벨링해야 하는 번거로움이 있었고, 모든 금칙어 처리를 모델 추론에만 의존하는 것은 비효율적이라고 판단했습니다.
또한 모델만으로는 다음과 같은 문제를 해결하기 어려웠습니다.
1. 우회 표현 문제 : 사용자는 비속어를 그대로 입력하기도 하지만, 초성, 특수문자, 띄어쓰기, 반복 문자 등을 섞어 표현하기도 합니다. 이런 표현이 학습 데이터에 충분히 포함되어 있지 않으면 모델이 안정적으로 탐지하지 못할 수 있습니다.
2. 명확한 금칙어 처리의 비효율성 : 금칙어 목록으로 관리할 수 있는 표현까지 모두 모델 추론에 맡기면 불필요한 연산이 발생합니다.
3. 예측 결과의 애매함 : 모델은 확률 기반으로 결과를 반환하기 때문에, 임계값 근처의 문장은 판단 기준이 모호해질 수 있습니다.
이러한 이유로 모델 기반 필터링만 사용하는 방식에는 한계가 있다고 판단했고, Rule 기반 필터링을 추가해 함께 사용하는 구조가 더 적합하다고 생각했습니다.
KoELECTRA를 선택한 이유
KoELECTRA는 한국어 자연어 처리에 사용할 수 있는 사전학습 언어 모델입니다.
동숲 프로젝트의 비속어 필터링은 사용자가 입력한 문장에서 부적절한 표현이 포함되어 있는지 판단하는 문장 분류 문제에 가까웠습니다.
단순 키워드 매칭만으로는 문장의 전체 의미를 고려하기 어렵습니다. 특정 단어가 포함되어 있다고 해서 항상 부적절한 표현이라고 판단할 수는 없고, 반대로 직접적인 비속어가 포함되어 있지 않더라도 문맥상 공격적이거나 부적절한 표현일 수 있습니다.
이러한 경우에는 문장 전체의 의미를 고려할 수 있는 모델 기반 접근이 필요하다고 판단했습니다. 그래서 한국어 문장 분류에 활용하기 적합한 KoELECTRA를 선택했습니다.
Rule 기반 필터링을 함께 사용한 이유
Rule 기반 필터링은 명확한 금칙어나 패턴을 빠르게 탐지하는 데 유리합니다.
예를 들어 특정 비속어 목록, 초성 표현, 특수문자 삽입, 반복 문자와 같은 패턴은 규칙으로 정의하면 빠르게 탐지할 수 있습니다. 또한 어떤 표현이 문제가 되었는지 명확하게 확인할 수 있기 때문에, 클라이언트에서 사용자에게 수정이 필요한 부분을 안내하기에도 적합했습니다.
반면 KoELECTRA 모델은 단어 하나가 아니라 문장의 전체 맥락을 판단할 수 있다는 장점이 있습니다.
따라서 동숲 프로젝트에서는 두 방식을 서로 대체 관계로 보지 않고, 역할을 나누는 방식으로 구성했습니다.
Rule 기반 필터는 명확한 금칙어와 우회 표현을 빠르게 탐지하고, KoELECTRA는 규칙만으로 판단하기 어려운 문장의 맥락을 보완하는 역할을 했습니다.
결론적으로 동숲 프로젝트는 명확한 비속어나 우회 표현을 Rule 기반 필터에서 먼저 탐지하고, 규칙만으로 판단하기 어려운 문장을 KoELECTRA 모델을 통해 한 번 더 검증하는 구조로 구성했습니다.
적용 방식
전체 흐름은 다음과 같이 구성했습니다.
사용자 입력
↓
텍스트 전처리
↓
Rule 기반 필터링 - 신규 추가
↓
KoELECTRA 기반 문장 분류
↓
탐지 결과 통합
↓
클라이언트에 필터링 결과 반환
1. 입력 텍스트 전처리
먼저 사용자가 입력한 텍스트를 전처리하는 과정을 거쳤습니다.
게시글이나 채팅에서 사용자가 비속어를 우회하기 위해 특수문자, 공백, 반복 문자를 섞어 입력할 수 있기 때문입니다.
따라서 필터링을 수행하기 전에 텍스트 정규화 과정을 적용하여 같은 의미의 표현이 최대한 비슷한 형태로 처리되도록 구성했습니다.
예를 들어 불필요한 공백을 제거하거나, 반복 문자를 정리하고, 특수문자를 포함한 변형 표현을 최대한 일관된 형태로 변환하는 방식입니다.
이 과정을 통해 Rule 기반 필터와 KoELECTRA 모델이 입력 문장을 더 안정적으로 처리할 수 있도록 했습니다.
2. Rule 기반 1차 필터링
Rule 기반 필터링은 명확한 비속어나 반복적으로 등장하는 금칙어를 빠르게 탐지하기 위해 추가했습니다.
모델을 거치지 않아도 판단할 수 있는 표현은 Rule 기반 필터에서 먼저 처리했습니다. 이를 통해 모든 요청을 모델 추론에만 의존하지 않고, 빠르게 차단 가능한 표현을 먼저 걸러낼 수 있었습니다.
또한 Rule 기반 필터는 어떤 단어 또는 패턴이 탐지되었는지 명확하게 알 수 있다는 장점이 있습니다.
이 결과를 클라이언트에 전달하면 사용자는 어떤 입력값이 문제가 되었는지 확인하고 직접 수정할 수 있습니다.
3. KoELECTRA 기반 2차 판단
Rule 기반 필터링만으로 판단하기 어려운 문장은 KoELECTRA 모델을 통해 추가로 검증했습니다.
KoELECTRA는 문장의 전체 맥락을 기반으로 부적절한 표현 여부를 판단할 수 있기 때문에, 단순 키워드 매칭으로 잡기 어려운 표현을 보완하는 역할을 했습니다.
모델의 출력 결과는 확률값 또는 score로 반환되며, 일정 기준값 이상일 경우 부적절한 문장으로 판단하도록 구성했습니다.
이 방식은 Rule 기반 필터의 빠른 탐지 성능과 KoELECTRA의 문맥 판단 능력을 함께 활용하기 위한 구조였습니다.
4. 탐지 결과 반환
필터링 결과는 단순히 True / False로만 반환하지 않고, 클라이언트에게 바로 안내할 수 있는 형태로 구성했습니다.
이를 통해 사용자는 어떤 입력값이 문제가 되었는지 확인하고 직접 수정할 수 있습니다.
{
"isValid": false,
"detectedWords": ["..."],
"reason": "부적절한 표현이 포함되어 있습니다."
}
단순히 게시글 저장을 막는 것에서 끝나는 것이 아니라, 문제가 된 표현을 사용자에게 안내하고 수정할 수 있도록 하는 것이 핵심이었습니다.
적용하면서 고려한 점
비속어 필터링을 구현하면서 가장 중요하게 고려한 부분은 과탐지와 미탐지의 균형이었습니다.
과탐지가 많으면 정상적인 표현까지 차단되어 사용자 경험이 나빠질 수 있습니다. 반대로 미탐지가 많으면 부적절한 표현이 서비스에 그대로 노출될 수 있습니다.
따라서 명확한 금칙어는 Rule 기반 필터로 빠르게 차단하고, 애매한 표현은 KoELECTRA 모델을 통해 확인하는 방식으로 역할을 나눴습니다.
또한 게시글이나 채팅 입력 과정에서 너무 긴 응답 지연이 발생하면 사용자 경험이 떨어질 수 있기 때문에, 모든 요청을 모델에만 의존하지 않도록 구성했습니다.
Rule 기반 필터를 먼저 적용하면 명확한 표현은 빠르게 처리할 수 있고, 모델 추론이 필요한 요청만 KoELECTRA로 넘길 수 있습니다.
이러한 구조를 통해 탐지 정확도뿐만 아니라 응답 속도와 서비스 안정성도 함께 고려할 수 있었습니다.
결과와 기대 효과
KoELECTRA와 Rule 기반 필터를 함께 사용하면서 게시글, 댓글, 태그, 채팅 메시지에 포함된 부적절한 표현을 사전에 검증할 수 있는 구조를 만들 수 있었습니다.
Rule 기반 필터는 명확한 금칙어나 우회 표현을 빠르게 탐지하는 역할을 했고, KoELECTRA 모델은 규칙만으로 판단하기 어려운 문장의 맥락을 보완하는 역할을 했습니다.
또한 결과를 단순히 차단 여부만 반환하는 것이 아니라, 어떤 표현이 문제가 되었는지 클라이언트에 전달할 수 있도록 구성했습니다. 이를 통해 사용자는 문제가 되는 부분을 확인하고 직접 수정할 수 있습니다.
결과적으로 커뮤니티 서비스에서 부적절한 표현이 노출되는 것을 줄이고, 사용자들이 더 안전하게 서비스를 이용할 수 있는 기반을 만들 수 있었습니다.
배운 점
이번 경험을 통해 비속어 필터링은 단순히 모델 하나로 해결할 수 있는 문제가 아니라는 것을 배웠습니다.
처음에는 KoELECTRA 모델을 Fine-tuning하고 재학습을 반복하면 문장 분류만으로 충분히 처리할 수 있을 것이라고 생각했습니다. 하지만 실제 서비스에서는 금칙어, 우회 표현, 특수문자 변형, 과탐지와 미탐지 문제를 함께 고려해야 한다는 점을 느꼈습니다.
Rule 기반 필터는 빠르고 명확하지만 문맥을 이해하기 어렵고, KoELECTRA 모델은 문맥 판단에는 장점이 있지만 모든 우회 표현을 안정적으로 탐지하기에는 한계가 있었습니다.
결국 중요한 것은 하나의 방식만 선택하는 것이 아니라, 각 방식의 장단점을 이해하고 역할을 나누는 것이었습니다.
동숲 프로젝트에서는 Rule 기반 필터와 KoELECTRA를 함께 사용하면서 명확한 표현은 빠르게 탐지하고, 문맥 판단이 필요한 경우에는 모델이 보완하는 구조를 만들 수 있었습니다.
이번 과정을 통해 AI 기능을 실제 서비스에 적용할 때는 모델 성능뿐만 아니라 예외 처리, 응답 속도, 사용자 피드백 방식까지 함께 고려해야 한다는 점을 배웠습니다.
또한 현재 구현하고 운영 중인 서비스에서도 모델만으로 모든 문제를 해결하려 하기보다, 규칙 기반 처리와 예외 처리 로직을 함께 활용하는 방향으로 확장해야겠다고 생각하게 되었습니다.