当前位置:首页 > 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算法生成文本指纹:

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算法将文本向量化后计算余弦相似度:

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实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('lo…

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (…

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('lo…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…