@sideid/id-profanity-filter 1.9.5 → 1.10.2
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 -16
- package/.github/workflows/release.yml +62 -0
- package/CONTRIBUTING.md +150 -150
- package/LICENSE +21 -21
- package/README.md +548 -285
- package/dist/config/options.d.ts +24 -0
- package/dist/constants/categories/blasphemy.d.ts +4 -0
- package/dist/constants/categories/disgusting.d.ts +4 -0
- package/dist/constants/categories/drugs.d.ts +4 -0
- package/dist/constants/categories/profanity.d.ts +4 -0
- package/dist/constants/categories/slur.d.ts +4 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +923 -94
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +924 -93
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/utils/ahoCorasick.d.ts +36 -0
- package/dist/utils/similarityUtils.d.ts +35 -0
- package/eslint.config.mjs +40 -0
- package/examples/advanced.ts +120 -0
- package/examples/basic.ts +71 -52
- package/examples/custom-list.ts +140 -0
- package/jest.config.mjs +10 -10
- package/package.json +3 -2
- package/prettierrc +6 -6
- package/rollup.config.mjs +35 -35
- package/src/config/options.ts +2 -0
- package/src/constants/categories/blasphemy.ts +25 -0
- package/src/constants/categories/disgusting.ts +82 -0
- package/src/constants/categories/drugs.ts +72 -0
- package/src/constants/categories/profanity.ts +139 -0
- package/src/constants/categories/slur.ts +102 -0
- package/src/constants/regions/general.ts +111 -2
- package/src/constants/regions/jawa.ts +257 -3
- package/src/constants/wordList.ts +15 -8
- package/src/core/analyzer.ts +28 -13
- package/src/core/filter.ts +178 -37
- package/src/core/matcher.ts +146 -69
- package/src/index.ts +21 -2
- package/src/types/index.ts +4 -2
- package/src/utils/ahoCorasick.ts +179 -0
- package/src/utils/regexUtils.ts +0 -1
- package/src/utils/similarityUtils.ts +239 -7
- package/tsconfig.json +115 -115
- package/.github/workflows/ci.yml +0 -0
- package/src/constants/categories/index.ts +0 -31
- package/src/constants/regions/index.ts +0 -62
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ProfanityWord } from "../../types";
|
|
2
|
+
import { general } from "../regions/general";
|
|
3
|
+
import { jawa } from "../regions/jawa";
|
|
4
|
+
import { sunda } from "../regions/sunda";
|
|
5
|
+
import { betawi } from "../regions/betawi";
|
|
6
|
+
|
|
7
|
+
export const slur: ProfanityWord[] = [
|
|
8
|
+
...general.filter((word) => word.category === "slur"),
|
|
9
|
+
...jawa.filter((word) => word.category === "slur"),
|
|
10
|
+
...sunda.filter((word) => word.category === "slur"),
|
|
11
|
+
...betawi.filter((word) => word.category === "slur"),
|
|
12
|
+
|
|
13
|
+
{
|
|
14
|
+
word: "cina",
|
|
15
|
+
category: "slur",
|
|
16
|
+
region: "general",
|
|
17
|
+
severity: 0.7,
|
|
18
|
+
aliases: ["cino", "china"],
|
|
19
|
+
description:
|
|
20
|
+
"Sebutan yang dianggap merendahkan untuk orang keturunan Tionghoa",
|
|
21
|
+
context: 'Dianggap tidak sopan dan sebaiknya diganti dengan "Tionghoa"',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
word: "banci",
|
|
25
|
+
category: "slur",
|
|
26
|
+
region: "general",
|
|
27
|
+
severity: 0.7,
|
|
28
|
+
aliases: ["bencong", "waria", "bences"],
|
|
29
|
+
description:
|
|
30
|
+
"Istilah merendahkan untuk transgender atau pria yang dianggap feminin",
|
|
31
|
+
context:
|
|
32
|
+
"Digunakan sebagai hinaan terhadap identitas gender atau ekspresi gender seseorang",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
word: "autis",
|
|
36
|
+
category: "slur",
|
|
37
|
+
region: "general",
|
|
38
|
+
severity: 0.6,
|
|
39
|
+
aliases: ["autis lu", "autisan"],
|
|
40
|
+
description: "Penyalahgunaan kondisi medis sebagai hinaan",
|
|
41
|
+
context:
|
|
42
|
+
"Menggunakan kondisi spektrum autisme sebagai hinaan untuk seseorang yang dianggap aneh",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
word: "londo",
|
|
46
|
+
category: "slur",
|
|
47
|
+
region: "jawa",
|
|
48
|
+
severity: 0.5,
|
|
49
|
+
aliases: ["landa", "landi"],
|
|
50
|
+
description: "Sebutan untuk orang Belanda atau orang berkulit putih",
|
|
51
|
+
context: "Dapat bersifat merendahkan tergantung konteks dan nada bicara",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
word: "keling",
|
|
55
|
+
category: "slur",
|
|
56
|
+
region: "general",
|
|
57
|
+
severity: 0.8,
|
|
58
|
+
aliases: ["kaling", "hitam legam"],
|
|
59
|
+
description: "Istilah merendahkan untuk orang India atau berkulit gelap",
|
|
60
|
+
context: "Dianggap sangat tidak sopan dan bernada rasis",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
word: "cacat",
|
|
64
|
+
category: "slur",
|
|
65
|
+
region: "general",
|
|
66
|
+
severity: 0.7,
|
|
67
|
+
aliases: ["cacad", "difabel"],
|
|
68
|
+
description: "Istilah merendahkan untuk penyandang disabilitas",
|
|
69
|
+
context: "Digunakan sebagai hinaan untuk menunjukkan ketidaksempurnaan",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
word: "gembel",
|
|
73
|
+
category: "slur",
|
|
74
|
+
region: "general",
|
|
75
|
+
severity: 0.6,
|
|
76
|
+
aliases: ["gembul", "gelandangan"],
|
|
77
|
+
description: "Istilah merendahkan untuk orang tidak mampu atau tunawisma",
|
|
78
|
+
context: "Mengandung stigma terhadap kemiskinan dan kelas sosial",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
word: "kampungan",
|
|
82
|
+
category: "slur",
|
|
83
|
+
region: "general",
|
|
84
|
+
severity: 0.5,
|
|
85
|
+
aliases: ["ndeso", "katrok", "udik"],
|
|
86
|
+
description: "Istilah merendahkan untuk orang dari daerah pedesaan",
|
|
87
|
+
context:
|
|
88
|
+
"Menyiratkan seseorang tidak beradab, tidak berpendidikan, atau ketinggalan zaman",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
word: "tolol",
|
|
92
|
+
category: "slur",
|
|
93
|
+
region: "general",
|
|
94
|
+
severity: 0.6,
|
|
95
|
+
aliases: ["tololnya", "tolo"],
|
|
96
|
+
description: "Hinaan terhadap kecerdasan seseorang",
|
|
97
|
+
context: "Digunakan untuk menghina kapasitas mental seseorang",
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
export const slurWords = slur.map((item) => item.word);
|
|
102
|
+
export default slur;
|
|
@@ -6,7 +6,7 @@ export const general: ProfanityWord[] = [
|
|
|
6
6
|
category: "profanity",
|
|
7
7
|
region: "general",
|
|
8
8
|
severity: 0.7,
|
|
9
|
-
aliases: ["anjay", "anjir", "anying", "njing", "anj"],
|
|
9
|
+
aliases: ["anjay", "anjir", "anying", "njing", "anj", "anjg", "ajg"],
|
|
10
10
|
description: "Mengacu pada hewan anjing, digunakan sebagai umpatan",
|
|
11
11
|
context: "Umpatan umum untuk menunjukkan kemarahan atau ketidaksetujuan",
|
|
12
12
|
},
|
|
@@ -15,7 +15,7 @@ export const general: ProfanityWord[] = [
|
|
|
15
15
|
category: "profanity",
|
|
16
16
|
region: "general",
|
|
17
17
|
severity: 0.6,
|
|
18
|
-
aliases: ["bab1", "b4b1"],
|
|
18
|
+
aliases: ["bab1", "b4b1", "b4bi", "8481", "8ab1", "ba81"],
|
|
19
19
|
description: "Mengacu pada hewan babi, digunakan sebagai umpatan",
|
|
20
20
|
context: "Umpatan umum untuk menunjukkan kemarahan atau ketidaksetujuan",
|
|
21
21
|
},
|
|
@@ -104,6 +104,115 @@ export const general: ProfanityWord[] = [
|
|
|
104
104
|
description: "Kata yang mengacu pada orang yang banyak bicara",
|
|
105
105
|
context: "Hinaan untuk menyebut orang yang banyak bicara atau cerewet",
|
|
106
106
|
},
|
|
107
|
+
{
|
|
108
|
+
word: "ngentot",
|
|
109
|
+
category: "sexual",
|
|
110
|
+
region: "general",
|
|
111
|
+
severity: 0.9,
|
|
112
|
+
aliases: ["ngentod", "ntot", "tod"],
|
|
113
|
+
description: "Istilah kasar untuk aktivitas seksual",
|
|
114
|
+
context: "Kata vulgar yang merujuk pada aktivitas seksual",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
word: "sialan",
|
|
118
|
+
category: "insult",
|
|
119
|
+
region: "general",
|
|
120
|
+
severity: 0.5,
|
|
121
|
+
aliases: ["sialn", "sl"],
|
|
122
|
+
description: "Kata yang mengacu pada orang yang membawa sial",
|
|
123
|
+
context: "Hinaan untuk menyebut orang yang dianggap membawa sial",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
word: "pler",
|
|
127
|
+
category: "sexual",
|
|
128
|
+
region: "general",
|
|
129
|
+
severity: 0.9,
|
|
130
|
+
aliases: ["peler", "plr", "biji"],
|
|
131
|
+
description: "Istilah kasar untuk alat kelamin laki-laki",
|
|
132
|
+
context: "Kata vulgar yang merujuk pada alat kelamin laki-laki",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
word: "bokep",
|
|
136
|
+
category: "sexual",
|
|
137
|
+
region: "general",
|
|
138
|
+
severity: 0.7,
|
|
139
|
+
aliases: ["bkp", "bokap"],
|
|
140
|
+
description: "Istilah untuk video atau konten pornografi",
|
|
141
|
+
context: "Kata yang mengacu pada materi pornografi",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
word: "coli",
|
|
145
|
+
category: "sexual",
|
|
146
|
+
region: "general",
|
|
147
|
+
severity: 0.8,
|
|
148
|
+
aliases: ["col", "coly"],
|
|
149
|
+
description: "Istilah untuk masturbasi laki-laki",
|
|
150
|
+
context: "Kata vulgar yang merujuk pada aktivitas seksual pribadi",
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
word: "desah",
|
|
154
|
+
category: "sexual",
|
|
155
|
+
region: "general",
|
|
156
|
+
severity: 0.6,
|
|
157
|
+
aliases: ["ds4h", "dsh"],
|
|
158
|
+
description: "Istilah untuk suara yang dibuat selama aktivitas seksual",
|
|
159
|
+
context: "Dapat menjadi vulgar tergantung konteks penggunaan",
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
word: "seks",
|
|
163
|
+
category: "sexual",
|
|
164
|
+
region: "general",
|
|
165
|
+
severity: 0.5,
|
|
166
|
+
aliases: ["sex", "ML"],
|
|
167
|
+
description: "Istilah untuk aktivitas seksual",
|
|
168
|
+
context: "Dapat menjadi vulgar tergantung konteks penggunaan",
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
word: "kondom",
|
|
172
|
+
category: "sexual",
|
|
173
|
+
region: "general",
|
|
174
|
+
severity: 0.5,
|
|
175
|
+
aliases: ["kndm", "kondom", "cd"],
|
|
176
|
+
description: "Alat kontrasepsi",
|
|
177
|
+
context: "Dapat menjadi vulgar tergantung konteks penggunaan",
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
word: "ngewe",
|
|
181
|
+
category: "sexual",
|
|
182
|
+
region: "general",
|
|
183
|
+
severity: 0.9,
|
|
184
|
+
aliases: ["ngew", "we"],
|
|
185
|
+
description: "Istilah kasar untuk aktivitas seksual",
|
|
186
|
+
context: "Kata vulgar yang merujuk pada aktivitas seksual",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
word: "puki",
|
|
190
|
+
category: "sexual",
|
|
191
|
+
region: "general",
|
|
192
|
+
severity: 0.9,
|
|
193
|
+
aliases: ["puk", "pukih"],
|
|
194
|
+
description: "Kata vulgar yang mengacu pada alat kelamin perempuan",
|
|
195
|
+
context: "Kata vulgar yang merujuk pada anatomi seksual",
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
word: "xxx",
|
|
199
|
+
category: "sexual",
|
|
200
|
+
region: "general",
|
|
201
|
+
severity: 0.6,
|
|
202
|
+
aliases: ["xXx", "triplex"],
|
|
203
|
+
description:
|
|
204
|
+
"Simbol yang sering digunakan untuk menandai konten pornografi",
|
|
205
|
+
context: "Digunakan untuk menandai konten seksual eksplisit",
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
word: "xnxx",
|
|
209
|
+
category: "sexual",
|
|
210
|
+
region: "general",
|
|
211
|
+
severity: 0.6,
|
|
212
|
+
aliases: ["xnxx", "xnx"],
|
|
213
|
+
description: "simbol yang sering digunakan untuk menandai konten pornografi",
|
|
214
|
+
context: "Digunakan untuk menandai konten seksual eksplisit",
|
|
215
|
+
}
|
|
107
216
|
];
|
|
108
217
|
|
|
109
218
|
export const generalWords = general.map((item) => item.word);
|
|
@@ -14,7 +14,7 @@ export const jawa: ProfanityWord[] = [
|
|
|
14
14
|
word: "jancok",
|
|
15
15
|
category: "sexual",
|
|
16
16
|
region: "jawa",
|
|
17
|
-
severity: 0.
|
|
17
|
+
severity: 0.9,
|
|
18
18
|
aliases: ["jancuk", "jncok", "jancuk", "jncuk", "dancok", "dancuk"],
|
|
19
19
|
description: "Kata umpatan kasar dalam Bahasa Jawa",
|
|
20
20
|
context: "Umpatan kasar yang umum digunakan di Jawa Timur",
|
|
@@ -52,7 +52,7 @@ export const jawa: ProfanityWord[] = [
|
|
|
52
52
|
word: "mbokne ancok",
|
|
53
53
|
category: "insult",
|
|
54
54
|
region: "jawa",
|
|
55
|
-
severity: 0.
|
|
55
|
+
severity: 0.9,
|
|
56
56
|
aliases: ["mbokne", "mbokneancok"],
|
|
57
57
|
description: "Umpatan yang menyinggung ibu seseorang",
|
|
58
58
|
context: "Umpatan kasar yang menyinggung orangtua orang lain",
|
|
@@ -61,7 +61,7 @@ export const jawa: ProfanityWord[] = [
|
|
|
61
61
|
word: "pekok",
|
|
62
62
|
category: "insult",
|
|
63
63
|
region: "jawa",
|
|
64
|
-
severity: 0.
|
|
64
|
+
severity: 0.7,
|
|
65
65
|
aliases: ["pekak", "pekilk"],
|
|
66
66
|
description: "Kata hinaan yang menunjukkan kebodohan",
|
|
67
67
|
context: "Hinaan untuk menyebut orang yang dianggap sangat bodoh",
|
|
@@ -95,6 +95,260 @@ export const jawa: ProfanityWord[] = [
|
|
|
95
95
|
context:
|
|
96
96
|
"Umpatan ringan untuk menanggapi sesuatu yang dianggap tidak benar",
|
|
97
97
|
},
|
|
98
|
+
{
|
|
99
|
+
word: "kontol",
|
|
100
|
+
category: "sexual",
|
|
101
|
+
region: "jawa",
|
|
102
|
+
severity: 0.8,
|
|
103
|
+
aliases: ["kntl", "kontl"],
|
|
104
|
+
description: "Mengacu ke alat kelamin laki-laki",
|
|
105
|
+
context: "Kata vulgar yang sering digunakan sebagai umpatan kasar",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
word: "tempek",
|
|
109
|
+
category: "sexual",
|
|
110
|
+
region: "jawa",
|
|
111
|
+
severity: 0.8,
|
|
112
|
+
aliases: ["mpek", "torok", "tempk"],
|
|
113
|
+
description: "Mengacu pada alat kelamin perempuan",
|
|
114
|
+
context: "Kata vulgar yang digunakan sebagai umpatan atau hinaan",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
word: "silit",
|
|
118
|
+
category: "insult",
|
|
119
|
+
region: "jawa",
|
|
120
|
+
severity: 0.6,
|
|
121
|
+
aliases: ["selet", "tilis"],
|
|
122
|
+
description: "Mengacu pada bagian dubur atau anus",
|
|
123
|
+
context: "Kata kasar yang digunakan sebagai hinaan",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
word: "mbahmu",
|
|
127
|
+
category: "insult",
|
|
128
|
+
region: "jawa",
|
|
129
|
+
severity: 0.6,
|
|
130
|
+
aliases: ["mbahmu kiper", "mbah mu"],
|
|
131
|
+
description: "Hinaan yang menyinggung nenek/kakek seseorang",
|
|
132
|
+
context: "Umpatan ringan untuk menanggapi sesuatu yang tidak masuk akal",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
word: "makmu",
|
|
136
|
+
category: "insult",
|
|
137
|
+
region: "jawa",
|
|
138
|
+
severity: 0.7,
|
|
139
|
+
aliases: ["mak mu", "mamamu"],
|
|
140
|
+
description: "Hinaan yang menyinggung ibu seseorang",
|
|
141
|
+
context: "Umpatan yang dianggap kasar karena menyinggung orang tua",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
word: "bajingan",
|
|
145
|
+
category: "insult",
|
|
146
|
+
region: "jawa",
|
|
147
|
+
severity: 0.7,
|
|
148
|
+
aliases: [
|
|
149
|
+
"bajilak",
|
|
150
|
+
"bajhingan",
|
|
151
|
+
"bajingak",
|
|
152
|
+
"bajingseng",
|
|
153
|
+
"bajindul",
|
|
154
|
+
"bajigur",
|
|
155
|
+
"jingan",
|
|
156
|
+
],
|
|
157
|
+
description: "Sebutan untuk orang yang dianggap jahat atau tidak bermoral",
|
|
158
|
+
context: "Umpatan untuk mengekspresikan kemarahan atau kekesalan",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
word: "cocote",
|
|
162
|
+
category: "insult",
|
|
163
|
+
region: "jawa",
|
|
164
|
+
severity: 0.6,
|
|
165
|
+
aliases: ["cocot", "bacot", "nyocot"],
|
|
166
|
+
description: "Mengacu pada mulut dengan konotasi negatif",
|
|
167
|
+
context: "Umpatan untuk menyuruh seseorang berhenti berbicara",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
word: "ngentot",
|
|
171
|
+
category: "sexual",
|
|
172
|
+
region: "jawa",
|
|
173
|
+
severity: 0.9,
|
|
174
|
+
aliases: ["kentu", "kentot", "iclik", "ngtt", "iclk"],
|
|
175
|
+
description: "Mengacu pada aktivitas seksual",
|
|
176
|
+
context: "Kata vulgar yang digunakan sebagai umpatan kasar",
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
word: "edan",
|
|
180
|
+
category: "insult",
|
|
181
|
+
region: "jawa",
|
|
182
|
+
severity: 0.5,
|
|
183
|
+
aliases: ["gendeng", "gila", "gendheng", "sarap"],
|
|
184
|
+
description: "Secara harfiah berarti gila atau tidak waras",
|
|
185
|
+
context: "Umpatan untuk menyebut seseorang yang dianggap tidak masuk akal",
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
word: "dapuranmu",
|
|
189
|
+
category: "insult",
|
|
190
|
+
region: "jawa",
|
|
191
|
+
severity: 0.6,
|
|
192
|
+
aliases: ["raimu", "rai mu"],
|
|
193
|
+
description: "Secara harfiah mengacu pada wajah atau rupa seseorang",
|
|
194
|
+
context: "Umpatan untuk menghina penampilan atau wajah seseorang",
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
word: "damput",
|
|
198
|
+
category: "insult",
|
|
199
|
+
region: "jawa",
|
|
200
|
+
severity: 0.7,
|
|
201
|
+
aliases: ["diamput"],
|
|
202
|
+
description: "Variasi bentuk umpatan dengan makna serupa dengan jancok",
|
|
203
|
+
context: "Umpatan kasar untuk mengekspresikan kemarahan",
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
word: "mbathang",
|
|
207
|
+
category: "insult",
|
|
208
|
+
region: "jawa",
|
|
209
|
+
severity: 0.7,
|
|
210
|
+
aliases: ["mbatang"],
|
|
211
|
+
description: "Secara harfiah berarti bangkai",
|
|
212
|
+
context: "Umpatan kasar untuk menghina seseorang",
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
word: "ndlogok",
|
|
216
|
+
category: "insult",
|
|
217
|
+
region: "jawa",
|
|
218
|
+
severity: 0.6,
|
|
219
|
+
aliases: ["ndelodok", "ndlodok"],
|
|
220
|
+
description:
|
|
221
|
+
"Mengacu pada tindakan yang dianggap bodoh atau tidak masuk akal",
|
|
222
|
+
context: "Hinaan untuk mengkritik tindakan seseorang",
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
word: "nggateli",
|
|
226
|
+
category: "insult",
|
|
227
|
+
region: "jawa",
|
|
228
|
+
severity: 0.5,
|
|
229
|
+
aliases: ["gateli", "gathel"],
|
|
230
|
+
description: "Secara harfiah berarti gatal atau menyebalkan",
|
|
231
|
+
context: "Ungkapan untuk menunjukkan kekesalan terhadap perilaku seseorang",
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
word: "perek",
|
|
235
|
+
category: "sexual",
|
|
236
|
+
region: "jawa",
|
|
237
|
+
severity: 0.8,
|
|
238
|
+
aliases: ["lonthe", "pelacur"],
|
|
239
|
+
description: "Istilah merendahkan untuk pekerja seks komersial",
|
|
240
|
+
context: "Kata kasar untuk menghina wanita",
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
word: "picek",
|
|
244
|
+
category: "insult",
|
|
245
|
+
region: "jawa",
|
|
246
|
+
severity: 0.6,
|
|
247
|
+
aliases: ["pcek", "buta"],
|
|
248
|
+
description: "Secara harfiah berarti buta atau tidak bisa melihat",
|
|
249
|
+
context: "Hinaan untuk orang yang dianggap tidak bisa melihat kenyataan",
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
word: "untumu",
|
|
253
|
+
category: "insult",
|
|
254
|
+
region: "jawa",
|
|
255
|
+
severity: 0.5,
|
|
256
|
+
aliases: ["gigimu", "untu mu"],
|
|
257
|
+
description: "Secara harfiah berarti gigimu",
|
|
258
|
+
context: "Umpatan ringan untuk menanggapi sesuatu yang tidak disetujui",
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
word: "goblog",
|
|
262
|
+
category: "insult",
|
|
263
|
+
region: "jawa",
|
|
264
|
+
severity: 0.7,
|
|
265
|
+
aliases: ["ghoblog", "goblok", "gobhlok", "pekok"],
|
|
266
|
+
description: "Kata hinaan yang menunjukkan kebodohan ekstrem",
|
|
267
|
+
context: "Hinaan untuk menyebut seseorang yang dianggap sangat bodoh",
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
word: "tolol",
|
|
271
|
+
category: "insult",
|
|
272
|
+
region: "jawa",
|
|
273
|
+
severity: 0.7,
|
|
274
|
+
aliases: ["tholol", "tlol"],
|
|
275
|
+
description: "Kata hinaan yang menunjukkan kebodohan",
|
|
276
|
+
context: "Hinaan untuk menyebut seseorang yang dianggap bodoh",
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
word: "budheg",
|
|
280
|
+
category: "insult",
|
|
281
|
+
region: "jawa",
|
|
282
|
+
severity: 0.6,
|
|
283
|
+
aliases: ["budeg", "bdeg"],
|
|
284
|
+
description: "Secara harfiah berarti tuli atau tidak bisa mendengar",
|
|
285
|
+
context: "Hinaan untuk orang yang dianggap tidak mau mendengarkan",
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
word: "jiangkrik",
|
|
289
|
+
category: "insult",
|
|
290
|
+
region: "jawa",
|
|
291
|
+
severity: 0.4,
|
|
292
|
+
aliases: ["jiangkrek", "jangkrik"],
|
|
293
|
+
description: "Secara harfiah berarti jangkrik, digunakan sebagai eufemisme",
|
|
294
|
+
context: "Umpatan ringan sebagai pengganti kata kasar yang lebih vulgar",
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
word: "diamput",
|
|
298
|
+
category: "insult",
|
|
299
|
+
region: "jawa",
|
|
300
|
+
severity: 0.8,
|
|
301
|
+
aliases: ["damput", "djamput"],
|
|
302
|
+
description: "Bentuk umpatan kasar dengan makna serupa jancok",
|
|
303
|
+
context: "Kata kasar untuk mengekspresikan kemarahan",
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
word: "celeng",
|
|
307
|
+
category: "insult",
|
|
308
|
+
region: "jawa",
|
|
309
|
+
severity: 0.6,
|
|
310
|
+
aliases: ["cleng", "babi hutan"],
|
|
311
|
+
description: "Secara harfiah berarti babi hutan",
|
|
312
|
+
context: "Hinaan untuk orang yang dianggap jorok atau rakus",
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
word: "kampret",
|
|
316
|
+
category: "insult",
|
|
317
|
+
region: "jawa",
|
|
318
|
+
severity: 0.5,
|
|
319
|
+
aliases: ["kmpret", "kmprt"],
|
|
320
|
+
description: "Secara harfiah berarti kelelawar kecil",
|
|
321
|
+
context: "Umpatan ringan untuk mengekspresikan kekesalan",
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
word: "ndeso",
|
|
325
|
+
category: "insult",
|
|
326
|
+
region: "jawa",
|
|
327
|
+
severity: 0.4,
|
|
328
|
+
aliases: ["ndesa", "deso"],
|
|
329
|
+
description: "Secara harfiah berarti dari desa atau kampungan",
|
|
330
|
+
context:
|
|
331
|
+
"Hinaan untuk orang yang dianggap kurang modern atau berpendidikan",
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
word: "kere",
|
|
335
|
+
category: "insult",
|
|
336
|
+
region: "jawa",
|
|
337
|
+
severity: 0.5,
|
|
338
|
+
aliases: ["miskin", "mlarat"],
|
|
339
|
+
description: "Secara harfiah berarti miskin atau tidak punya uang",
|
|
340
|
+
context: "Hinaan untuk status ekonomi seseorang yang dianggap rendah",
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
word: "itil",
|
|
344
|
+
category: "sexual",
|
|
345
|
+
region: "jawa",
|
|
346
|
+
severity: 0.9,
|
|
347
|
+
aliases: ["itl", "itul"],
|
|
348
|
+
description:
|
|
349
|
+
"Kata vulgar yang mengacu pada bagian dari alat kelamin perempuan",
|
|
350
|
+
context: "Kata vulgar yang merujuk pada anatomi seksual",
|
|
351
|
+
},
|
|
98
352
|
];
|
|
99
353
|
|
|
100
354
|
export const jawaWords = jawa.map((item) => item.word);
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { ProfanityWord } from "../types";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
// import {
|
|
6
|
-
// import {
|
|
7
|
-
// import {
|
|
8
|
-
// import {
|
|
9
|
-
// import { blasphemy, blasphemyWords } from './categories/blasphemy';
|
|
2
|
+
import { sexualWords } from "./categories/sexual";
|
|
3
|
+
import { insultWords } from "./categories/insult";
|
|
4
|
+
// import { profanityWords } from './categories/profanity';
|
|
5
|
+
// import { slurWords } from './categories/slur';
|
|
6
|
+
// import { drugsWords } from './categories/drugs';
|
|
7
|
+
// import { disgustingWords } from './categories/disgusting';
|
|
8
|
+
// import { blasphemyWords } from './categories/blasphemy';
|
|
10
9
|
|
|
11
10
|
import { general, generalWords } from "./regions/general";
|
|
12
11
|
import { jawa, jawaWords } from "./regions/jawa";
|
|
@@ -96,6 +95,14 @@ export const severeWords: string[] = wordObjects
|
|
|
96
95
|
* @returns Array dari kata kotor
|
|
97
96
|
*/
|
|
98
97
|
export function getWordsByFilter(category?: string, region?: string): string[] {
|
|
98
|
+
if (category && !region && category in wordCategories) {
|
|
99
|
+
return wordCategories[category as keyof typeof wordCategories];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (region && !category && region in wordRegions) {
|
|
103
|
+
return wordRegions[region as keyof typeof wordRegions];
|
|
104
|
+
}
|
|
105
|
+
|
|
99
106
|
return wordObjects
|
|
100
107
|
.filter((word) => {
|
|
101
108
|
const matchCategory = category ? word.category === category : true;
|
package/src/core/analyzer.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FilterOptions,
|
|
3
3
|
AnalysisResult,
|
|
4
|
-
ProfanityWord,
|
|
5
4
|
ProfanityCategory,
|
|
6
5
|
Region,
|
|
7
6
|
} from "../types";
|
|
@@ -12,13 +11,11 @@ import {
|
|
|
12
11
|
findRegions,
|
|
13
12
|
calculateSeverity,
|
|
14
13
|
} from "./matcher";
|
|
14
|
+
import { splitIntoSentences } from "../utils/stringUtils";
|
|
15
15
|
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
getContextAroundIndex,
|
|
20
|
-
} from "../utils/stringUtils";
|
|
21
|
-
import { findPossibleProfanityBySimiliarity } from "../utils/similarityUtils";
|
|
16
|
+
findPossibleProfanityBySimiliarity,
|
|
17
|
+
findProfanityByLevenshteinDistance,
|
|
18
|
+
} from "../utils/similarityUtils";
|
|
22
19
|
import { createContextRegex } from "../utils/regexUtils";
|
|
23
20
|
import { DEFAULT_OPTIONS } from "../config/options";
|
|
24
21
|
|
|
@@ -60,12 +57,30 @@ export function analyze(
|
|
|
60
57
|
}> = [];
|
|
61
58
|
|
|
62
59
|
if (mergedOptions.detectSimilarity) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
if (matchDetails.length > 0) {
|
|
61
|
+
const wordList = matchDetails.map((word) => word.word);
|
|
62
|
+
|
|
63
|
+
if (mergedOptions.useLevenshtein) {
|
|
64
|
+
const levenshteinResults = findProfanityByLevenshteinDistance(
|
|
65
|
+
text,
|
|
66
|
+
wordList,
|
|
67
|
+
mergedOptions.similarityThreshold || 0.8,
|
|
68
|
+
mergedOptions.maxLevenshteinDistance || 2,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
similarWords = levenshteinResults.map((item) => ({
|
|
72
|
+
word: item.word,
|
|
73
|
+
original: item.original,
|
|
74
|
+
similarity: item.similarity,
|
|
75
|
+
}));
|
|
76
|
+
} else {
|
|
77
|
+
similarWords = findPossibleProfanityBySimiliarity(
|
|
78
|
+
text,
|
|
79
|
+
wordList,
|
|
80
|
+
mergedOptions.similarityThreshold || 0.8,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
69
84
|
}
|
|
70
85
|
|
|
71
86
|
return {
|