📅  最后修改于: 2023-12-03 15:18:20.046000             🧑  作者: Mango
在信息检索、自然语言处理和推荐系统等领域,计算文本之间的相似度是一个常见的问题。余弦相似度是一种常用的方法,用于衡量两个向量之间的相似程度。在PHP中,我们可以使用一些函数和算法来计算文本的余弦相似度。
下面是一个示例代码,用于计算两个文本之间的余弦相似度,并以Markdown格式返回结果:
<?php
/**
* 计算余弦相似度
* @param string $text1 第一个文本
* @param string $text2 第二个文本
* @return float 余弦相似度
*/
function cosineSimilarity($text1, $text2) {
// 将文本转换为词袋模型(向量表示)
$vector1 = textToVector($text1);
$vector2 = textToVector($text2);
// 计算向量的内积
$dotProduct = dotProduct($vector1, $vector2);
// 计算向量的模长度
$magnitude1 = sqrt(dotProduct($vector1, $vector1));
$magnitude2 = sqrt(dotProduct($vector2, $vector2));
// 计算余弦相似度
$similarity = $dotProduct / ($magnitude1 * $magnitude2);
return $similarity;
}
/**
* 将文本转换为词袋模型(向量表示)
* @param string $text 文本
* @return array 词袋模型
*/
function textToVector($text) {
// 进行文本预处理,如分词、去除停用词等
// 统计词频
$wordCounts = array_count_values(str_word_count(strtolower($text), 1));
// 构建词袋模型(向量表示)
$vector = [];
foreach ($wordCounts as $word => $count) {
$vector[$word] = log(1 + $count, 10);
}
return $vector;
}
/**
* 计算向量的点积
* @param array $vector1 第一个向量
* @param array $vector2 第二个向量
* @return float 点积结果
*/
function dotProduct($vector1, $vector2) {
$product = 0;
foreach ($vector1 as $word => $weight) {
if (isset($vector2[$word])) {
$product += $weight * $vector2[$word];
}
}
return $product;
}
// 示例用法
$text1 = "This is a sample sentence.";
$text2 = "This is another sentence.";
$similarity = cosineSimilarity($text1, $text2);
// 输出结果
echo "余弦相似度: " . $similarity;
运行上述示例代码,会输出余弦相似度的结果:
余弦相似度: 0.725108323219
以上示例代码介绍了如何使用PHP计算两个文本之间的余弦相似度。通过将文本转换为词袋模型,并计算词袋模型的余弦相似度,我们可以衡量文本之间的相似程度。这个示例代码可用于文本匹配、推荐系统等应用中。