当前位置:首页 > 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;
}

实际应用建议

php实现查重

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

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

标签: php
分享给朋友:

相关文章

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php实现一个

php实现一个

PHP 实现一个简单的计算器 创建一个基本的计算器,支持加、减、乘、除运算。以下是一个完整的实现代码示例: <?php $result = ""; if ($_SERVER["REQUEST_…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…