from collections import Counter
import math
corpus = {'support': ['خطا ورود', 'خطا سامانه'],
          'sales': ['قیمت خرید', 'قیمت فروش']}
counts = {c: Counter(' '.join(docs).split()) for c, docs in corpus.items()}
vocab = set().union(*(set(v) for v in counts.values()))
ndocs = sum(len(docs) for docs in corpus.values())
alpha = 1.0

def predict(text):
    terms = [t for t in text.split() if t in vocab]
    if not terms:
        return None, {}
    scores = {}
    for c in corpus:
        prior = len(corpus[c])/ndocs
        denom = sum(counts[c].values())+alpha*len(vocab)
        scores[c] = math.log(prior)+sum(
            math.log((counts[c][t]+alpha)/denom) for t in terms)
    top = max(scores.values())
    weights = {c: math.exp(s-top) for c, s in scores.items()}
    total = sum(weights.values())
    probs = {c: z/total for c, z in weights.items()}
    return max(probs, key=probs.get), probs
label, probs = predict('خطا ورود')
print('vocabulary size', len(vocab))
print(label, {c: round(v, 6) for c, v in probs.items()})
assert len(vocab) == 6 and label == 'support'
assert abs(probs['support']-6/7) < 1e-12
assert predict('ناشناخته')[0] is None
