通过分词后,计算文章的词频,进而将词频抽象成数组,把数组在抽象成空间中的向量,通过计算两个向量之间的夹角可以判断两篇文章的相似度
/**
* Created by PhpStorm.
* User: 书生
* Date: 15-4-4
* Time: 下午6:20
*/
/**
* @author 书生
* 两篇文章提取出来的词频数组
* 比如篇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();