rblueeyes commited on
Commit
b658d34
·
verified ·
1 Parent(s): 2973419

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +117 -0
app.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ import gradio as gr
3
+ from transformers import pipeline
4
+
5
+ # =========================
6
+ # LOAD MODEL (ONCE)
7
+ # =========================
8
+ classifier = pipeline(
9
+ "zero-shot-classification",
10
+ model="joeddav/xlm-roberta-large-xnli",
11
+ device=-1
12
+ )
13
+
14
+ # =========================
15
+ # SEMANTIC EVENT DEFINITIONS
16
+ # =========================
17
+ SEMANTIC_EVENT = {
18
+ "sadisme": [
19
+ "kekerasan ekstrem yang menyebabkan penderitaan fisik parah pada manusia",
20
+ "penyiksaan tubuh manusia hingga kematian",
21
+ "pengorbanan manusia secara kejam"
22
+ ],
23
+ "kekerasan_fisik": [
24
+ "tindakan fisik yang melukai tubuh manusia",
25
+ "serangan fisik yang menyebabkan cedera atau kematian"
26
+ ],
27
+ "kekerasan_verbal": [
28
+ "ancaman serius terhadap seseorang",
29
+ "penghinaan keras dan intimidasi verbal"
30
+ ],
31
+ "seksual": [
32
+ "aktivitas seksual eksplisit antara manusia",
33
+ "tindakan seksual yang digambarkan secara jelas"
34
+ ],
35
+ "perjudian": [
36
+ "aktivitas perjudian dengan taruhan uang atau barang"
37
+ ],
38
+ "narkoba": [
39
+ "penggunaan atau peredaran narkotika atau obat terlarang"
40
+ ]
41
+ }
42
+
43
+ # =========================
44
+ # UTILITIES
45
+ # =========================
46
+ def split_kalimat(text):
47
+ return [
48
+ s.strip()
49
+ for s in re.split(r'(?<=[.!?])\s+', text)
50
+ if len(s.strip()) >= 30
51
+ ]
52
+
53
+ def sliding_window(kalimat, window=4):
54
+ return [
55
+ " ".join(kalimat[i:i+window])
56
+ for i in range(len(kalimat) - window + 1)
57
+ ]
58
+
59
+ def rating_usia(kategori):
60
+ if "sadisme" in kategori:
61
+ return 21
62
+ if any(k in kategori for k in ["seksual", "perjudian", "narkoba"]):
63
+ return 17
64
+ if any(k in kategori for k in ["kekerasan_fisik", "kekerasan_verbal"]):
65
+ return 13
66
+ return 0
67
+
68
+ # =========================
69
+ # CORE ANALYSIS FUNCTION
70
+ # =========================
71
+ def analyze_story(judul, isi):
72
+ if not isi or len(isi) < 100:
73
+ return {
74
+ "categories": [],
75
+ "age_rating": 0
76
+ }
77
+
78
+ kalimat = split_kalimat(isi)
79
+ windows = sliding_window(kalimat)
80
+
81
+ detected = set()
82
+
83
+ for window in windows:
84
+ for kategori, desc in SEMANTIC_EVENT.items():
85
+ result = classifier(
86
+ window,
87
+ desc,
88
+ hypothesis_template="Teks ini mengandung {}."
89
+ )
90
+ if max(result["scores"]) >= 0.80:
91
+ detected.add(kategori)
92
+
93
+ return {
94
+ "categories": sorted(list(detected)),
95
+ "age_rating": rating_usia(detected)
96
+ }
97
+
98
+ # =========================
99
+ # GRADIO INTERFACE
100
+ # =========================
101
+ def api_wrapper(judul, isi):
102
+ result = analyze_story(judul, isi)
103
+ return result
104
+
105
+ demo = gr.Interface(
106
+ fn=api_wrapper,
107
+ inputs=[
108
+ gr.Textbox(label="Judul", lines=1),
109
+ gr.Textbox(label="Isi Cerita", lines=12)
110
+ ],
111
+ outputs=gr.JSON(label="Hasil Analisis"),
112
+ title="READEAR — Semantic Content Rating",
113
+ description="Analisis konten cerita berbasis semantic (zero-shot NLP)"
114
+ )
115
+
116
+ if __name__ == "__main__":
117
+ demo.launch()