当前位置:首页 > PHP

php实现查重

2026-01-30 07:53:00PHP

PHP实现文本查重方法

基于相似度算法

使用PHP内置函数计算文本相似度,如similar_text()levenshtein()函数:

$text1 = "这是原始文本内容";
$text2 = "这是修改后的文本内容";

// 相似度百分比计算
similar_text($text1, $text2, $percent);
echo "相似度: ".$percent."%";

// 编辑距离计算
$distance = levenshtein($text1, $text2);
$maxLen = max(strlen($text1), strlen($text2));
echo "相似度: ".(1 - $distance/$maxLen)*100 ."%";

基于哈希指纹算法

采用SimHash算法生成文本指纹:

php实现查重

function simHash($text) {
    $tokens = preg_split('/\s+/', $text);
    $hash = array_fill(0, 64, 0);

    foreach ($tokens as $token) {
        $tokenHash = hash('sha256', $token);
        $binary = hex2bin($tokenHash);

        for ($i = 0; $i < 64; $i++) {
            $bit = ($binary[$i >> 3] >> (7 - ($i % 8))) & 1;
            $hash[$i] += $bit ? 1 : -1;
        }
    }

    $fingerprint = '';
    foreach ($hash as $bit) {
        $fingerprint .= $bit > 0 ? '1' : '0';
    }

    return $fingerprint;
}

function hammingDistance($hash1, $hash2) {
    $distance = 0;
    for ($i = 0; $i < strlen($hash1); $i++) {
        if ($hash1[$i] != $hash2[$i]) {
            $distance++;
        }
    }
    return $distance;
}

基于TF-IDF向量化

使用TF-IDF算法将文本向量化后计算余弦相似度:

php实现查重

function calculateTfIdf($documents) {
    $tf = [];
    $df = [];
    $idf = [];
    $tfidf = [];
    $allTerms = [];

    // 计算词频(TF)
    foreach ($documents as $docId => $doc) {
        $terms = preg_split('/\s+/', $doc);
        $termCount = array_count_values($terms);
        $tf[$docId] = [];

        foreach ($termCount as $term => $count) {
            $tf[$docId][$term] = $count / count($terms);
            if (!in_array($term, $allTerms)) {
                $allTerms[] = $term;
            }
        }
    }

    // 计算文档频率(DF)
    foreach ($allTerms as $term) {
        $df[$term] = 0;
        foreach ($documents as $docId => $doc) {
            if (isset($tf[$docId][$term])) {
                $df[$term]++;
            }
        }
    }

    // 计算逆文档频率(IDF)
    $totalDocs = count($documents);
    foreach ($df as $term => $count) {
        $idf[$term] = log($totalDocs / ($count + 1));
    }

    // 计算TF-IDF
    foreach ($tf as $docId => $terms) {
        $tfidf[$docId] = [];
        foreach ($terms as $term => $value) {
            $tfidf[$docId][$term] = $value * $idf[$term];
        }
    }

    return $tfidf;
}

基于MySQL全文检索

利用MySQL的全文检索功能实现高效查重:

// 创建支持全文索引的表
CREATE TABLE documents (
    id INT AUTO_INCREMENT PRIMARY KEY,
    content TEXT,
    FULLTEXT(content)
) ENGINE=InnoDB;

// PHP查询相似文档
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare("
    SELECT id, MATCH(content) AGAINST(:search IN NATURAL LANGUAGE MODE) AS score 
    FROM documents 
    WHERE MATCH(content) AGAINST(:search IN NATURAL LANGUAGE MODE) 
    ORDER BY score DESC
");
$stmt->execute([':search' => $searchText]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

性能优化建议

对于大规模文本查重系统,建议采用以下优化措施:

  • 对文本进行预处理(去除停用词、标点符号、词干提取)
  • 使用缓存机制存储常用查询结果
  • 考虑使用专业搜索引擎如Elasticsearch
  • 对长文本采用分块比对策略
  • 建立索引提高查询效率

以上方法可根据实际需求组合使用,简单查重可使用相似度算法,高精度需求建议采用SimHash或TF-IDF算法。

标签: php
分享给朋友:

相关文章

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…