当前位置:首页 > PHP

php实现查重

2026-02-15 05:42:51PHP

PHP实现文本查重的方法

文本查重可以通过多种方式实现,以下是几种常见的PHP实现方法:

基于字符串相似度的查重 使用PHP内置函数计算文本相似度:

$text1 = "这是要比较的第一段文本";
$text2 = "这是要比较的第二段文本";

similar_text($text1, $text2, $percent);
echo "相似度: ".$percent."%";

基于SimHash算法的查重 SimHash适合处理大文本查重:

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

    foreach($tokens as $token) {
        $tokenHash = hash('md5', $token);
        $binary = '';
        for($i=0; $i<32; $i++) {
            $binary .= str_pad(decbin(hexdec($tokenHash[$i])), 4, '0', STR_PAD_LEFT);
        }

        for($i=0; $i<64; $i++) {
            $hash[$i] += ($binary[$i] == '1') ? 1 : -1;
        }
    }

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

    return $simhash;
}

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

基于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', 'pass');
$stmt = $pdo->prepare("SELECT id, MATCH(content) AGAINST(:search) as score 
                      FROM documents 
                      WHERE MATCH(content) AGAINST(:search) 
                      ORDER BY score DESC LIMIT 10");
$stmt->execute([':search' => $searchText]);
$results = $stmt->fetchAll();

基于TF-IDF算法的查重 需要先计算词频和逆文档频率:

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

    // 计算TF
    foreach($documents as $docId => $document) {
        $words = preg_split('/\s+/', $document);
        $wordCount = count($words);
        foreach($words as $word) {
            if(!isset($tf[$docId][$word])) {
                $tf[$docId][$word] = 0;
            }
            $tf[$docId][$word]++;
        }
        // 归一化
        foreach($tf[$docId] as $word => $count) {
            $tf[$docId][$word] = $count / $wordCount;
        }
    }

    // 计算DF
    foreach($tf as $docId => $words) {
        foreach($words as $word => $count) {
            if(!isset($df[$word])) {
                $df[$word] = 0;
            }
            $df[$word]++;
        }
    }

    // 计算IDF
    $totalDocs = count($documents);
    foreach($df as $word => $count) {
        $idf[$word] = log($totalDocs / $count);
    }

    // 计算TF-IDF
    foreach($tf as $docId => $words) {
        foreach($words as $word => $tfValue) {
            $tfidf[$docId][$word] = $tfValue * $idf[$word];
        }
    }

    return $tfidf;
}

实际应用建议

  • 对于小规模文本查重,使用similar_text函数最简单
  • 对于大规模文档查重,推荐使用SimHash或TF-IDF算法
  • 如果文本存储在数据库中,可以利用数据库的全文检索功能
  • 考虑使用缓存机制存储计算结果,提高重复查询效率

每种方法都有其适用场景,选择时应考虑数据规模、性能要求和准确度需求。

php实现查重

标签: php
分享给朋友:

相关文章

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php实现队列

php实现队列

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

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE T…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…