설명을 위해 욕설이 다수 기재되어 있어 불쾌할 수 있습니다.
한국어 비속어 탐지 Java 라이브러리입니다.
압도적으로 빠르고, 가볍고, 범용적인 용도를 목표로 개발한 욕설 필터입니다.
- String 넣으면, 욕설인지 아닌지 boolean으로 판단.
2. 설정을 통해 화이트리스트, 블랙리스트 단어 수동 추가. (모든 필터링 레벨에 최우선 적용)
- profanityWhitelist.txt, profanityBlacklist.txt를 프로젝트 최상단에 만들면 자동 인식.
- 필터 수동 선택 적용
Maven Import
<dependencies>
<dependency>
<groupId>io.github.lisuugi</groupId>
<artifactId>korean-profanity-filter</artifactId>
<version>0.1.0</version>
</dependency>
</dependencies>
Gradle Import
dependencies {
implementation 'io.github.lisuugi:korean-profanity-filter:0.1.0'
}
Spring Bean 등록 활용 예시
@Configuration
public class FilterConfiguration {
@Bean
public ProfanityFilter profanityDefaultFilter() {
return ProfanityFilter.createDefault();
}
@Bean
public ProfanityFilter profanityCustomFilter() {
return ProfanityFilter.builder()
.setLevel(WordLevel.AGGRESSIVE)
.useRegexFilter(false)
.build();
}
}- 프로젝트 최상단에 profanityBlacklist.txt, profanityWhitelist.txt 파일을 작성합니다.
- 각 줄마다 하나의 단어를 작성합니다.
- 프로젝트를 실행할 때, 해당 위치에 파일이 있다면 자동으로 감지하여 사전 목록에 추가, 또는 제외합니다.
- 레벨 1 - 사전에 등재된 정확한 단어, 또는 매우 보편적으로 쓰이는 혐오의 의도가 명확한 단어.
- 레벨 2 - 사전에 등재된 단어의 변형, 또는 인터넷에서 볼 수 있는 특이 표현 (권장)
- 레벨 3 - 혐오의 표현이 아닐 확률이 높은 단어. (긍정 오류가 커질 우려가 있음.)
- 단어 유형 선택 (복수 선택 가능)
- 외설적인 단어
- 폭력적인 단어
- 혐오감을 주는 단어
- 정치 비하, 지역 비하, 성별 비하 단어
- 단어 매칭 API (하나만 선택 가능)
- 정규 사전 용어 (레벨 1 - 사전에 등재된 정식 단어, 매우 빠름)
- 범용 우회 용어 (레벨 2 - 일반적인 우회 단어)
- 정규식 (레벨 3, 패턴 매칭을 활용, 약간 느려짐)
- 우선순위가 떨어지는 우회 용어 (레벨 4 - 매우 엄격)
- 특수문자 정상 자모음 변경 (人 | 발 -> 시발)
- 숫자 제거 (씨123발 -> 씨발)
- 반복 문자 제거 (ㅅㅅㅅㅅㅂㅂㅂ -> ㅅㅂ)
- 자음 모음 합치기 (ㅆ ㅣ 발 -> 씨발)
- 문자 탐지 알고리즘 사용
- 사전 문자 470개 이하: 완전 탐색
- 사전 문자 470개 초과: 아호-코라식 탐색
AI를 활용하지 않기 때문에, 문맥을 고려하지 않는다는 한계점이 존재합니다.
- 욕설을 사용하지 않는 공격적인 글은 탐지하지 못합니다.
- 긍정적인 비속어 모두 필터링됩니다.
- 예) 존나 맛있네 -> ** 맛있네, 와 씨발 대박이다! -> 와 ** 대박이다!
Total Sentences: 2033893
Total Keywords: 3417
----------------------------------------
Aho-Corasick O(N): 2304.8284ms | Throughput: 882,448.78 sentences/sec
Regex O(N): 39753.4185ms | Throughput: 51,162.72 sentences/sec
Naive-Search O(N*M): 88868.0712ms | Throughput: 22,886.66 sentences/sec
Aho-Corasick + Regex: 43013.9642ms | Throughput: 47,284.48 sentences/sec
----------------------------------------
Aho-Corasick is 94.20% faster than Regex.
Aho-Corasick is 97.41% faster than Naive-Search.
아호-코라식 알고리즘과 정규식 알고리즘은 Keyword 단어 사전 숫자가 늘어나도 항상 일정한 속도를 유지합니다. 완전 탐색의 경우 단어 사전 숫자가 470개 이하인 경우 아호-코라식보다 빠르게 처리가 가능합니다.
확실한 욕설은 빠르게 거를 수 있기 때문에, 낮은 레이턴시가 필요한 대규모 트래픽 실시간 처리 환경 또는 스타트업에서 간편하게 1차 거름망을 준비할 수 있습니다.
이 프로젝트의 아키텍처, 설계 결정, 핵심 로직에 대한 더 자세한 기술적인 설명은 상세 문서(docs)를 참고해 주세요.
https://github.com/curioustorvald/KoreanCursewordRegex
나무위키 욕설/한국어 : https://namu.wiki/w/%EC%9A%95%EC%84%A4/%ED%95%9C%EA%B5%AD%EC%96%B4
https://github.com/Tanat05/korean-profanity-resources/blob/main/slang.csv
https://github.com/hlog2e/bad_word_list
adlnlp/K-MHaS : https://github.com/adlnlp/K-MHaS
ZIZUN/korean-malicious-comments-dataset : https://github.com/ZIZUN/korean-malicious-comments-dataset
2runo/Curse-detection-data : https://github.com/2runo/Curse-detection-data
https://www.kaggle.com/datasets/captainnemo9292/korean-extremist-website-womad-hate-speech-data
https://www.kaggle.com/datasets/tanat05/korean-hate-chat-data
https://github.com/kocohub/korean-hate-speech
https://github.com/smilegate-ai/korean_unsmile_dataset
https://github.com/boychaboy/KOLD
https://github.com/2runo/Curse-detection-data
https://www.kaggle.com/datasets/junbumlee/lgbt-hatespeech-comments-at-naver-news-korean
https://www.kaggle.com/datasets/junbumlee/lgbt-hatespeech-comments-at-naver-news-korean
https://github.com/Tanat05/korcen
https://github.com/VaneProject/bad-word-filtering
아호코라식 라이브러리 : https://github.com/robert-bor/aho-corasick