通过余弦值计算相似性的PHP实现

分类: PHP,分享  • 发布时间: 2015-04-04 20:14:00  • 浏览量:7677

通过分词后,计算文章的词频,进而将词频抽象成数组,把数组在抽象成空间中的向量,通过计算两个向量之间的夹角可以判断两篇文章的相似度


<?php
/**
 * Created by PhpStorm.
 * User: 书生
 * Date: 15-4-4
 * Time: 下午6:20
 */
/**
 * @author 书生<imwin#foxmail.com>
 * 两篇文章提取出来的词频数组
 * 比如篇1中有关键词词频信息为:中国[5次],谷歌[4次],攻击[7次],退出[2次],谴责[1次],那么arr1 = array(5,4,7,2,1);
 * 比如篇2中有关键词词频信息为:中国[3次],谷歌[5次],攻击[6次],退出[2次],谴责[2次],那么arr2 = array(3,5,6,2,2);
 * 要求数组的长度一样长
 * 该算法只是一个很简陋的实现,仅仅实现了余弦值的计算
 * @param $arr1
 * @param $arr2
 */
class similar
{
    private $arr1;
    private $arr2;
    public function __construct($arr1,$arr2)
    {
        $this->arr1 = $arr1;
        $this->arr2 = $arr2;
    }
    /**
     * 计算分子
     */
    private function numerator()
    {
        $numerator = 0;
        foreach($this->arr1 as $k => $v){
            $numerator += $v * $this->arr2[$k];
        }
        return $numerator;
    }
    /**
     * 计算分母
     */
    private function denominator()
    {
        return sqrt($this->squareSum($this->arr1)) * sqrt($this->squareSum($this->arr2));
    }
    /**
     * 求平方的和
     * @param $arr
     * @return int
     */
    private function  squareSum($arr)
    {
        $sum = 0;
        foreach($arr as $v){
            $sum += $v * $v;
        }
        return $sum;
    }
    /**
     * 计算出相似值
     */
    public function CosineValues()
    {
        return $this->numerator() / $this->denominator();
    }
}
//调用方法
$m = new similar(array(5,4,7,2,1),array(3,5,6,2,2));
echo $m->CosineValues();


文章标签: 算法, 相似性, 余弦