📜  php get cosine sim - PHP (1)

📅  最后修改于: 2023-12-03 15:18:20.046000             🧑  作者: Mango

PHP计算余弦相似度

简介

在信息检索、自然语言处理和推荐系统等领域,计算文本之间的相似度是一个常见的问题。余弦相似度是一种常用的方法,用于衡量两个向量之间的相似程度。在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计算两个文本之间的余弦相似度。通过将文本转换为词袋模型,并计算词袋模型的余弦相似度,我们可以衡量文本之间的相似程度。这个示例代码可用于文本匹配、推荐系统等应用中。