File size: 6,298 Bytes
461ddce
d55a3fa
461ddce
d55a3fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28515db
461ddce
6f2a4ac
f7ffbe2
 
5b4b168
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e620d3
5c3e8ed
0e620d3
34c95c1
5b4b168
0e620d3
d55a3fa
461ddce
 
 
20b1263
 
461ddce
f7ffbe2
6f2a4ac
 
 
28515db
6f2a4ac
e454ccf
a194399
6f2a4ac
e454ccf
 
 
 
f7ffbe2
6a8ac6d
a194399
 
8420bc3
d55a3fa
 
a194399
d55a3fa
1ca4016
d55a3fa
 
20b1263
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28515db
 
 
6f2a4ac
 
28515db
 
d55a3fa
20b1263
461ddce
d55a3fa
 
 
 
 
461ddce
d55a3fa
461ddce
d55a3fa
461ddce
d55a3fa
 
 
 
 
 
 
 
461ddce
d55a3fa
 
461ddce
 
 
 
 
f7ffbe2
 
 
 
 
 
 
 
6f2a4ac
f7ffbe2
6f2a4ac
461ddce
f7ffbe2
28515db
 
 
20b1263
 
28515db
 
461ddce
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import gradio as gr
import re

from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim


codes = """001 - Vehicle Registration (New)
002 - Vehicle Registration Renewal
003 - Vehicle Ownership Transfer
004 - Vehicle De-registration
005 - Lost Registration Certificate Replacement
006 - Address Change Update
007 - Vehicle Data Correction
008 - Ownership Name Correction
009 - Vehicle Tax Payment
010 - Late Payment Fee Processing
011 - Vehicle Type/Specification Update
012 - BBNKB (Transfer Fee of Vehicle Ownership)
013 - STNK Issuance (Vehicle Registration Certificate)
014 - STNK Renewal
015 - Motor Vehicle Roadworthiness Inspection
016 - Plate Number Renewal
017 - Lost Plate Replacement
018 - Vehicle Export Registration
019 - Vehicle Import Registration
020 - Fleet Vehicle Registration
021 - Bulk Vehicle Registration Update
022 - Vehicle Insurance Assistance
023 - Vehicle Accident Reporting
024 - Vehicle Usage Change Declaration (e.g., personal to commercial)
025 - Legal Document Verification
026 - Ownership Transfer for Inherited Vehicle
027 - STNK Temporary Suspension
028 - Proof of Ownership Document Update
029 - Vehicle Ownership History Check
030 - Vehicle Tax Recalculation Request
031 - Tax Exemption Application (for special cases)
032 - Deceased Owner’s Vehicle Ownership Transfer""".split("\n")

undetected = "099 - Other/Undetected"


codes = """001 - Pendaftaran Kendaraan (Baru)
002 - Pembaruan Pendaftaran Kendaraan
003 - Alih Kepemilikan Kendaraan
004 - Pembatalan Pendaftaran Kendaraan
005 - Penggantian Sertifikat Pendaftaran Kendaraan yang Hilang
006 - Pembaruan Perubahan Alamat
007 - Koreksi Data Kendaraan
008 - Koreksi Nama Kepemilikan
009 - Pembayaran Pajak Kendaraan
010 - Proses Denda Keterlambatan Pembayaran
011 - Pembaruan Jenis/Spesifikasi Kendaraan
012 - BBNKB
013 - Penerbitan STNK (Sertifikat Pendaftaran Kendaraan)
014 - Pembaruan STNK
015 - Pemeriksaan Kelayakan Jalan Kendaraan Bermotor
016 - Pembaruan Nomor Plat Kendaraan
017 - Penggantian Plat yang Hilang
018 - Pendaftaran Ekspor Kendaraan
019 - Pendaftaran Impor Kendaraan
020 - Pendaftaran Kendaraan Armada
021 - Pembaruan Pendaftaran Kendaraan Massal
022 - Bantuan Asuransi Kendaraan
023 - Pelaporan Kecelakaan Kendaraan
024 - Deklarasi Perubahan Penggunaan Kendaraan (misalnya, pribadi ke komersial)
025 - Verifikasi Dokumen Hukum
026 - Alih Kepemilikan Kendaraan Warisan
027 - Penangguhan Sementara STNK
028 - Pembaruan Dokumen Bukti Kepemilikan
029 - Pemeriksaan Riwayat Kepemilikan Kendaraan
030 - Permintaan Perhitungan Ulang Pajak Kendaraan
031 - Permohonan Pembebasan Pajak (untuk kasus khusus)
032 - Alih Kepemilikan Kendaraan Pemilik yang Meninggal""".split("\n")

undetected = "099 - Lainnya/Tidak Terdeteksi"

model_id = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
# model_id = "Alibaba-NLP/gte-multilingual-base"
# model_id = "BAAI/bge-m3"
model = SentenceTransformer(model_id, trust_remote_code=True)

codes_emb = model.encode([x[6:] for x in codes])

def respond(
    message,
    history: list[tuple[str, str]],
    threshold,
    is_multiple
):
    global codes_emb
    global undetected

    undetected_code = undetected[:3]

    if history and history[-1][-1][21:24] == undetected_code: 
        list_his = ""
        for his in history[::-1]:
            if his[-1][21:24] != undetected_code:
                break
            list_his = his[0] + "\n" + list_his

        message += "\n" + list_his
    
    # pattern = r'\b([A-Z]{1,2})\s?(\d{4})\s?([A-Z]{3})\b'
    # pattern = r'\b([A-Z]{1,2})\s?(\d{4})\s?([A-Z]{1,3})\b'
    pattern = r'\b([A-Za-z]{1,2})\s?(\d{4})\s?([A-Za-z]{1,3})\b'

    matches = re.findall(pattern, message)

    plate_numbers = ", ".join([" ".join(x) for i,x in enumerate(matches)]).upper()
    
    text_emb = model.encode(message)
    scores = cos_sim(codes_emb, text_emb)[:,0]

    if is_multiple:
        request_details = []
        request_numbers = []
        for i,score in enumerate(scores):
            if score > threshold:
                request_details.append(codes[i][6:])
                request_numbers.append(codes[i][:3])

        if not request_details:
            request_details.append(undetected[6:])
            request_numbers.append(undetected_code)

        request_numbers = "\n".join(request_numbers)
        request_details = "\n".join(request_details)

        return "Request code number:\n" + request_numbers + "\nRequest detail:\n" + request_details + "\nPlate numbers: " + plate_numbers


    s_max = scores.argmax()

    if scores[s_max] < threshold:
        # request_code = "033 - Other/Undetected"
        request_code = undetected
    else:
        request_code = codes[scores.argmax()]

    return "Request code number: " + request_code[:3] + "\nRequest detail: " + request_code[6:] + "\nPlate numbers: " + plate_numbers

    # for val in history:
    #     if val[0]:
    #         messages.append({"role": "user", "content": val[0]})
    #     if val[1]:
    #         messages.append({"role": "assistant", "content": val[1]})

    # messages.append({"role": "user", "content": message})

    # response = ""

    # for message in client.chat_completion(
    #     messages,
    #     max_tokens=max_tokens,
    #     stream=True,
    #     temperature=temperature,
    #     top_p=top_p,
    # ):
    #     token = message.choices[0].delta.content

    #     response += token
    #     yield response


"""
For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
"""
# demo = gr.ChatInterface(
#     respond,
# )


with gr.Blocks() as demo:
    # Add header title and description
    gr.Markdown("# List of Request Numbers")
    gr.Markdown("<br>".join(codes) + "<br>" + undetected)
    gr.Markdown("# Valid License Plate Number Criteria:")
    gr.Markdown("(1-2 letters) (4 numbers) (1-3 letters)")

    # Add chat interface
    chat_interface = gr.ChatInterface(
        respond, 
        additional_inputs=[
            gr.Number(0.5, label="confidence threshold", show_label=True, minimum=0., maximum=1.0, step=0.1),
            gr.Checkbox(label="multiple", info="Allow multiple request code numbers"),
        ]
    )

if __name__ == "__main__":
    demo.launch()