Reza2kn commited on
Commit
18f64b6
·
verified ·
1 Parent(s): 5a1bd0a

Upload persian_itn.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. persian_itn.py +31 -0
persian_itn.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Persian inverse text normalization (spoken -> digits) for Shenava ASR output.
2
+ # The models spell numbers on purpose; this converts them back at inference time.
3
+ U={"صفر":0,"یک":1,"دو":2,"سه":3,"چهار":4,"پنج":5,"شش":6,"شیش":6,"هفت":7,"هشت":8,"نه":9}
4
+ T={"ده":10,"یازده":11,"دوازده":12,"سیزده":13,"چهارده":14,"پانزده":15,"پونزده":15,"شانزده":16,"شونزده":16,"هفده":17,"هیفده":17,"هجده":18,"هیجده":18,"نوزده":19}
5
+ TY={"بیست":20,"سی":30,"چهل":40,"پنجاه":50,"شصت":60,"هفتاد":70,"هشتاد":80,"نود":90}
6
+ H={"صد":100,"یکصد":100,"دویست":200,"سیصد":300,"چهارصد":400,"پانصد":500,"پونصد":500,"ششصد":600,"شیشصد":600,"هفتصد":700,"هشتصد":800,"نهصد":900}
7
+ S={"هزار":1000,"میلیون":1000000,"میلیارد":1000000000}
8
+ NUM=set(U)|set(T)|set(TY)|set(H)|set(S)
9
+ _FA="۰۱۲۳۴۵۶۷۸۹"
10
+ def _val(w):
11
+ for d in (U,T,TY,H):
12
+ if w in d: return d[w]
13
+ return None
14
+ def itn(text, persian_digits=True):
15
+ ws=text.split(); out=[]; i=0
16
+ while i<len(ws):
17
+ if ws[i] in NUM:
18
+ total=0; cur=0; j=i
19
+ while j<len(ws) and (ws[j] in NUM or ws[j]=="و"):
20
+ w=ws[j]
21
+ if w=="و": j+=1; continue
22
+ if w in S: total+=(cur if cur else 1)*S[w]; cur=0
23
+ else: cur+=_val(w) or 0
24
+ j+=1
25
+ total+=cur
26
+ s=str(total)
27
+ if persian_digits: s="".join(_FA[int(c)] for c in s)
28
+ out.append(s); i=j
29
+ else:
30
+ out.append(ws[i]); i+=1
31
+ return " ".join(out)