Upload persian_itn.py with huggingface_hub
Browse files- 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)
|