通过分词后,计算文章的词频,进而将词频抽象成数组,把数组在抽象成空间中的向量,通过计算两个向量之间的夹角可以判断两篇文章的相似度。
* 两篇文章提取出来的词频数组 * 比如篇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();