根据余弦相似性计算两个字符串相似度

根据余弦相似性计算两个字符串相似度,0-1之间,越大越相似

    /**
     * 根据余弦相似性计算两个字符串相似度,0-1之间,越大越相似
     * @param $s1
     * @param $s2
     * @return float|int 相似度
     */
    function similarity($s1, $s2)
    {
        $tmp = array();
        for ($i=0; $i<=strlen($s1); $i++) {
            $a = ord($s1[$i]);
            $tmp[$a][0] = $tmp[a][0]+1;
        }

        for ($i=0; $i<=strlen($s2); $i++) {
            $a = ord($s2[$i]);
            $tmp[$a][1] = $tmp[a][1]+1;
        }

        $a1 = 0;
        $a2 = 0;
        $a3 = 0;

        if (count($tmp) > 0) {
            foreach ($tmp as $i => $v) {
                $a1 += $v[0] * $v[1];
                $a2 += $v[0] * $v[0];
                $a3 += $v[1] * $v[1];
            }
        } else {
            return 0;
        }
        return $a1 / sqrt($a2 * $a3);
    }