Naive-Bayes-Spam-Klassifikator

Implementiere einen einfachen chinesischen Spam-Klassifikator unter Verwendung der grundlegendsten Formel für bedingte Wahrscheinlichkeit, ohne sklearn aufzurufen.

Nach Abschluss dieses Beispiels verstehst du:Bayes-Theorem + die Annahme der "Wortunabhängigkeit" = ein brauchbarer Textklassifikator.


Alltägliche Einführung

E-Mail-Spam-Filterung

Dein Postfach erhält jeden Tag 100 E-Mails. Wie kann das Programm automatisch feststellen, ob eine neue E-Mail Spam ist? Die Vorgehensweise des Programms: In historischen E-Mails die Wahrscheinlichkeit zählen, dass Wörter wie "kostenlos" und "Gewinn" in Spam-E-Mails auftauchen, und die Wahrscheinlichkeit, dass Wörter wie "Besprechung" und "Projekt" in normalen E-Mails auftauchen.

Wenn eine neue E-Mail eintrifft, berechne: die Wahrscheinlichkeit, dass diese Wörter zusammen unter der Spam-Annahme vs. unter der Annahme einer normalen E-Mail auftreten. Welche größer ist, gewinnt die Klassifikation.


Intuitive Vorstellung

Die entscheidende Vereinfachung von Naive Bayes — die "naive Annahme": Sie geht davon aus, dass das Auftreten jedes Wortes unabhängig von den anderen ist. Obwohl diese Annahme in der Realität nicht zutrifft ("kostenlos" und "Preis" treten oft zusammen auf), ist ihre praktische Leistung überraschend gut.

TechnikenAnsatzGelöstes Problem
Logarithmische WahrscheinlichkeitVerwende log, um Multiplikation in Addition umzuwandelnDie Multiplikation vieler kleiner Dezimalzahlen kann 0 ergeben (numerischer Unterlauf)
Laplace-GlättungAddiere 1 zu jeder Wortanzahl statt 0Wörter, die nicht im Trainingsdatensatz vorkommen, führen zu einer Wahrscheinlichkeit von 0

Python-Praxisübung

Beispiel

from collections import defaultdict
import math

# Trainingsdaten (8 beschriftete chinesische SMS-Nachrichten)
train_data = [
    (Gewinne kostenlose Preise Jetzt klicken, "spam"),
    (Herzlichen Glückwunsch Gewinn Anspruch Cash-Rabatt, "spam"),
    (Zeitlich begrenztes Angebot Klicken Link kostenlos, "spam"),
    (Kredit Niedrige Zinsen Jetzt beantragen Cash, "spam"),
    (Besprechung Arrangement Morgen Vormittag Diskussion, "ham"),
    (Projektfortschrittsbericht Besprechungsprotokoll, "ham"),
    (Wochenendessen Arrangement Alle teilnehmen, "ham"),
    (Bericht Datenanalyse Projektabschluss, "ham"),
]

# Worthäufigkeiten für jede Kategorie zählen
class_word_counts = defaultdict(lambda: defaultdict(int))
class_doc_counts = defaultdict(int)
vocab = set()

for text, label in train_data:
    class_doc_counts[label] += 1
    for word in text.split():
        class_word_counts[label][word] += 1
        vocab.add(word)

vocab_size = len(vocab)
total_docs = len(train_data)

# Naive-Bayes-Klassifikation (Log-Wahrscheinlichkeit + Laplace-Glättung)
def predict(text, alpha=1.0):
    words = text.split()
    scores = {}
    for label in class_doc_counts:
        log_prob = math.log(class_doc_counts[label] / total_docs)
        total_words = sum(class_word_counts[label].values())
        for word in words:
            word_count = class_word_counts[label][word]
            word_prob = (word_count + alpha) / (total_words + alpha * vocab_size)
            log_prob += math.log(word_prob)
        scores[label] = log_prob
    return max(scores, key=scores.get), scores

# Test
test_emails = [
    Kostenlose Bargeldpreise einlösen,
    Projektbericht des morgigen Meetings,
    Zeitlich begrenzter Rabattlink,
    Am Wochenende diskutieren alle gemeinsam den Bericht.,
]

print(BEISPIEL Naive-Bayes-Klassifikationsergebnis:\n")
for email in test_emails:
    label, scores = predict(email)
    print(f" {email!r:28s} -> 【{label}】")
EXAMPLE 朴素贝叶斯分类结果:

  '免费 领取 现金 奖品'          -> 【spam】
  '明天 会议 项目 汇报'           -> 【ham】
  '限时 点击 优惠 链接'           -> 【spam】
  '周末 大家 一起 讨论 报告'       -> 【ham】

Anwendungsszenarien in der KI

SzenarioBeschreibung
TextklassifikationSpamfilterung, Nachrichtenklassifikation, Sentimentanalyse - Naive Bayes ist eine klassische Baseline
Dokument-ThemenmodellierungMathematische Grundlagen von LDA (Latent Dirichlet Allocation)
AnomalieerkennungBerechne die Wahrscheinlichkeit, dass eine neue Stichprobe zur "Normalverteilung" gehört; wenn sie zu niedrig ist, klassifiziere sie als Anomalie.
Weitere Erweiterungen