|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace App\Services; |
| 4 | + |
| 5 | +use AssistedMindfulness\NaiveBayes\Classifier; |
| 6 | +use Illuminate\Support\Str; |
| 7 | + |
| 8 | +class SpamDetector |
| 9 | +{ |
| 10 | + public const SPAM = 'spam'; |
| 11 | + public const HAM = 'ham'; |
| 12 | + |
| 13 | + private $stopWords = [ |
| 14 | + 'в личку', 'писать в лc', 'пишите в лс', 'в лuчные сообщенuя', |
| 15 | + 'личных сообщениях', 'заработок удалённо', 'заработок в интернете', |
| 16 | + 'заработок в сети', 'для yдaлённoгo зaрaбoткa', 'детали в ЛС', |
| 17 | + 'Ищу партнеров', 'криптовалюта', 'пассивный доход', 'пассивный заработок', |
| 18 | + 'партнерская программа', 'быстрые деньги', 'работа на дому', |
| 19 | + 'инвестиции', 'финансовая независимость', 'заработок без вложений', |
| 20 | + 'много денег сразу', 'легкий заработок', 'увеличение прибыли', |
| 21 | + 'сомнительные схемы', 'способы заработка', 'работа без опыта', |
| 22 | + 'получи доход', 'обогащение в интернете', 'заработок на кликах', |
| 23 | + 'маркетинговые сети', 'продажа абонементов', 'продажа товаров', |
| 24 | + 'заработок на опросах', 'финансовая свобода', 'интернет-маркетинг', |
| 25 | + 'пассивные инвестиции', 'интернет-предпринимательство', |
| 26 | + 'денежный поток', 'финансовый успех', 'продажа продукции', |
| 27 | + 'финансовые советы', 'онлайн-бизнес', 'продажа услуг', |
| 28 | + 'бонусная программа', 'маркетинг в интернете', 'маркетинговые инструменты', |
| 29 | + 'пассивный доход в сети', 'прибыльные схемы', 'финансовые инвестиции', |
| 30 | + 'заработок на вложениях', 'консультации по заработку', |
| 31 | + 'финансовая консультация', 'заработок на сайтах', 'доход без риска', |
| 32 | + 'финансовые возможности', 'инвестирование средств', 'партнерские сети', |
| 33 | + 'финансовые инструменты', 'финансовые стратегии', 'заработок на криптовалюте', |
| 34 | + 'биткоин', 'эфириум', 'трейдинг', 'доход в сети', 'увеличение капитала', |
| 35 | + 'заработок на рефералах', 'финансовый рост', 'увеличение дохода', |
| 36 | + 'инвестиции в интернете', 'заработок на акциях', 'инвестиционные возможности', |
| 37 | + 'вложения с доходом', 'инвестиционный рост', 'пассивный доход на автопилоте', |
| 38 | + 'финансовый успех в интернете', 'блокчейн', 'инвестиции в криптовалюту', |
| 39 | + 'инвестирование в фонды', 'финансовая стабильность', 'биржевая торговля', |
| 40 | + 'пассивный доход без риска', 'финансовые решения', 'инвестирование в недвижимость', |
| 41 | + 'заработок на форексе', 'инвестирование в доллары', 'успешный заработок', |
| 42 | + 'финансовая защита', 'инвестиции в будущее', 'реальный заработок', |
| 43 | + 'финансовый инструментарий', 'инвестиции в золото', 'инвестиции в криптовалютные фонды', |
| 44 | + 'увеличение прибыли в интернете', 'инвестирование в акции', |
| 45 | + 'финансовая безопасность', |
| 46 | + ]; |
| 47 | + |
| 48 | + /** |
| 49 | + * Constructor to initialize the SpamDetector with a message. |
| 50 | + * |
| 51 | + * @param string $message The message to analyze |
| 52 | + */ |
| 53 | + public function __construct(private string $message) |
| 54 | + { |
| 55 | + } |
| 56 | + |
| 57 | + /** |
| 58 | + * Check if the message contains any stop words. |
| 59 | + * |
| 60 | + * @return bool True if stop words are found, otherwise false |
| 61 | + */ |
| 62 | + public function containsStopWords(): bool |
| 63 | + { |
| 64 | + return Str::of($this->message)->contains($this->stopWords, true); |
| 65 | + } |
| 66 | + |
| 67 | + /** |
| 68 | + * Check if the message is spam using a Naive Bayes classifier. |
| 69 | + * |
| 70 | + * @return bool True if classified as spam, otherwise false |
| 71 | + */ |
| 72 | + public function checkByClassifier(): bool |
| 73 | + { |
| 74 | + $classifier = new Classifier(); |
| 75 | + |
| 76 | + // Train the classifier with spam and ham messages |
| 77 | + $this->trainClassifier($classifier, 'classifiers/spam.json', static::SPAM); |
| 78 | + $this->trainClassifier($classifier, 'classifiers/ham.json', static::HAM); |
| 79 | + |
| 80 | + return $classifier->guess($this->message) === static::SPAM; |
| 81 | + } |
| 82 | + |
| 83 | + /** |
| 84 | + * Train the Naive Bayes classifier with messages from a JSON file. |
| 85 | + * |
| 86 | + * @param \AssistedMindfulness\NaiveBayes\Classifier $classifier The classifier instance |
| 87 | + * @param string $fileName The path to the JSON file containing messages |
| 88 | + * @param string $label The label to assign to the messages (spam or ham) |
| 89 | + * |
| 90 | + * @return void |
| 91 | + */ |
| 92 | + private function trainClassifier(Classifier $classifier, string $fileName, string $label): void |
| 93 | + { |
| 94 | + $messages = json_decode(file_get_contents(storage_path($fileName))); |
| 95 | + foreach ($messages as $message) { |
| 96 | + $classifier->learn($message, $label); |
| 97 | + } |
| 98 | + } |
| 99 | + |
| 100 | + /** |
| 101 | + * Check if the message is classified as spam by either containing stop words or the classifier. |
| 102 | + * |
| 103 | + * @return bool True if classified as spam, otherwise false |
| 104 | + */ |
| 105 | + public function isSpam() |
| 106 | + { |
| 107 | + if ($this->containsStopWords()) { |
| 108 | + return true; |
| 109 | + } |
| 110 | + |
| 111 | + if ($this->checkByClassifier()) { |
| 112 | + return true; |
| 113 | + } |
| 114 | + |
| 115 | + return false; |
| 116 | + } |
| 117 | +} |
0 commit comments