Advertisement
nanorocks

python_lecture_bayes_classifier

Nov 5th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.37 KB | None | 0 0
  1.     from __future__ import print_function
  2.     # !/usr/bin/python
  3.     # -*- coding: utf-8 -*-
  4.  
  5.     import re
  6.     import math
  7.  
  8.  
  9.     def getwords(doc):
  10.         # regularen izraz koj ke go deli stringot na zborovi
  11.         # stringot se deli na zborovi na site prazni mesta i interpunkciski znaci
  12.         splitter = re.compile('\\W*')
  13.         # podeli go dokumentot na zborovi
  14.         # i konvertiraj gi vo mali bukvi
  15.         # pa potoa stavi gi vo lista
  16.         # ako nivnata dolzina e >2 i <20
  17.         words = set()
  18.         for word in splitter.split(doc):
  19.             if 2 < len(word) < 20:
  20.                 words.add(word.lower())
  21.         return words
  22.         # words = [word.lower() for word in splitter.split(doc) if len(word) > 2 and len(word) < 20]
  23.         # # se vrakja recnik cii klucevi se zborovite koi
  24.         # # se vo dokumentot, a eden zbor duri i da se
  25.         # # srekjava poveke pati vo recnikot ke bide samo ednas
  26.         # # vrednosta (1) vo recnikot ne e potrebna
  27.         # return dict([(word, 1) for word in words])
  28.  
  29.  
  30.     # {'python': {'bad': 0, 'good': 6}, 'the': {'bad': 3, 'good': 3}}
  31.     w = getwords("""
  32.         # # se vrakja recnik cii klucevi se zborovite koi
  33.         # # se vo dokumentot, a eden zbor duri i da se
  34.         # # srekjava poveke pati vo recnikot ke bide samo ednas
  35.         # # vrednosta (1) vo recnikot ne e potrebna
  36.     """)
  37.  
  38.  
  39.     # print(w)
  40.     # exit(1)
  41.  
  42.     class documentClassifier:
  43.         def __init__(self, getfeatures, filename=None):
  44.             # Broj na parovi atribut/kategorija (feature/category)
  45.             self.featureCountsPerCategory = {}
  46.             # Broj na dokumenti vo sekoja kategorija
  47.             self.categoryCounts = {}
  48.             # funkcija za dobivanje na atributite (zborovite) vo dokumentot
  49.             self.getfeatures = getfeatures
  50.  
  51.         # Zgolemuvanje na brojot na parovi atribut/kategorija
  52.         def incrementFeatureCountsPerCategory(self, currentFeature, currentCategory):
  53.             self.featureCountsPerCategory.setdefault(currentFeature, {})
  54.             self.featureCountsPerCategory[currentFeature].setdefault(currentCategory, 0)
  55.             self.featureCountsPerCategory[currentFeature][currentCategory] += 1
  56.  
  57.         # Zgolemuvanje na brojot na predmeti(dokumenti) vo kategorija
  58.         def incrementCategoryCounts(self, cat):
  59.             self.categoryCounts.setdefault(cat, 0)
  60.             self.categoryCounts[cat] += 1
  61.  
  62.         # Dobivanje na brojot kolku pati
  63.         # odreden atribut se ima pojaveno vo odredena kategorija
  64.         def getFeatureCountsPerCategory(self, currentFeature, currentCategory):
  65.             if currentFeature in self.featureCountsPerCategory and currentCategory in self.featureCountsPerCategory[
  66.                 currentFeature]:
  67.                 return float(self.featureCountsPerCategory[currentFeature][currentCategory])
  68.             return 0.0
  69.  
  70.         # Dobivanje na brojot na predmeti(dokumenti) vo kategorija
  71.         def getCategoryCount(self, currentCategory):
  72.             if currentCategory in self.categoryCounts:
  73.                 return float(self.categoryCounts[currentCategory])
  74.             return 0
  75.  
  76.         # Dobivanje na vkupniot broj na predmeti
  77.         def getTotalCount(self):
  78.             return sum(self.categoryCounts.values())
  79.  
  80.         # Dobivanje na lista na site kategorii
  81.         def categories(self):
  82.             return self.categoryCounts.keys()
  83.  
  84.         # Treniranje na klasifikatorot
  85.         # Noviot predmet (dokument) item pripagja na kategorijata cat
  86.         def train(self, item, currentCategory):
  87.             # Se zemaat atributite (zborovite) vo predmetot(dokumentot)
  88.             features = self.getfeatures(item)
  89.             # Se zgolemuva brojot na sekoj atribut vo ovaa kategorija
  90.             for currentFeature in features:
  91.                 self.incrementFeatureCountsPerCategory(currentFeature, currentCategory)
  92.  
  93.             # Se zgolemuva brojot na predmeti (dokumenti) vo ovaa kategorija
  94.             self.incrementCategoryCounts(currentCategory)
  95.  
  96.         def getFeaturePerCategoryProbability(self, currentFeature, currentCategory):
  97.             if self.getCategoryCount(currentCategory) == 0: return 0
  98.             # Verojatnosta e vkupniot broj na pati koga
  99.             # ovoj atribut f (zbor) se pojavil vo ovaa
  100.             # kategorija podeleno so vkupniot broj na
  101.             # predmeti (dokumenti) vo ovaa kategorija
  102.             return self.getFeatureCountsPerCategory(currentFeature, currentCategory) / self.getCategoryCount(
  103.                 currentCategory)
  104.  
  105.         def weightedprob(self, currentFeature, currentCategory, prf, weight=1.0, ap=0.5):
  106.             # Presmetaj ja osnovnata verojatnost
  107.             basicprob = prf(currentFeature, currentCategory)
  108.             # Izbroj kolku pati se ima pojaveno ovoj atribut (zbor)
  109.             # vo site kategorii
  110.             totals = sum([self.getFeatureCountsPerCategory(currentFeature, currentCategory) for currentCategory in
  111.                           self.categories()])
  112.             # Presmetaj ja tezinski usrednetata verojatnost
  113.             bp = ((weight * ap) + (totals * basicprob)) / (weight + totals)
  114.             return bp
  115.  
  116.  
  117.     dc = documentClassifier(getwords)
  118.     dc.train("sistemi na znaenje e dosaden predmet", "tracevi")
  119.     dc.train("asistentot po sistemi na znaenje e isto taka dosaden", "tracevi")
  120.     dc.train("vezbite po sistemi na znaenje moze da se podobrat na sledniov nacin...", "kritiki")
  121.     dc.train("predvanjata po sistemi na znaenje ne moze da se podobrat bidejki se najdobri...", "kritiki")
  122.  
  123.  
  124.     class naivebayes(documentClassifier):
  125.         def __init__(self, getfeatures):
  126.             documentClassifier.__init__(self, getfeatures)
  127.             self.thresholds = {}
  128.  
  129.         def setThreshold(self, currentCategory, threshold):
  130.             self.thresholds[currentCategory] = threshold
  131.  
  132.         def getThreshold(self, currentCategory):
  133.             if currentCategory not in self.thresholds: return 1.0
  134.             return self.thresholds[currentCategory]
  135.  
  136.         # ja vrakja verojatnosta na dokumentot da e od klasata cat (cat e odnapred poznata)
  137.         def caclulateDocumentProbabilityInClass(self, item, currentCategory):
  138.             # zemi gi zborovite vo dokumentot item
  139.             features = self.getfeatures(item)
  140.             # pomnozi gi verojatnostite na site zborovi
  141.             p = 1
  142.             for currentFeature in features:
  143.                 p *= self.weightedprob(currentFeature, currentCategory,
  144.                                        self.getFeaturePerCategoryProbability)
  145.  
  146.             return p
  147.  
  148.         # Ja vrakja verojatnosta na klasata ako e poznat dokumentot
  149.         def getCategoryProbabilityForDocument(self, item, currentCategory):
  150.             catprob = self.getCategoryCount(currentCategory) / self.getTotalCount()
  151.             caclulateDocumentProbabilityInClass = self.caclulateDocumentProbabilityInClass(item, currentCategory)
  152.             # Bayes Theorem
  153.             return caclulateDocumentProbabilityInClass * catprob / (1.0 / self.getTotalCount())
  154.  
  155.         # klasificiranje na dokument
  156.         def classifyDocument(self, item, default=None):
  157.             probs = {}
  158.             # najdi ja kategorijata (klasata)
  159.             # so najgolema verojatnost
  160.             max = 0.0
  161.             for cat in self.categories():
  162.                 probs[cat] = self.getCategoryProbabilityForDocument(item, cat)
  163.                 if probs[cat] > max:
  164.                     max = probs[cat]
  165.                     best = cat
  166.  
  167.             # proveri dali verojatnosta e pogolema od
  168.             # threshold*next best (sledna najdobra)
  169.             for cat in probs:
  170.                 if cat == best: continue
  171.                 if probs[cat] * self.getThreshold(best) > probs[best]: return default
  172.  
  173.             return best
  174.  
  175.  
  176.     def sampletrain(cl):
  177.         cl.train("Dali zakate da zarabotite brzi pari? Podignete ja vasata nagrada sega! Online zarabotka.", "bad")
  178.         cl.train("""Od vasata smetka e napravena transakcija vo iznos od 1000 denari.
  179.                 Javete se vo najbliskata ekspozitura za podetalni informacii.""", "good")
  180.         cl.train("Online marketing! Brzi pari bez trud!", "bad")
  181.         cl.train("""Bez da ucam dobiv desetka po ekspertni sistemi""", "good")
  182.         cl.train("""Desetka so kromid za samo 100 denari. Vo vasata maalska kafeana!""", "bad")
  183.  
  184.         # cl.train("Sistemi i kombinacii za sigurni tipovi. Online oblozuvanje","bad")
  185.  
  186.  
  187.     cl = documentClassifier(getwords)
  188.     sampletrain(cl)
  189.  
  190.     print(cl.getFeatureCountsPerCategory("online", "bad"), cl.getFeaturePerCategoryProbability("online", "bad"))
  191.     print(cl.getFeatureCountsPerCategory("vasata", "good"), cl.getFeaturePerCategoryProbability("vasata", "good"))
  192.     print(cl.getFeatureCountsPerCategory("desetka", "good"), cl.getFeaturePerCategoryProbability("desetka", "good"))
  193.     print(cl.getFeatureCountsPerCategory("denari", "bad"), cl.getFeaturePerCategoryProbability("denari", "bad"))
  194.     print(cl.getFeatureCountsPerCategory("online", "good"), cl.getFeaturePerCategoryProbability("online", "good"))
  195.     print(cl.getFeatureCountsPerCategory("sistemi", "good"), cl.getFeaturePerCategoryProbability("sistemi",
  196.                                                                                                  "good"), cl.weightedprob(
  197.         "sistemi", "good", cl.getFeaturePerCategoryProbability))
  198.     print(cl.getFeatureCountsPerCategory("sistemi", "bad"), cl.getFeaturePerCategoryProbability("sistemi",
  199.                                                                                                 "bad"), cl.weightedprob(
  200.         "sistemi", "bad", cl.getFeaturePerCategoryProbability))
  201.  
  202.     exit(1)
  203.     cl = naivebayes(getwords)
  204.     sampletrain(cl)
  205.     cl.setThreshold('bad', 2)
  206.     print(cl.classifyDocument('ekspertni sistemi finki', default='unknown'), cl.getCategoryProbabilityForDocument(
  207.         'ekspertni sistemi finki', 'bad'), cl.getCategoryProbabilityForDocument('ekspertni sistemi finki', 'good'))
  208.     print(cl.classifyDocument('Sistemi i kombinacii za sigurni tipovi. Online oblozuvanje',
  209.                               default='unknown'), cl.getCategoryProbabilityForDocument(
  210.         'Sistemi i kombinacii za sigurni tipovi. Online oblozuvanje', 'bad'), cl.getCategoryProbabilityForDocument(
  211.         'Sistemi i kombinacii za sigurni tipovi. Online oblozuvanje', 'good'))
  212.     print(cl.classifyDocument('cudna recenica za koja ne znam od koja klasa e',
  213.                               default='unknown'), cl.getCategoryProbabilityForDocument(
  214.         'cudna recenica za koja ne znam od koja klasa e', 'bad'), cl.getCategoryProbabilityForDocument(
  215.         'cudna recenica za koja ne znam od koja klasa e', 'good'))
  216.  
  217.     wrd = getwords('cudna recenica za koja ne znam od koja klasa e')
  218.     for w in wrd:
  219.         print(w)
  220.     # 0.05
  221.     # 0.01875
  222.     # (weight*assumedprob + count*getFeaturePerCategoryProbability)/(count+weight)
  223.     # = (1*1.0+1*0.5)/(1.0 + 1.0)
  224.     # = 0.75
  225.  
  226.     # 1.0 0.5 0.5
  227.     # 0.0 0.0 0.25
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement