美文网首页
php实现朴素贝叶斯算法

php实现朴素贝叶斯算法

作者: 一路向后 | 来源:发表于2021-03-21 22:10 被阅读0次

    1.源码实现

    <?php
    
    class Type {
        const POSITIVE = 'positive';
        const NEGATIVE = 'negative';
    }
    
    class Classifier {
        public $types = array(Type::POSITIVE, Type::NEGATIVE);
        public $words = array();
        public $documents = array();
    
        public function learn($statement, $type)
        {
            $words = $this->getWords($statement);
    
            foreach($words as $word)
            {
                if(!isset($this->words[$type][$word]))
                {
                    $this->words[$type][$word] = 0;
                }
    
                $this->words[$type][$word]++;
            }
    
            $this->documents[$type]++;
        }
    
        private function totalP($type)
        {
            return ($this->documents[$type]+1) / (array_sum($this->documents) + 1);
        }
    
        private function p($word, $type)
        {
            $count = isset($this->words[$type][$word]) ? $this->words[$type][$word] : 0;
     
            return ($count + 1) / (array_sum($this->words[$type]) + 1);
        }
    
        private function getWords($string)
        {
            return preg_split('/\s+/', preg_replace('/[^A-Za-z0-9\s]/', '', strtolower($string)));
        }
    
        public function guess($statement)
        {
            $words = $this->getWords($statement); // 得到单词
            $best_likelihood = 0;
            $best_type = null;
     
            foreach($this->types as $type)
            {
                $likelihood = $this->totalP($type); //计算 P(Type)
     
                foreach($words as $word)
                {
                    $likelihood *= $this->p($word, $type); // 计算 P(word, Type)
                    //echo $word."\n";
                }
     
                if($likelihood > $best_likelihood)
                {
                    $best_likelihood = $likelihood;
                    $best_type = $type;
                }
            }
     
            return $best_type;
        }
    }
    
    
    $classifier = new Classifier();
    $classifier->learn('Symfony is the best', Type::POSITIVE);
    $classifier->learn('PhpStorm is great', Type::POSITIVE);
    $classifier->learn('Iltar complains a lot', Type::NEGATIVE);
    $classifier->learn('No Symfony is bad', Type::NEGATIVE);
     
    var_dump($classifier->guess('Symfony is great')); // string(8) "positive"
    var_dump($classifier->guess('I complain a lot')); // string(8) "negative"
    
    ?>
    

    2.运行及其结果

    $ php example.php
    string(8) "positive"
    string(8) "negative"
    

    相关文章

      网友评论

          本文标题:php实现朴素贝叶斯算法

          本文链接:https://www.haomeiwen.com/subject/ywzocltx.html