@sideid/id-profanity-filter 1.11.0 → 1.11.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +44 -44
- package/.github/workflows/release.yml +62 -0
- package/CONTRIBUTING.md +150 -150
- package/LICENSE +21 -21
- package/README.md +548 -548
- package/dist/index.d.ts +989 -0
- package/dist/index.esm.js +504 -234
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +504 -234
- package/dist/index.js.map +1 -1
- package/dist/types/constants/regions/aceh.d.ts +4 -0
- package/dist/types/constants/regions/bali.d.ts +4 -0
- package/dist/{constants → types/constants}/regions/jawa.d.ts +1 -1
- package/dist/types/index.d.ts +375 -57
- package/dist/types/types/index.d.ts +59 -0
- package/eslint.config.mjs +40 -40
- package/examples/advanced.ts +120 -120
- package/examples/basic.ts +71 -71
- package/examples/custom-list.ts +140 -140
- package/jest.config.mjs +10 -10
- package/package.json +2 -1
- package/prettierrc +6 -6
- package/rollup.config.mjs +40 -35
- package/src/constants/regions/aceh.ts +231 -0
- package/src/constants/regions/bali.ts +168 -0
- package/src/constants/regions/batak.ts +136 -6
- package/src/constants/regions/general.ts +9 -0
- package/src/constants/regions/jawa.ts +367 -229
- package/src/index.ts +15 -15
- package/tsconfig.json +115 -115
- package/.github/workflows/ci.yml +0 -0
- package/dist/constants/categories/index.d.ts +0 -9
- package/dist/constants/regions/index.d.ts +0 -8
- /package/dist/{config → types/config}/options.d.ts +0 -0
- /package/dist/{constants → types/constants}/categories/blasphemy.d.ts +0 -0
- /package/dist/{constants → types/constants}/categories/disgusting.d.ts +0 -0
- /package/dist/{constants → types/constants}/categories/drugs.d.ts +0 -0
- /package/dist/{constants → types/constants}/categories/insult.d.ts +0 -0
- /package/dist/{constants → types/constants}/categories/profanity.d.ts +0 -0
- /package/dist/{constants → types/constants}/categories/sexual.d.ts +0 -0
- /package/dist/{constants → types/constants}/categories/slur.d.ts +0 -0
- /package/dist/{constants → types/constants}/regions/batak.d.ts +0 -0
- /package/dist/{constants → types/constants}/regions/betawi.d.ts +0 -0
- /package/dist/{constants → types/constants}/regions/general.d.ts +0 -0
- /package/dist/{constants → types/constants}/regions/sunda.d.ts +0 -0
- /package/dist/{constants → types/constants}/wordList.d.ts +0 -0
- /package/dist/{core → types/core}/analyzer.d.ts +0 -0
- /package/dist/{core → types/core}/filter.d.ts +0 -0
- /package/dist/{core → types/core}/matcher.d.ts +0 -0
- /package/dist/{utils → types/utils}/ahoCorasick.d.ts +0 -0
- /package/dist/{utils → types/utils}/regexUtils.d.ts +0 -0
- /package/dist/{utils → types/utils}/similarityUtils.d.ts +0 -0
- /package/dist/{utils → types/utils}/stringUtils.d.ts +0 -0
package/examples/advanced.ts
CHANGED
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
import { IDProfanityFilter, idFilter } from '../src/index';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Contoh Penggunaan Lanjutan ID-Profanity-Filter
|
|
5
|
-
* ============================================
|
|
6
|
-
* File ini menunjukkan fitur-fitur lanjutan dari library.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
console.log('=== Contoh Penggunaan Lanjutan ID-Profanity-Filter ===\n');
|
|
10
|
-
|
|
11
|
-
// ===== Contoh 1: Menggunakan preset filter =====
|
|
12
|
-
const filter = new IDProfanityFilter();
|
|
13
|
-
filter.usePreset('strict');
|
|
14
|
-
|
|
15
|
-
console.log('=== Contoh Preset ===\n');
|
|
16
|
-
|
|
17
|
-
const teks1 = 'Saya sangat kesal dengan dia, benar-benar anjing!';
|
|
18
|
-
console.log('Teks asli:', teks1);
|
|
19
|
-
console.log('Preset Strict:', filter.filter(teks1).filtered);
|
|
20
|
-
|
|
21
|
-
// Ganti ke preset childSafe dengan grawlix random
|
|
22
|
-
filter.usePreset('childSafe', { useRandomGrawlix: true });
|
|
23
|
-
console.log('Preset ChildSafe + Grawlix:', filter.filter(teks1).filtered);
|
|
24
|
-
|
|
25
|
-
// Ganti ke preset light (hanya filter kata paling sensitif)
|
|
26
|
-
filter.usePreset('light');
|
|
27
|
-
console.log('Preset Light:', filter.filter(teks1).filtered);
|
|
28
|
-
|
|
29
|
-
// ===== Contoh 2: Deteksi Variasi Penulisan =====
|
|
30
|
-
console.log('\n=== Contoh Deteksi Variasi Penulisan ===\n');
|
|
31
|
-
|
|
32
|
-
filter.setOptions({
|
|
33
|
-
detectLeetSpeak: true,
|
|
34
|
-
indonesianVariation: true,
|
|
35
|
-
detectSplit: true,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
const teks2 =
|
|
39
|
-
'b4b1 adalah binatang yang kotor, sama seperti a-n-j-i-n-g dan d-j-a-r-i-k.';
|
|
40
|
-
console.log('Teks dengan variasi:', teks2);
|
|
41
|
-
console.log('Hasil filter:', filter.filter(teks2).filtered);
|
|
42
|
-
|
|
43
|
-
const leetAnalisis = filter.analyze(teks2);
|
|
44
|
-
console.log('Kata terdeteksi:', leetAnalisis.matches);
|
|
45
|
-
|
|
46
|
-
// ===== Contoh 3: Deteksi Kesamaan Kata =====
|
|
47
|
-
console.log('\n=== Contoh Deteksi Kesamaan Kata ===\n');
|
|
48
|
-
|
|
49
|
-
filter.enableSimilarityDetection(0.8);
|
|
50
|
-
|
|
51
|
-
const teks3 = 'Dia benar-benar anjiing dan gooblok!';
|
|
52
|
-
console.log('Teks dengan typo:', teks3);
|
|
53
|
-
|
|
54
|
-
const similarAnalisis = filter.analyze(teks3);
|
|
55
|
-
console.log('Kata terdeteksi:', similarAnalisis.matches);
|
|
56
|
-
console.log('Analisis kesamaan:', similarAnalisis.similarWords);
|
|
57
|
-
console.log('Hasil filter:', filter.filter(teks3).filtered);
|
|
58
|
-
|
|
59
|
-
// ===== Contoh 4: Analisis dengan Konteks =====
|
|
60
|
-
console.log('\n=== Contoh Analisis dengan Konteks ===\n');
|
|
61
|
-
|
|
62
|
-
const teks4 =
|
|
63
|
-
'Para kritikus film sangat marah dengan kualitas filmnya, mereka menyebut sutradara itu anjing karena mengecewakan penonton dan membuang-buang anggaran.';
|
|
64
|
-
console.log('Teks panjang:', teks4);
|
|
65
|
-
|
|
66
|
-
const konteksAnalisis = filter.analyzeWithContext(teks4, 4);
|
|
67
|
-
console.log('Analisis konteks:');
|
|
68
|
-
konteksAnalisis.forEach((item) => {
|
|
69
|
-
console.log(`- Kata: ${item.word}`);
|
|
70
|
-
console.log(` Konteks: "${item.context}"`);
|
|
71
|
-
console.log(` Posisi: ${item.position.start}-${item.position.end}`);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// ===== Contoh 5: Batch Analisis =====
|
|
75
|
-
console.log('\n=== Contoh Batch Analisis ===\n');
|
|
76
|
-
|
|
77
|
-
const tekstBatch = [
|
|
78
|
-
'Film ini sangat bagus, ceritanya menarik sekali!',
|
|
79
|
-
'Dasar goblok, sialan kamu!',
|
|
80
|
-
'Anjing emang filmnya, sampah banget.',
|
|
81
|
-
'Saya setuju dengan pendapat kritikus tentang film tersebut.',
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
console.log('Batch teks untuk dianalisis:');
|
|
85
|
-
tekstBatch.forEach((t, i) => console.log(`${i + 1}. ${t}`));
|
|
86
|
-
|
|
87
|
-
const batchHasil = filter.batchAnalyze(tekstBatch);
|
|
88
|
-
console.log('\nHasil Batch Analisis:');
|
|
89
|
-
console.log(`- Total teks: ${batchHasil.totalTexts}`);
|
|
90
|
-
console.log(`- Teks dengan kata kotor: ${batchHasil.profaneTexts}`);
|
|
91
|
-
console.log(`- Teks bersih: ${batchHasil.cleanTexts}`);
|
|
92
|
-
console.log(`- Rata-rata keparahan: ${batchHasil.averageSeverity.toFixed(2)}`);
|
|
93
|
-
console.log(`- Kategori terbanyak: ${batchHasil.topCategories.join(', ')}`);
|
|
94
|
-
console.log(`- Daerah terbanyak: ${batchHasil.topRegions.join(', ')}`);
|
|
95
|
-
console.log('- Kata-kata terbanyak:');
|
|
96
|
-
batchHasil.mostFrequentWords.forEach((word) => {
|
|
97
|
-
console.log(` * ${word.word}: ${word.count} kali`);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// ===== Contoh 6: Opsi Kustomisasi Lengkap =====
|
|
101
|
-
console.log('\n=== Contoh Kustomisasi Lengkap ===\n');
|
|
102
|
-
|
|
103
|
-
filter.setOptions({
|
|
104
|
-
replaceWith: '@',
|
|
105
|
-
fullWordCensor: false,
|
|
106
|
-
keepFirstAndLast: true,
|
|
107
|
-
detectLeetSpeak: true,
|
|
108
|
-
indonesianVariation: true,
|
|
109
|
-
detectSimilarity: true,
|
|
110
|
-
similarityThreshold: 0.75,
|
|
111
|
-
detectSplit: true,
|
|
112
|
-
useRandomGrawlix: false,
|
|
113
|
-
categories: ['sexual', 'profanity'],
|
|
114
|
-
regions: ['general', 'jawa'],
|
|
115
|
-
severityThreshold: 0.5,
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const teks6 = 'Dasar b4b1 sialan, kamu ini memang anjiing ya!';
|
|
119
|
-
console.log('Teks asli:', teks6);
|
|
120
|
-
console.log('Hasil kustomisasi lengkap:', filter.filter(teks6).filtered);
|
|
1
|
+
import { IDProfanityFilter, idFilter } from '../src/index';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Contoh Penggunaan Lanjutan ID-Profanity-Filter
|
|
5
|
+
* ============================================
|
|
6
|
+
* File ini menunjukkan fitur-fitur lanjutan dari library.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
console.log('=== Contoh Penggunaan Lanjutan ID-Profanity-Filter ===\n');
|
|
10
|
+
|
|
11
|
+
// ===== Contoh 1: Menggunakan preset filter =====
|
|
12
|
+
const filter = new IDProfanityFilter();
|
|
13
|
+
filter.usePreset('strict');
|
|
14
|
+
|
|
15
|
+
console.log('=== Contoh Preset ===\n');
|
|
16
|
+
|
|
17
|
+
const teks1 = 'Saya sangat kesal dengan dia, benar-benar anjing!';
|
|
18
|
+
console.log('Teks asli:', teks1);
|
|
19
|
+
console.log('Preset Strict:', filter.filter(teks1).filtered);
|
|
20
|
+
|
|
21
|
+
// Ganti ke preset childSafe dengan grawlix random
|
|
22
|
+
filter.usePreset('childSafe', { useRandomGrawlix: true });
|
|
23
|
+
console.log('Preset ChildSafe + Grawlix:', filter.filter(teks1).filtered);
|
|
24
|
+
|
|
25
|
+
// Ganti ke preset light (hanya filter kata paling sensitif)
|
|
26
|
+
filter.usePreset('light');
|
|
27
|
+
console.log('Preset Light:', filter.filter(teks1).filtered);
|
|
28
|
+
|
|
29
|
+
// ===== Contoh 2: Deteksi Variasi Penulisan =====
|
|
30
|
+
console.log('\n=== Contoh Deteksi Variasi Penulisan ===\n');
|
|
31
|
+
|
|
32
|
+
filter.setOptions({
|
|
33
|
+
detectLeetSpeak: true,
|
|
34
|
+
indonesianVariation: true,
|
|
35
|
+
detectSplit: true,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const teks2 =
|
|
39
|
+
'b4b1 adalah binatang yang kotor, sama seperti a-n-j-i-n-g dan d-j-a-r-i-k.';
|
|
40
|
+
console.log('Teks dengan variasi:', teks2);
|
|
41
|
+
console.log('Hasil filter:', filter.filter(teks2).filtered);
|
|
42
|
+
|
|
43
|
+
const leetAnalisis = filter.analyze(teks2);
|
|
44
|
+
console.log('Kata terdeteksi:', leetAnalisis.matches);
|
|
45
|
+
|
|
46
|
+
// ===== Contoh 3: Deteksi Kesamaan Kata =====
|
|
47
|
+
console.log('\n=== Contoh Deteksi Kesamaan Kata ===\n');
|
|
48
|
+
|
|
49
|
+
filter.enableSimilarityDetection(0.8);
|
|
50
|
+
|
|
51
|
+
const teks3 = 'Dia benar-benar anjiing dan gooblok!';
|
|
52
|
+
console.log('Teks dengan typo:', teks3);
|
|
53
|
+
|
|
54
|
+
const similarAnalisis = filter.analyze(teks3);
|
|
55
|
+
console.log('Kata terdeteksi:', similarAnalisis.matches);
|
|
56
|
+
console.log('Analisis kesamaan:', similarAnalisis.similarWords);
|
|
57
|
+
console.log('Hasil filter:', filter.filter(teks3).filtered);
|
|
58
|
+
|
|
59
|
+
// ===== Contoh 4: Analisis dengan Konteks =====
|
|
60
|
+
console.log('\n=== Contoh Analisis dengan Konteks ===\n');
|
|
61
|
+
|
|
62
|
+
const teks4 =
|
|
63
|
+
'Para kritikus film sangat marah dengan kualitas filmnya, mereka menyebut sutradara itu anjing karena mengecewakan penonton dan membuang-buang anggaran.';
|
|
64
|
+
console.log('Teks panjang:', teks4);
|
|
65
|
+
|
|
66
|
+
const konteksAnalisis = filter.analyzeWithContext(teks4, 4);
|
|
67
|
+
console.log('Analisis konteks:');
|
|
68
|
+
konteksAnalisis.forEach((item) => {
|
|
69
|
+
console.log(`- Kata: ${item.word}`);
|
|
70
|
+
console.log(` Konteks: "${item.context}"`);
|
|
71
|
+
console.log(` Posisi: ${item.position.start}-${item.position.end}`);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// ===== Contoh 5: Batch Analisis =====
|
|
75
|
+
console.log('\n=== Contoh Batch Analisis ===\n');
|
|
76
|
+
|
|
77
|
+
const tekstBatch = [
|
|
78
|
+
'Film ini sangat bagus, ceritanya menarik sekali!',
|
|
79
|
+
'Dasar goblok, sialan kamu!',
|
|
80
|
+
'Anjing emang filmnya, sampah banget.',
|
|
81
|
+
'Saya setuju dengan pendapat kritikus tentang film tersebut.',
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
console.log('Batch teks untuk dianalisis:');
|
|
85
|
+
tekstBatch.forEach((t, i) => console.log(`${i + 1}. ${t}`));
|
|
86
|
+
|
|
87
|
+
const batchHasil = filter.batchAnalyze(tekstBatch);
|
|
88
|
+
console.log('\nHasil Batch Analisis:');
|
|
89
|
+
console.log(`- Total teks: ${batchHasil.totalTexts}`);
|
|
90
|
+
console.log(`- Teks dengan kata kotor: ${batchHasil.profaneTexts}`);
|
|
91
|
+
console.log(`- Teks bersih: ${batchHasil.cleanTexts}`);
|
|
92
|
+
console.log(`- Rata-rata keparahan: ${batchHasil.averageSeverity.toFixed(2)}`);
|
|
93
|
+
console.log(`- Kategori terbanyak: ${batchHasil.topCategories.join(', ')}`);
|
|
94
|
+
console.log(`- Daerah terbanyak: ${batchHasil.topRegions.join(', ')}`);
|
|
95
|
+
console.log('- Kata-kata terbanyak:');
|
|
96
|
+
batchHasil.mostFrequentWords.forEach((word) => {
|
|
97
|
+
console.log(` * ${word.word}: ${word.count} kali`);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// ===== Contoh 6: Opsi Kustomisasi Lengkap =====
|
|
101
|
+
console.log('\n=== Contoh Kustomisasi Lengkap ===\n');
|
|
102
|
+
|
|
103
|
+
filter.setOptions({
|
|
104
|
+
replaceWith: '@',
|
|
105
|
+
fullWordCensor: false,
|
|
106
|
+
keepFirstAndLast: true,
|
|
107
|
+
detectLeetSpeak: true,
|
|
108
|
+
indonesianVariation: true,
|
|
109
|
+
detectSimilarity: true,
|
|
110
|
+
similarityThreshold: 0.75,
|
|
111
|
+
detectSplit: true,
|
|
112
|
+
useRandomGrawlix: false,
|
|
113
|
+
categories: ['sexual', 'profanity'],
|
|
114
|
+
regions: ['general', 'jawa'],
|
|
115
|
+
severityThreshold: 0.5,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const teks6 = 'Dasar b4b1 sialan, kamu ini memang anjiing ya!';
|
|
119
|
+
console.log('Teks asli:', teks6);
|
|
120
|
+
console.log('Hasil kustomisasi lengkap:', filter.filter(teks6).filtered);
|
package/examples/basic.ts
CHANGED
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
import { IDProfanityFilter, idFilter } from '../src/index';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Contoh Penggunaan Dasar ID-Profanity-Filter
|
|
5
|
-
* ==========================================
|
|
6
|
-
* File ini menunjukkan fungsi dasar dari library.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
console.log('=== Contoh Penggunaan Dasar ID-Profanity-Filter ===\n');
|
|
10
|
-
|
|
11
|
-
// ===== Contoh 1: Inisialisasi dasar =====
|
|
12
|
-
const filter = new IDProfanityFilter();
|
|
13
|
-
|
|
14
|
-
const teks = 'Dasar anjing kamu, jangan banyak bacot!';
|
|
15
|
-
console.log('Teks asli:', teks);
|
|
16
|
-
|
|
17
|
-
// Cek apakah teks mengandung kata kotor
|
|
18
|
-
const hasProfanity = filter.isProfane(teks);
|
|
19
|
-
console.log('Mengandung kata kotor?', hasProfanity);
|
|
20
|
-
|
|
21
|
-
// Filter kata kotor (sensorisasi)
|
|
22
|
-
const hasil = filter.filter(teks);
|
|
23
|
-
console.log('Teks disensor:', hasil.filtered);
|
|
24
|
-
console.log('Jumlah kata disensor:', hasil.censored);
|
|
25
|
-
console.log('Detail penggantian:', hasil.replacements);
|
|
26
|
-
|
|
27
|
-
console.log('\n=== Contoh Analisis Dasar ===\n');
|
|
28
|
-
|
|
29
|
-
// Analisis konten
|
|
30
|
-
const analisis = filter.analyze(teks);
|
|
31
|
-
console.log('Mengandung kata kotor?', analisis.hasProfanity);
|
|
32
|
-
console.log('Kata-kata kotor yang ditemukan:', analisis.matches);
|
|
33
|
-
console.log('Kategori kata kotor:', analisis.categories);
|
|
34
|
-
console.log('Daerah asal kata:', analisis.regions);
|
|
35
|
-
console.log('Tingkat keparahan:', analisis.severityScore.toFixed(2));
|
|
36
|
-
|
|
37
|
-
console.log('\n=== Contoh Fungsi Statis ===\n');
|
|
38
|
-
|
|
39
|
-
// Menggunakan fungsi statis
|
|
40
|
-
const staticResult = idFilter.filter(teks);
|
|
41
|
-
console.log('Teks disensor (fungsi statis):', staticResult.filtered);
|
|
42
|
-
|
|
43
|
-
// ===== Contoh 2: Mengubah karakter pengganti =====
|
|
44
|
-
filter.setOptions({ replaceWith: '#' });
|
|
45
|
-
console.log('\nTeks disensor dengan #:', filter.filter(teks).filtered);
|
|
46
|
-
|
|
47
|
-
// ===== Contoh 3: Hanya menyensor sebagian kata =====
|
|
48
|
-
filter.setOptions({
|
|
49
|
-
replaceWith: '*',
|
|
50
|
-
fullWordCensor: false,
|
|
51
|
-
keepFirstAndLast: true,
|
|
52
|
-
});
|
|
53
|
-
console.log(
|
|
54
|
-
'\nTeks disensor sebagian (first & last):',
|
|
55
|
-
filter.filter(teks).filtered,
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
// ===== Contoh 4: Metode analisis lain =====
|
|
59
|
-
const kalimat =
|
|
60
|
-
'Saya sangat suka filmnya. Tapi pemainnya seperti anjing, aktingnya buruk.';
|
|
61
|
-
console.log('\nContoh kalimat untuk analisis per-kalimat:', kalimat);
|
|
62
|
-
|
|
63
|
-
const kalimatAnalisis = filter.analyzeBySentence(kalimat);
|
|
64
|
-
console.log('\nAnalisis per-kalimat:');
|
|
65
|
-
kalimatAnalisis.forEach((hasil, index) => {
|
|
66
|
-
console.log(`Kalimat ${index + 1}: ${hasil.sentence}`);
|
|
67
|
-
console.log(`- Mengandung kata kotor: ${hasil.hasProfanity}`);
|
|
68
|
-
if (hasil.hasProfanity) {
|
|
69
|
-
console.log(`- Kata kotor: ${hasil.matches.join(', ')}`);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
1
|
+
import { IDProfanityFilter, idFilter } from '../src/index';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Contoh Penggunaan Dasar ID-Profanity-Filter
|
|
5
|
+
* ==========================================
|
|
6
|
+
* File ini menunjukkan fungsi dasar dari library.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
console.log('=== Contoh Penggunaan Dasar ID-Profanity-Filter ===\n');
|
|
10
|
+
|
|
11
|
+
// ===== Contoh 1: Inisialisasi dasar =====
|
|
12
|
+
const filter = new IDProfanityFilter();
|
|
13
|
+
|
|
14
|
+
const teks = 'Dasar anjing kamu, jangan banyak bacot!';
|
|
15
|
+
console.log('Teks asli:', teks);
|
|
16
|
+
|
|
17
|
+
// Cek apakah teks mengandung kata kotor
|
|
18
|
+
const hasProfanity = filter.isProfane(teks);
|
|
19
|
+
console.log('Mengandung kata kotor?', hasProfanity);
|
|
20
|
+
|
|
21
|
+
// Filter kata kotor (sensorisasi)
|
|
22
|
+
const hasil = filter.filter(teks);
|
|
23
|
+
console.log('Teks disensor:', hasil.filtered);
|
|
24
|
+
console.log('Jumlah kata disensor:', hasil.censored);
|
|
25
|
+
console.log('Detail penggantian:', hasil.replacements);
|
|
26
|
+
|
|
27
|
+
console.log('\n=== Contoh Analisis Dasar ===\n');
|
|
28
|
+
|
|
29
|
+
// Analisis konten
|
|
30
|
+
const analisis = filter.analyze(teks);
|
|
31
|
+
console.log('Mengandung kata kotor?', analisis.hasProfanity);
|
|
32
|
+
console.log('Kata-kata kotor yang ditemukan:', analisis.matches);
|
|
33
|
+
console.log('Kategori kata kotor:', analisis.categories);
|
|
34
|
+
console.log('Daerah asal kata:', analisis.regions);
|
|
35
|
+
console.log('Tingkat keparahan:', analisis.severityScore.toFixed(2));
|
|
36
|
+
|
|
37
|
+
console.log('\n=== Contoh Fungsi Statis ===\n');
|
|
38
|
+
|
|
39
|
+
// Menggunakan fungsi statis
|
|
40
|
+
const staticResult = idFilter.filter(teks);
|
|
41
|
+
console.log('Teks disensor (fungsi statis):', staticResult.filtered);
|
|
42
|
+
|
|
43
|
+
// ===== Contoh 2: Mengubah karakter pengganti =====
|
|
44
|
+
filter.setOptions({ replaceWith: '#' });
|
|
45
|
+
console.log('\nTeks disensor dengan #:', filter.filter(teks).filtered);
|
|
46
|
+
|
|
47
|
+
// ===== Contoh 3: Hanya menyensor sebagian kata =====
|
|
48
|
+
filter.setOptions({
|
|
49
|
+
replaceWith: '*',
|
|
50
|
+
fullWordCensor: false,
|
|
51
|
+
keepFirstAndLast: true,
|
|
52
|
+
});
|
|
53
|
+
console.log(
|
|
54
|
+
'\nTeks disensor sebagian (first & last):',
|
|
55
|
+
filter.filter(teks).filtered,
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
// ===== Contoh 4: Metode analisis lain =====
|
|
59
|
+
const kalimat =
|
|
60
|
+
'Saya sangat suka filmnya. Tapi pemainnya seperti anjing, aktingnya buruk.';
|
|
61
|
+
console.log('\nContoh kalimat untuk analisis per-kalimat:', kalimat);
|
|
62
|
+
|
|
63
|
+
const kalimatAnalisis = filter.analyzeBySentence(kalimat);
|
|
64
|
+
console.log('\nAnalisis per-kalimat:');
|
|
65
|
+
kalimatAnalisis.forEach((hasil, index) => {
|
|
66
|
+
console.log(`Kalimat ${index + 1}: ${hasil.sentence}`);
|
|
67
|
+
console.log(`- Mengandung kata kotor: ${hasil.hasProfanity}`);
|
|
68
|
+
if (hasil.hasProfanity) {
|
|
69
|
+
console.log(`- Kata kotor: ${hasil.matches.join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
});
|
package/examples/custom-list.ts
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
import { IDProfanityFilter, idFilter, FilterOptions } from '../src/index';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Contoh Penggunaan ID-Profanity-Filter dengan Daftar Kustom
|
|
5
|
-
* =======================================================
|
|
6
|
-
* File ini menunjukkan cara menggunakan library dengan daftar kata kustom.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
console.log('=== Contoh Penggunaan dengan Daftar Kata Kustom ===\n');
|
|
10
|
-
|
|
11
|
-
// ===== Contoh 1: Menggunakan daftar kata kustom =====
|
|
12
|
-
// Daftar kata kotor kustom
|
|
13
|
-
const customBadWords = ['jelek', 'buruk', 'sampah', 'payah', 'lemah', 'amatir'];
|
|
14
|
-
|
|
15
|
-
// Buat instance dengan daftar kata kustom
|
|
16
|
-
const filter = new IDProfanityFilter({
|
|
17
|
-
wordList: customBadWords,
|
|
18
|
-
replaceWith: '#',
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const teks1 = 'Film itu sangat jelek dan payah, sepertinya dibuat oleh amatir.';
|
|
22
|
-
console.log('Teks asli:', teks1);
|
|
23
|
-
console.log('Hasil filter kustom:', filter.filter(teks1).filtered);
|
|
24
|
-
|
|
25
|
-
// ===== Contoh 2: Menggabungkan daftar kata kustom dengan daftar bawaan =====
|
|
26
|
-
console.log('\n=== Menggabungkan Daftar Kata ===\n');
|
|
27
|
-
|
|
28
|
-
// Reset filter ke pengaturan default
|
|
29
|
-
filter.setOptions({});
|
|
30
|
-
|
|
31
|
-
// Tambahkan kata-kata kustom tapi tetap deteksi kata-kata bawaan
|
|
32
|
-
const teks2 = 'Film itu sangat jelek dan payah, dibuat oleh anjing amatir.';
|
|
33
|
-
console.log('Teks asli:', teks2);
|
|
34
|
-
|
|
35
|
-
// Analisis hanya dengan kata bawaan
|
|
36
|
-
console.log('Analisis standar:');
|
|
37
|
-
const standarAnalisis = filter.analyze(teks2);
|
|
38
|
-
console.log('- Kata terdeteksi:', standarAnalisis.matches);
|
|
39
|
-
|
|
40
|
-
// Tambahkan kata kustom
|
|
41
|
-
filter.setWordList([...customBadWords]);
|
|
42
|
-
console.log('\nAnalisis dengan kata kustom ditambahkan:');
|
|
43
|
-
const customAnalisis = filter.analyze(teks2);
|
|
44
|
-
console.log('- Kata terdeteksi:', customAnalisis.matches);
|
|
45
|
-
|
|
46
|
-
// ===== Contoh 3: Whitelist untuk pengecualian kontekstual =====
|
|
47
|
-
console.log('\n=== Penggunaan Whitelist ===\n');
|
|
48
|
-
|
|
49
|
-
// Kita ingin kata "anjing" diperbolehkan jika dalam konteks binatang
|
|
50
|
-
filter.setOptions({});
|
|
51
|
-
filter.addToWhitelist('anjing');
|
|
52
|
-
|
|
53
|
-
const teks3a = 'Anjing adalah hewan peliharaan yang setia.';
|
|
54
|
-
const teks3b = 'Dasar anjing kamu, tidak punya perasaan!';
|
|
55
|
-
|
|
56
|
-
console.log('Teks dengan konteks binatang:', teks3a);
|
|
57
|
-
console.log('Terdeteksi sebagai kata kotor?', filter.isProfane(teks3a));
|
|
58
|
-
|
|
59
|
-
// Tambahkan kembali "anjing" ke daftar kata kotor
|
|
60
|
-
filter.removeFromWhitelist('anjing');
|
|
61
|
-
console.log('\nSetelah dihapus dari whitelist:');
|
|
62
|
-
console.log('Terdeteksi sebagai kata kotor?', filter.isProfane(teks3a));
|
|
63
|
-
|
|
64
|
-
// ===== Contoh 4: Membuat preset kustom =====
|
|
65
|
-
console.log('\n=== Membuat Preset Kustom ===\n');
|
|
66
|
-
|
|
67
|
-
// Kita bisa membuat preset filter kustom
|
|
68
|
-
const myCustomPreset: FilterOptions = {
|
|
69
|
-
replaceWith: '●', // Karakter pengganti
|
|
70
|
-
fullWordCensor: false,
|
|
71
|
-
keepFirstAndLast: true,
|
|
72
|
-
detectLeetSpeak: true,
|
|
73
|
-
indonesianVariation: true,
|
|
74
|
-
detectSplit: false,
|
|
75
|
-
useRandomGrawlix: false,
|
|
76
|
-
categories: ['insult', 'profanity'],
|
|
77
|
-
severityThreshold: 0.3,
|
|
78
|
-
whitelist: ['anjing'], // Untuk konteks binatang
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
const teks4 = 'Anjing itu lucu, tidak seperti si goblok dan bego itu.';
|
|
82
|
-
console.log('Teks asli:', teks4);
|
|
83
|
-
|
|
84
|
-
// Gunakan preset kustom
|
|
85
|
-
filter.setOptions(myCustomPreset);
|
|
86
|
-
console.log('Hasil preset kustom:', filter.filter(teks4).filtered);
|
|
87
|
-
|
|
88
|
-
// ===== Contoh 5: Filter berdasarkan kategori atau daerah saja =====
|
|
89
|
-
console.log('\n=== Filter Berdasarkan Kategori atau Daerah ===\n');
|
|
90
|
-
|
|
91
|
-
// Filter hanya kata dari kategori "sexual"
|
|
92
|
-
filter.setOptions({
|
|
93
|
-
categories: ['sexual'],
|
|
94
|
-
wordList: [], // Reset daftar kata kustom
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
const teks5 =
|
|
98
|
-
'Ngewe dan bokep itu kata kotor, bego dan anjing tidak terfilter.';
|
|
99
|
-
console.log('Teks asli:', teks5);
|
|
100
|
-
console.log('Filter hanya kategori sexual:', filter.filter(teks5).filtered);
|
|
101
|
-
|
|
102
|
-
// Filter hanya kata dari daerah "jawa"
|
|
103
|
-
filter.setOptions({
|
|
104
|
-
categories: [],
|
|
105
|
-
regions: ['jawa'],
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
const teks5b = 'Kata jancuk dan cuk dari Jawa, anjing adalah kata umum.';
|
|
109
|
-
console.log('\nTeks asli:', teks5b);
|
|
110
|
-
console.log('Filter hanya daerah jawa:', filter.filter(teks5b).filtered);
|
|
111
|
-
|
|
112
|
-
// ===== Contoh 6: Custom wordList dengan metadata =====
|
|
113
|
-
console.log('\n=== Custom wordList dengan Metadata ===\n');
|
|
114
|
-
|
|
115
|
-
// Ini contoh jika Anda ingin membuat daftar kata lengkap dengan metadata
|
|
116
|
-
const customWordsWithMetadata = [
|
|
117
|
-
{
|
|
118
|
-
word: 'jelek',
|
|
119
|
-
category: 'insult' as any,
|
|
120
|
-
region: 'general' as any,
|
|
121
|
-
severity: 0.4,
|
|
122
|
-
aliases: ['jelex', 'jlk'],
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
word: 'payah',
|
|
126
|
-
category: 'insult' as any,
|
|
127
|
-
region: 'general' as any,
|
|
128
|
-
severity: 0.3,
|
|
129
|
-
aliases: ['pyh', 'payaah'],
|
|
130
|
-
},
|
|
131
|
-
];
|
|
132
|
-
|
|
133
|
-
// Namun untuk filter sederhana, cukup gunakan kata-kata saja
|
|
134
|
-
filter.setOptions({
|
|
135
|
-
wordList: customWordsWithMetadata.map((w) => w.word),
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
const teks6 = 'Performanya sangat jelek dan payah sekali.';
|
|
139
|
-
console.log('Teks asli:', teks6);
|
|
140
|
-
console.log('Filter dengan wordList kustom:', filter.filter(teks6).filtered);
|
|
1
|
+
import { IDProfanityFilter, idFilter, FilterOptions } from '../src/index';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Contoh Penggunaan ID-Profanity-Filter dengan Daftar Kustom
|
|
5
|
+
* =======================================================
|
|
6
|
+
* File ini menunjukkan cara menggunakan library dengan daftar kata kustom.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
console.log('=== Contoh Penggunaan dengan Daftar Kata Kustom ===\n');
|
|
10
|
+
|
|
11
|
+
// ===== Contoh 1: Menggunakan daftar kata kustom =====
|
|
12
|
+
// Daftar kata kotor kustom
|
|
13
|
+
const customBadWords = ['jelek', 'buruk', 'sampah', 'payah', 'lemah', 'amatir'];
|
|
14
|
+
|
|
15
|
+
// Buat instance dengan daftar kata kustom
|
|
16
|
+
const filter = new IDProfanityFilter({
|
|
17
|
+
wordList: customBadWords,
|
|
18
|
+
replaceWith: '#',
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const teks1 = 'Film itu sangat jelek dan payah, sepertinya dibuat oleh amatir.';
|
|
22
|
+
console.log('Teks asli:', teks1);
|
|
23
|
+
console.log('Hasil filter kustom:', filter.filter(teks1).filtered);
|
|
24
|
+
|
|
25
|
+
// ===== Contoh 2: Menggabungkan daftar kata kustom dengan daftar bawaan =====
|
|
26
|
+
console.log('\n=== Menggabungkan Daftar Kata ===\n');
|
|
27
|
+
|
|
28
|
+
// Reset filter ke pengaturan default
|
|
29
|
+
filter.setOptions({});
|
|
30
|
+
|
|
31
|
+
// Tambahkan kata-kata kustom tapi tetap deteksi kata-kata bawaan
|
|
32
|
+
const teks2 = 'Film itu sangat jelek dan payah, dibuat oleh anjing amatir.';
|
|
33
|
+
console.log('Teks asli:', teks2);
|
|
34
|
+
|
|
35
|
+
// Analisis hanya dengan kata bawaan
|
|
36
|
+
console.log('Analisis standar:');
|
|
37
|
+
const standarAnalisis = filter.analyze(teks2);
|
|
38
|
+
console.log('- Kata terdeteksi:', standarAnalisis.matches);
|
|
39
|
+
|
|
40
|
+
// Tambahkan kata kustom
|
|
41
|
+
filter.setWordList([...customBadWords]);
|
|
42
|
+
console.log('\nAnalisis dengan kata kustom ditambahkan:');
|
|
43
|
+
const customAnalisis = filter.analyze(teks2);
|
|
44
|
+
console.log('- Kata terdeteksi:', customAnalisis.matches);
|
|
45
|
+
|
|
46
|
+
// ===== Contoh 3: Whitelist untuk pengecualian kontekstual =====
|
|
47
|
+
console.log('\n=== Penggunaan Whitelist ===\n');
|
|
48
|
+
|
|
49
|
+
// Kita ingin kata "anjing" diperbolehkan jika dalam konteks binatang
|
|
50
|
+
filter.setOptions({});
|
|
51
|
+
filter.addToWhitelist('anjing');
|
|
52
|
+
|
|
53
|
+
const teks3a = 'Anjing adalah hewan peliharaan yang setia.';
|
|
54
|
+
const teks3b = 'Dasar anjing kamu, tidak punya perasaan!';
|
|
55
|
+
|
|
56
|
+
console.log('Teks dengan konteks binatang:', teks3a);
|
|
57
|
+
console.log('Terdeteksi sebagai kata kotor?', filter.isProfane(teks3a));
|
|
58
|
+
|
|
59
|
+
// Tambahkan kembali "anjing" ke daftar kata kotor
|
|
60
|
+
filter.removeFromWhitelist('anjing');
|
|
61
|
+
console.log('\nSetelah dihapus dari whitelist:');
|
|
62
|
+
console.log('Terdeteksi sebagai kata kotor?', filter.isProfane(teks3a));
|
|
63
|
+
|
|
64
|
+
// ===== Contoh 4: Membuat preset kustom =====
|
|
65
|
+
console.log('\n=== Membuat Preset Kustom ===\n');
|
|
66
|
+
|
|
67
|
+
// Kita bisa membuat preset filter kustom
|
|
68
|
+
const myCustomPreset: FilterOptions = {
|
|
69
|
+
replaceWith: '●', // Karakter pengganti
|
|
70
|
+
fullWordCensor: false,
|
|
71
|
+
keepFirstAndLast: true,
|
|
72
|
+
detectLeetSpeak: true,
|
|
73
|
+
indonesianVariation: true,
|
|
74
|
+
detectSplit: false,
|
|
75
|
+
useRandomGrawlix: false,
|
|
76
|
+
categories: ['insult', 'profanity'],
|
|
77
|
+
severityThreshold: 0.3,
|
|
78
|
+
whitelist: ['anjing'], // Untuk konteks binatang
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const teks4 = 'Anjing itu lucu, tidak seperti si goblok dan bego itu.';
|
|
82
|
+
console.log('Teks asli:', teks4);
|
|
83
|
+
|
|
84
|
+
// Gunakan preset kustom
|
|
85
|
+
filter.setOptions(myCustomPreset);
|
|
86
|
+
console.log('Hasil preset kustom:', filter.filter(teks4).filtered);
|
|
87
|
+
|
|
88
|
+
// ===== Contoh 5: Filter berdasarkan kategori atau daerah saja =====
|
|
89
|
+
console.log('\n=== Filter Berdasarkan Kategori atau Daerah ===\n');
|
|
90
|
+
|
|
91
|
+
// Filter hanya kata dari kategori "sexual"
|
|
92
|
+
filter.setOptions({
|
|
93
|
+
categories: ['sexual'],
|
|
94
|
+
wordList: [], // Reset daftar kata kustom
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const teks5 =
|
|
98
|
+
'Ngewe dan bokep itu kata kotor, bego dan anjing tidak terfilter.';
|
|
99
|
+
console.log('Teks asli:', teks5);
|
|
100
|
+
console.log('Filter hanya kategori sexual:', filter.filter(teks5).filtered);
|
|
101
|
+
|
|
102
|
+
// Filter hanya kata dari daerah "jawa"
|
|
103
|
+
filter.setOptions({
|
|
104
|
+
categories: [],
|
|
105
|
+
regions: ['jawa'],
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const teks5b = 'Kata jancuk dan cuk dari Jawa, anjing adalah kata umum.';
|
|
109
|
+
console.log('\nTeks asli:', teks5b);
|
|
110
|
+
console.log('Filter hanya daerah jawa:', filter.filter(teks5b).filtered);
|
|
111
|
+
|
|
112
|
+
// ===== Contoh 6: Custom wordList dengan metadata =====
|
|
113
|
+
console.log('\n=== Custom wordList dengan Metadata ===\n');
|
|
114
|
+
|
|
115
|
+
// Ini contoh jika Anda ingin membuat daftar kata lengkap dengan metadata
|
|
116
|
+
const customWordsWithMetadata = [
|
|
117
|
+
{
|
|
118
|
+
word: 'jelek',
|
|
119
|
+
category: 'insult' as any,
|
|
120
|
+
region: 'general' as any,
|
|
121
|
+
severity: 0.4,
|
|
122
|
+
aliases: ['jelex', 'jlk'],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
word: 'payah',
|
|
126
|
+
category: 'insult' as any,
|
|
127
|
+
region: 'general' as any,
|
|
128
|
+
severity: 0.3,
|
|
129
|
+
aliases: ['pyh', 'payaah'],
|
|
130
|
+
},
|
|
131
|
+
];
|
|
132
|
+
|
|
133
|
+
// Namun untuk filter sederhana, cukup gunakan kata-kata saja
|
|
134
|
+
filter.setOptions({
|
|
135
|
+
wordList: customWordsWithMetadata.map((w) => w.word),
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const teks6 = 'Performanya sangat jelek dan payah sekali.';
|
|
139
|
+
console.log('Teks asli:', teks6);
|
|
140
|
+
console.log('Filter dengan wordList kustom:', filter.filter(teks6).filtered);
|