2026. június 12., péntek

AI machine learning naiv Bayes osztályozó

Ez a kód tökéletesen bemutatja az AI logikáját: van benne tanítási fázis (adatok beolvasása) és következtetési/predikciós fázis (döntéshozatal a tanult statisztikák alapján).a gépi tanulás (Machine Learning) alapjainak kézzel történő leprogramozása.Az alábbiakban egy egyszerű, mégis látványos példát mutatok: egy Naiv Bayes osztályozót, amely képes megtanulni és eldönteni szövegekről (pl. emailekről), hogy azok spamek-e vagy sem. Megszámolja a szavak előfordulási gyakoriságát, és Bayes tétele alapján számol valószínűséget.
------------------------
import math
import re
from collections import defaultdict


class NaiveBayesClassifier:

    def __init__(self):
        # Osztályok gyakorisága (spam / nem_spam)
        self.class_counts = defaultdict(int)
        # Szavak gyakorisága osztályonként: {osztály: {szó: darabszám}}
        self.vocab_counts = defaultdict(lambda: defaultdict(int))
        # Összes szó az adott osztályban
        self.class_word_totals = defaultdict(int)
        # Egyedi szavak halmaza
        self.vocabulary = set()

    def tokenize(self, text):
        # Kisbetűsítés és szavakra bontás
        return re.findall(r"\b\w+\b", text.lower())

    def train(self, documents):
        # documents egy lista: (szöveg, címke)
        for text, label in documents:
            self.class_counts[label] += 1
            words = self.tokenize(text)
            for word in words:
                self.vocab_counts[label][word] += 1
                self.class_word_totals[label] += 1
                self.vocabulary.add(word)

    def _calculate_prob(self, word, label):
        # Laplace-simítás (hogy a 0-szor előforduló szavak ne nullázzák le a valószínűséget)
        count = self.vocab_counts[label][word] + 1
        total = self.class_word_totals[label] + len(self.vocabulary)
        return math.log(count / total)

    def predict(self, text):
        words = self.tokenize(text)
        predictions = {}

        for label in self.class_counts:
            # Kezdőérték az osztály relatív gyakorisága alapján
            log_prob = math.log(
                self.class_counts[label]
                / sum(self.class_counts.values())
            )

            # Szavak valószínűségének összeadása (logaritmus miatt)
            for word in words:
                if word in self.vocabulary:
                    log_prob += self._calculate_prob(word, label)

            predictions[label] = log_prob

        # Legnagyobb valószínűségű osztály kiválasztása
        return max(predictions, key=predictions.get)


# --- Példa használat ---

# 1. Tanító adathalmaz (címkék: 'spam', 'normal')
training_data = [
    ("nyerj egy uj telefont ingyen", "spam"),
    ("kérlek hivj fel sürgősen", "spam"),
    ("ingyen penz sorsolas", "spam"),
    ("szia, holnap találkozunk a megbeszélésen?", "normal"),
    ("kérlek küldd el a dokumentumot", "normal"),
    ("ebédeljünk együtt?", "normal"),
]

# 2. Modell példányosítása és tanítása
model = NaiveBayesClassifier()
model.train(training_data)

# 3. Tesztelés
test_text_1 = "ingyen sorsolas telefon nyeremeny"
test_text_2 = "küldd el a dokumentumot légyszi"

print(f"'{test_text_1}' -> {model.predict(test_text_1)}")
print(f"'{test_text_2}' -> {model.predict(test_text_2)}")
---------------
'ingyen sorsolas telefon nyeremeny' -> spam
'küldd el a dokumentumot légyszi' -> normal

** Process exited - Return Code: 0 **
-------------------

Nincsenek megjegyzések:

Megjegyzés küldése