from collections import Counter
import math
docs=['تماس مشتری تماس','مشتری پاسخ','پاسخ سریع']
counts=[Counter(d.split()) for d in docs]
vocabulary=sorted(set().union(*(set(c) for c in counts)))
df={t:sum(t in c for c in counts) for t in vocabulary}
idf={t:math.log((1+len(docs))/(1+df[t]))+1 for t in vocabulary}
def transform(text):
    c=Counter(text.split());row=[c[t]*idf[t] for t in vocabulary]
    norm=math.sqrt(sum(x*x for x in row))
    return [x/norm for x in row] if norm else row
print('vocabulary',vocabulary,'df',df,'idf',idf)
for d in docs:print(d,transform(d))
assert df['تماس']==1 and counts[0]['تماس']==2
assert abs(idf['تماس']-(math.log(2)+1))<1e-12
assert abs(sum(x*x for x in transform(docs[0]))-1)<1e-12
assert transform('واژه_تازه')==[0.]*len(vocabulary)
