jonathanjordan21 commited on
Commit
0cf1760
·
verified ·
1 Parent(s): 2c510c1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -147
app.py CHANGED
@@ -588,172 +588,128 @@ def build_outputs(results, descriptions, result_details, plate_number):
588
 
589
  app = FastAPI()
590
 
591
- @app.get("/")
592
- def greet_json():
 
 
 
 
 
593
  global codes_emb
594
  global undetected
595
 
596
  undetected_code = undetected[:3]
597
-
598
- # if history and history[-1][-1][21:24] == undetected_code:
599
- # list_his = ""
600
- # for his in history[::-1]:
601
- # if his[-1][21:24] != undetected_code:
602
- # break
603
- # list_his = his[0] + "\n" + list_his
604
-
605
- # message += "\n" + list_his
606
 
607
- # pattern = r'\b([A-Z]{1,2})\s?(\d{4})\s?([A-Z]{3})\b'
608
- # pattern = r'\b([A-Z]{1,2})\s?(\d{4})\s?([A-Z]{1,3})\b'
609
- pattern = r'\b([A-Za-z]{1,2})\s?(\d{4})\s?([A-Za-z]{1,3})\b'
610
 
 
 
611
  matches = re.findall(pattern, message)
612
-
613
  plates = [" ".join(x).upper() for i,x in enumerate(matches)]
614
 
615
- plate_numbers = ", ".join(plates)
616
 
617
- # if model.config._name_or_path in model_ids[-2:]:
618
  if type(model) == CrossEncoder:
619
- # documents = [v["name"] for v in detail_perhitungan.values()]
620
- sentence_pairs = [[message, v["name"]] for v in detail_perhitungan.values()]
621
- # sentence_pairs = [[message, doc] for doc in documents]
622
  scores = model.predict(sentence_pairs, convert_to_tensor=True)
623
- weights = [1,1,1,1,1,1,1,1,1]
624
- # scores = [x["score"] for x in model.rank(message, documents)]
625
  else:
626
  text_emb = model.encode(message)
627
  scores = cos_sim(codes_emb, text_emb).mean(axis=-1)#[:,0]
628
- weights = [19,8,7,6,5,4,3,2,1]
629
-
630
  scores_argsort = scores.argsort(descending=True)
631
-
632
-
633
- # if n_num == 0:
634
- # std = scores.std()
635
- # else:
636
- # std = 0
637
- if n_num == 0:
638
- # w_avg = np.average(scores[scores_argsort].numpy(), weights=range(len(scores),0,-1))
639
- w_avg = np.average(scores[scores_argsort].numpy(), weights=weights)
640
- else:
641
- w_avg = 9999
642
- #[::-1]
643
-
644
- if is_multiple:
645
- request_details = []
646
- request_numbers = []
647
- request_scores = []
648
- # request_undetected = False
649
- # for i,score in enumerate(scores):
650
- if scores[scores_argsort[0]] < threshold:
651
- request_details.append(undetected[6:])
652
- request_numbers.append(undetected_code)
653
- else:
654
- for i in scores_argsort:
655
- # if scores[scores_argsort[0]] - std <= scores[i]:
656
- if scores[i] > w_avg:
657
- request_details.append(codes[i][6:])
658
- request_numbers.append(codes[i][:3])
659
- request_scores.append(str( round(scores[i].tolist(), 3) ) )
660
- else:
661
- if len(request_scores) >= n_num:
662
- break
663
- if scores[i] > threshold:
664
- request_details.append(codes[i][6:])
665
- request_numbers.append(codes[i][:3])
666
- request_scores.append(str( round(scores[i].tolist(), 3) ) )
667
-
668
-
669
- request_numbers_copy = request_numbers
670
- request_details_copy = request_details
671
-
672
- request_numbers = "\n".join(request_numbers)
673
- request_details = "\n".join(request_details)
674
- request_scores = "\n".join(request_scores)
675
-
676
- # if len(request_numbers_copy) > 0:
677
- # for code, detail in zip(request_numbers_copy, request_details_copy):
678
- # kode_mohon = detail_perhitungan.get(code)
679
- # formula = kode_mohon.get("formula")
680
- # description = inspect.getsource(formula).split(":", 2)[-1].strip()
681
-
682
- # if request_undetected and len(plates) == 0:
683
- # + f"\n\nConfidence score:\n{request_scores}"
684
- # return "Request code number:\n" + request_numbers + "\n\nRequest detail:\n" + request_details + "\n\nPlate numbers: " + plate_numbers
685
- print(request_scores)
686
- out = ""
687
- for plate in plates:
688
- results, descriptions, result_details = [], [], []
689
- for code in request_numbers_copy:
690
- result, description, result_detail = get_calculation(code, plate)
691
-
692
- if result != None:
693
- results.append(result)
694
- if descriptions != None:
695
- descriptions.append(description)
696
- result_details.append(result_detail)
697
-
698
- if results:
699
- out += "\n\n" + build_outputs(results, descriptions, result_details, plate)
700
- elif vehicle_tax_info.get(plate):
701
- out += "\n\n" + build_output_vehicle(plate)
702
-
703
- if out == "":
704
- descriptions, result_details = [], []
705
- for code in request_numbers_copy:
706
- result, description, result_detail = get_calculation(code, "")
707
- if description != None:
708
- descriptions.append(description)
709
- result_details.append(result_detail)
710
- if descriptions:
711
- out += "\n\n" + build_output_formula(descriptions, result_details)
712
- else:
713
- return "Request code number: " + request_numbers + "\nRequest detail: " + request_details + "\nPlate numbers: " + plate_numbers
714
-
715
- return {"results":out}
716
-
717
- # result, description, result_detailget_calculation(request_code, plate_number)
718
-
719
-
720
-
721
- s_max = scores.argmax()
722
-
723
- if scores[s_max] < threshold:
724
- # request_code = "033 - Other/Undetected"
725
- request_code = undetected
726
- else:
727
- request_code = codes[scores.argmax()]
728
- # "{:.2f}".format(a)
729
 
730
- # out = "Request code number: " + request_code[:3] + "\nRequest detail: " + request_code[6:] + f"\nConfidence score: {round(scores[s_max].tolist(),3)}" + "\nPlate numbers: " + plate_numbers
731
 
732
  out = ""
733
- for plate in plates:
734
- results, descriptions, result_details = [], [], []
735
- result, description, result_detail = get_calculation(request_code[:3], plate)
736
-
737
- if result != None:
738
- results.append(result)
739
- descriptions.append(description)
740
- result_details.append(result_detail)
741
- out += "\n\n" + build_outputs(results, descriptions, result_details, plate)
742
- elif vehicle_tax_info.get(plate):
743
- out += "\n\n" + build_output_vehicle(plate)
744
- elif description != None:
745
- descriptions.append(description)
746
- result_details.append(result_detail)
747
- out += "\n\n" + build_output_formula(descriptions, result_details)
748
- # else:
749
- # # + f"\nConfidence score: {round(scores[s_max].tolist(),3)}"
750
- # out += "Request code number: " + request_code[:3] + "\nRequest detail: " + "\nPlate numbers: " + plate_numbers
751
-
752
- if out == "":
753
- if request_code[:3] == undetected_code:
754
- return "Request code number: " + request_code[:3] + "\nRequest detail: " + request_code[6:] + "\nPlate numbers: " + plate_numbers
755
  else:
756
- result, description, result_detail = get_calculation(request_code[:3], "")
757
- out += build_output_formula([description], [result_detail])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
758
 
759
  return {"results":out}
 
588
 
589
  app = FastAPI()
590
 
591
+ @app.post("/")
592
+ def greet_json(
593
+ message : str,
594
+ threshold : float = 0.0005,
595
+ tarif_pkb : float = 0.015,
596
+ tarif_bbnkb : float = 0.1,
597
+ ):
598
  global codes_emb
599
  global undetected
600
 
601
  undetected_code = undetected[:3]
 
 
 
 
 
 
 
 
 
602
 
603
+ # tarif_pkb = 1.5/100
604
+ # tarif_bbnkb = 0.1
 
605
 
606
+ pattern = r'\b([A-Za-z]{1,2})\s?(\d{2,4})\s?([A-Za-z]{1,3})\b'
607
+
608
  matches = re.findall(pattern, message)
609
+
610
  plates = [" ".join(x).upper() for i,x in enumerate(matches)]
611
 
 
612
 
 
613
  if type(model) == CrossEncoder:
614
+ sentence_pairs = [[message, v[6:]] for v in codes]
 
 
615
  scores = model.predict(sentence_pairs, convert_to_tensor=True)
616
+ weights = [9,8]
 
617
  else:
618
  text_emb = model.encode(message)
619
  scores = cos_sim(codes_emb, text_emb).mean(axis=-1)#[:,0]
620
+ weights = [11,9]
621
+
622
  scores_argsort = scores.argsort(descending=True)
623
+ w_avg = np.average(scores[scores_argsort].numpy(), weights=weights)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
624
 
 
625
 
626
  out = ""
627
+
628
+ for inp in plates:
629
+
630
+ vehicle = df_sample[df_sample["no_polisi"] == inp.strip()].copy()
631
+
632
+ if vehicle.shape[0] == 0:
633
+ out += f"\n\n---\nKendaraan {inp} Tidak Ditemukan\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
634
  else:
635
+ vehicle["nm_pemilik"] = censor_middle(vehicle["nm_pemilik"].values[0], -1)
636
+ vehicle["al_pemilik"] = censor_middle(vehicle["al_pemilik"].values[0], -1)
637
+
638
+ v_type = vehicle["nm_jenis_kb"].values[0]
639
+ nilai_jual = vehicle["nilai_jual"].values[0]
640
+ pnbp_stnk = vehicle["pnbp_stnk"].values[0]
641
+ pnbp_tnkb = vehicle["pnbp_tnkb"].values[0]
642
+
643
+ bobot = df_bobot[df_bobot["JENIS_KENDARAAN"]==v_type]["BOBOT"].values[0]
644
+
645
+ bbnkb = tarif_bbnkb * nilai_jual * 1 # pengenaan
646
+ pkb = tarif_pkb * bobot * nilai_jual * 1 # pengenaan
647
+
648
+ vehicle["nilai_jual"] = f"Rp{int(nilai_jual):,}"
649
+ out += "\n\n---\nDetail Kendaraan:"
650
+ for k,v in vehicle.iloc[0].items():
651
+ out += f"\n{k} \t\t: {v}"
652
+ # out += "\n=================================================================="
653
+
654
+ out += "\n--"
655
+
656
+ if scores[scores_argsort[0]] < threshold:
657
+ continue
658
+
659
+ header_rincian = "| POKOK | DENDA | TOTAL ||\n|-:|-:|-:|:-|\n"
660
+ rincian = "\n\n### RINCIAN:\n\n" + header_rincian
661
+
662
+ is_rincian = False
663
+
664
+ out_k = ""
665
+
666
+ if scores[0] > w_avg:
667
+ out += f"\nBBNKB \t\t: {int(bbnkb):,}"
668
+
669
+ out_k += "\nRumus Bea Balik Nama Kendaraan Bermotor (BBNKB) : TARIF x NJKB x PENGENAAN"
670
+ out_k += f"\nKalkulasi : {tarif_bbnkb*100}% x Rp{int(nilai_jual):,} x 100%"
671
+ out_k += f"\nTotal Pembayaran : Rp{int(bbnkb):,}\n"
672
+ rincian += f"|{int(bbnkb):,}|0|{int(bbnkb):,}|BBNKB|\n"
673
+ is_rincian = True
674
+ else:
675
+ bbnkb = 0
676
+
677
+ if scores[1] > w_avg:
678
+ d = datetime.now().date() - vehicle["tg_akhir_pkb"].values[0]
679
+ d = d.days // 365
680
+ if d < 1:
681
+ d = 1
682
+ # swdkllj = 35000
683
+ swdkllj = dict_swdkllj.get(vehicle["gol"].values[0])
684
+
685
+ out += f"\nPKB \t\t: {int(pkb*d):,}"
686
+ out += f"\nSWDKLLJ \t\t: {int(swdkllj*d):,}"
687
+ out += f"\nPNBP STNK \t\t:{int(pnbp_stnk):,}"
688
+ out += f"\nPNBP TNKB \t\t:{int(pnbp_tnkb):,}"
689
+ out += f"\nTOTAL \t\t: {int(pkb*d + swdkllj*d + pnbp_stnk + pnbp_tnkb + bbnkb):,}"
690
+
691
+ out_k += "\nRumus Pokok Pajak Kendaraan Bermotor (PKB) : TARIF * NJKB * BOBOT * PENGENAAN * TAHUN BAYAR"
692
+ out_k += f"\nKalkulasi : {tarif_pkb*100}% * Rp{int(nilai_jual):,} * {bobot} * 100% * {d}"
693
+ out_k += f"\nTotal Pembayaran : Rp{int(pkb*d):,}\n"
694
+ out_k += "\nRumus Total PKB: PKB + SWDKLLJ + PNBP STNK + PNBP TNKB"
695
+ out_k += f"\nKalkulasi : Rp{int(pkb*d):,} + Rp{int(swdkllj*d):,} + Rp{int(pnbp_stnk):,} + Rp{int(pnbp_tnkb):,}"
696
+ out_k += f"\nTotal Pembayaran : Rp{int(pkb*d + swdkllj*d + pnbp_stnk + pnbp_tnkb):,}\n"
697
+
698
+ rincian += f"|{int(pkb*d):,}|0|{int(pkb*d):,}|PKB|\n" + f"|{int(swdkllj*d):,}|0|{int(swdkllj*d):,}|SWDKLLJ|\n\n"
699
+ rincian_pkb = "### RINCIAN PKB:\n\n| POKOK | DENDA | TOTAL |\n|-:|-:|-:|\n"
700
+ rincian_swdkllj = "### RINCIAN SWDKLLJ:\n\n| POKOK | DENDA | TOTAL |\n|-:|-:|-:|\n"
701
+ for i in range(d):
702
+ rincian_pkb += f"|{int(pkb):,}|0|{int(pkb):,}|PKB|\n"
703
+ rincian_swdkllj += f"|{int(swdkllj):,}|0|{int(swdkllj):,}|PKB|\n"
704
+ rincian += rincian_pkb + "\n" + rincian_swdkllj
705
+ is_rincian = True
706
+ out += out_k
707
+ if is_rincian:
708
+ out += rincian
709
+ if not out and scores[scores_argsort[0]] >= threshold:
710
+ if scores[0] > w_avg:
711
+ out += "\nRumus Bea Balik Nama Kendaraan Bermotor (BBNKB) : TARIF x NJKB x PENGENAAN"
712
+ if scores[1] > w_avg:
713
+ out += "\nRumus Pokok Pajak Kendaraan Bermotor (PKB) : TARIF * NJKB * BOBOT * PENGENAAN"
714
 
715
  return {"results":out}