php7 匹配2个用户标签或用户多个标签的余弦相似度 写个完整列子 且无错误
时间: 2024-09-26 17:09:23 浏览: 39
在 PHP 7 中,你可以使用内置的 `array_intersect_assoc` 函数来找出两个用户标签数组的交集,然后结合之前提供的余弦相似度计算方法来比较他们的相似度。这里是一个完整的例子:
```php
<?php
// 定义用户A和B的标签数组
$userA = ['技术', '编程', 'Web', '数据库'];
$userB = ['前端', '开发者', 'HTML', 'PHP', '数据库'];
// 将标签转换为词频向量,并去除重复项
function uniqueTagVector($tags) {
return array_count_values(preg_split('/\s+/', $tags));
}
$userAVector = uniqueTagVector(implode(' ', $userA));
$userBVector = uniqueTagVector(implode(' ', $userB));
// 计算交集(共有的标签)
$commonTags = array_intersect_assoc($userAVector, $userBVector);
// 计算每个用户的独特标签向量长度(用于归一化)
$totalA = count($userAVector);
$totalB = count($userBVector);
// 归一化向量
foreach ($commonTags as &$tagValue) {
$tagValue = $tagValue / max($totalA, $totalB);
}
// 计算余弦相似度
function cosineSimilarity($a, $b) {
$dotProduct = array_sum(array_map(function($x, $y) { return $x * $y; }, $a, $b));
$magnitudeA = sqrt(array_sum(array_map('pow', $a, 2)));
$magnitudeB = sqrt(array_sum(array_map('pow', $b, 2)));
return $dotProduct / ($magnitudeA * $magnitudeB);
}
$similarity = cosineSimilarity($commonTags, $commonTags); // 只对共同的标签进行相似度计算
echo "The cosine similarity between the common tags of users A and B is: " . $similarity;
?>
```
这个例子首先找出两个用户标签数组的交集,然后计算这部分交集标签的余弦相似度。注意,这里只计算了共同标签的相似度,如果需要考虑所有标签,只需去掉`array_intersect_assoc`部分即可。
阅读全文