Spaces:
Sleeping
Sleeping
| 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" | |
| model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2') | |
| codes_emb = model.encode(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() | |