Library JavaScript dan TypeScript untuk mendeteksi, menyensor, dan menganalisis kata kotor dalam bahasa Indonesia serta berbagai bahasa daerah.
- Deteksi kata kotor dan umpatan dalam bahasa Indonesia dan dialek daerah (Jawa, Sunda, Batak, Betawi, Minang, Bali, Madura, Aceh)
- Sensor fleksibel: ganti karakter (
*,#), grawlix acak (#@$%&!), sensor penuh, atau pertahankan huruf pertama dan terakhir - Deteksi variasi penulisan: leetspeak (
4nj1ng), kata terpisah (a-n-j-i-n-g), dan typo via Levenshtein distance - Analisis teks: skor keparahan (0-1), kategorisasi, analisis per kalimat, pencarian konteks sekitar, dan batch analysis
- Mendukung whitelist kata dan daftar kata kustom (
wordList) - Preset siap pakai:
strict,moderate,light, danchildSafe - Dukungan penuh TypeScript dengan tipe data lengkap
npm install @sideid/id-profanity-filter
# atau
bun add @sideid/id-profanity-filter
# atau
pnpm add @sideid/id-profanity-filterimport IDProfanityFilter from '@sideid/id-profanity-filter';
const filter = new IDProfanityFilter();
const teks = 'Dasar anjing kamu, jangan banyak bacot!';
// Cek apakah teks mengandung kata kotor
if (filter.isProfane(teks)) {
// Sensor kata kotor
const hasil = filter.filter(teks);
console.log(hasil.filtered);
// Output: "Dasar ****** kamu, jangan banyak *****!"
console.log(hasil.censored);
// Output: 2
// Analisis detail
const analisis = filter.analyze(teks);
console.log(analisis.categories);
// Output: ["profanity", "insult"]
console.log(analisis.regions);
// Output: ["general", "jawa"]
console.log(analisis.severityScore);
// Output: 0.36
}Jika tidak memerlukan konfigurasi instance khusus, gunakan helper idFilter:
import { idFilter } from '@sideid/id-profanity-filter';
const teks = 'Dasar anjing kamu, jangan banyak bacot!';
// Filter langsung
const hasil = idFilter.filter(teks);
console.log(hasil.filtered);
// Cek cepat
console.log(idFilter.isProfane(teks)); // trueimport IDProfanityFilter from '@sideid/id-profanity-filter';
const filter = new IDProfanityFilter();
// Gunakan preset childSafe dengan grawlix acak
filter.usePreset('childSafe', { useRandomGrawlix: true });
const hasil = filter.filter('Dasar anjing kamu!');
console.log(hasil.filtered);
// Output: "Dasar #@$%& kamu!"Membuat instance filter baru dengan opsi default atau kustom.
Menyensor kata kotor dalam teks. Mengembalikan objek:
filtered: string hasil sensorcensored: jumlah kata yang disensorreplacements: daftar objek penggantian (original,censored,metadata)
Mengembalikan true jika teks mengandung kata kotor.
Menganalisis teks secara menyeluruh. Mengembalikan objek:
hasProfanity: booleanmatches: string kata kotor yang cocokmatchDetails: array objekProfanityWordlengkapcategories: kategori unik yang ditemukanregions: daerah asal kata yang ditemukanseverityScore: skor keparahan kata (0 - 1)similarWords: kata yang mirip (jikadetectSimilarityaktif)
Menganalisis kumpulan teks sekaligus dan mengembalikan statistik agregat (total kata, teks bersih, rata-rata keparahan, kata paling sering muncul).
Memecah teks per kalimat dan menganalisis masing-masing kalimat secara independen.
Mengambil kata kotor beserta konteks kata-kata di sekitarnya.
Memperbarui konfigurasi filter yang sedang berjalan.
Mengembalikan konfigurasi filter ke opsi default (dapat ditimpa dengan opsi baru).
Menerapkan preset filter (strict, moderate, light, childSafe).
Mengatur daftar kata kustom yang akan digunakan oleh filter.
Menambahkan atau menghapus kata dari whitelist pengecualian.
Mengaktifkan deteksi variasi ejaan bahasa Indonesia (misalnya ejaan lama atau substitusi huruf lazim).
Mengaktifkan deteksi kata yang dipisah dengan spasi atau tanda baca (contoh: a-n-j-i-n-g).
Mengaktifkan deteksi kemiripan kata untuk menangkap typo atau variasi penulisan.
| Properti | Tipe | Default | Deskripsi |
|---|---|---|---|
replaceWith |
string |
'*' |
Karakter pengganti kata yang disensor |
fullWordCensor |
boolean |
true |
Sensor seluruh karakter kata |
keepFirstAndLast |
boolean |
false |
Pertahankan huruf pertama dan terakhir saat sensor (a****g) |
useRandomGrawlix |
boolean |
false |
Gunakan karakter simbol acak (#@$%&!) |
detectLeetSpeak |
boolean |
true |
Deteksi variasi angka/simbol (b4b1, 4nj1ng) |
detectSplit |
boolean |
false |
Deteksi kata dengan pemisah (b-a-b-i) |
indonesianVariation |
boolean |
false |
Deteksi variasi ejaan Indonesia |
detectSimilarity |
boolean |
false |
Deteksi kata typo atau mirip |
similarityThreshold |
number |
0.8 |
Batas minimum kemiripan (0 - 1) |
useLevenshtein |
boolean |
false |
Gunakan algoritma Levenshtein distance |
maxLevenshteinDistance |
number |
2 |
Jarak edit maksimum Levenshtein |
checkSubstring |
boolean |
false |
Deteksi kata kotor di dalam substring kata lain |
wordList |
string[] |
[] |
Daftar kata kustom (menggantikan daftar bawaan) |
whitelist |
string[] |
[] |
Daftar kata yang diabaikan dari filter |
categories |
ProfanityCategory[] |
- | Filter hanya kategori tertentu |
regions |
Region[] |
- | Filter hanya daerah tertentu |
severityThreshold |
number |
0 |
Batas keparahan minimum kata (0 - 1) |
import IDProfanityFilter from '@sideid/id-profanity-filter';
const filter = new IDProfanityFilter({
wordList: ['jelek', 'payah', 'curang'],
replaceWith: '#',
});
const teks = 'Kualitas layanannya sangat jelek dan payah!';
const hasil = filter.filter(teks);
console.log(hasil.filtered);
// Output: "Kualitas layanannya sangat ##### dan #####!"import IDProfanityFilter from '@sideid/id-profanity-filter';
const filter = new IDProfanityFilter();
filter.enableLevenshteinDetection(0.8, 2);
const teks = 'Dia benar-benar anjiing sekali!';
const hasil = filter.filter(teks);
console.log(hasil.filtered);
// Output: "Dia benar-benar ******* sekali!"import IDProfanityFilter from '@sideid/id-profanity-filter';
const filter = new IDProfanityFilter();
filter.addToWhitelist('anjing');
const teks = 'Anjing peliharaan saya setia sekali.';
console.log(filter.isProfane(teks)); // falseimport IDProfanityFilter from '@sideid/id-profanity-filter';
const filter = new IDProfanityFilter();
const teks = 'Filmnya bagus sekali. Tapi pemainnya seperti anjing, aktingnya buruk.';
const hasilKalimat = filter.analyzeBySentence(teks);
hasilKalimat.forEach((item) => {
console.log(`${item.sentence} -> ${item.hasProfanity ? 'Kotor' : 'Bersih'}`);
});
// "Filmnya bagus sekali." -> Bersih
// "Tapi pemainnya seperti anjing, aktingnya buruk." -> Kotorgeneral: Bahasa Indonesia umumjawa: Bahasa Jawasunda: Bahasa Sundabetawi: Dialek Betawibatak: Bahasa Batakminang: Bahasa Minangbali: Bahasa Balimadura: Bahasa Maduraaceh: Bahasa Aceh
sexual: Istilah atau aktivitas seksual vulgarinsult: Penghinaan atau caci makiprofanity: Umpatan kasar umumslur: Kata merendahkan SARA / identitasdrugs: Istilah obat-obatan terlarangdisgusting: Kata jorok atau menjijikkanblasphemy: Umpatan penistaan agama
Panduan untuk menambahkan kata baru atau mengembangkan library dapat dilihat di CONTRIBUTING.md.
Proyek ini menggunakan lisensi MIT.