Кейс 2. Спам-фильтр на словах (Bernoulli Naive Bayes)
Связать с реальным ML
Спам-фильтр по словам (Bernoulli Naive Bayes)
Сценарий
Классический спам-фильтр:
слова либо есть, либо нет
частоты не важны
Реализация: чистый PHP
<?php
$emails = [
['text' => ['free', 'win'], 'class' => 'spam'],
['text' => ['free'], 'class' => 'spam'],
['text' => ['meeting'], 'class' => 'ham'],
['text' => ['project'], 'class' => 'ham'],
];
$classes = [];
$wordCounts = [];
$totalDocs = count($emails);
foreach ($emails as $email) {
$class = $email['class'];
$classes[$class] = ($classes[$class] ?? 0) + 1;
foreach ($email['text'] as $word) {
$wordCounts[$class][$word] =
($wordCounts[$class][$word] ?? 0) + 1;
}
}
$input = ['free', 'meeting'];
$scores = [];
foreach ($classes as $class => $count) {
$logProb = log($count / $totalDocs);
foreach ($input as $word) {
$wordCount = $wordCounts[$class][$word] ?? 1;
$logProb += log($wordCount / $count);
}
$scores[$class] = $logProb;
}
arsort($scores);
print_r($scores);Связь с главой
Каждое слово – независимое доказательство
Это буквально раздел «Голосование признаков»
Лог-суммирование = линейная модель
Та же задача: RubixML
PreviousКейс 1. Категориальные признаки и частотыNextКейс 3. Числовые признаки (Gaussian Naive Bayes)
Last updated