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