[Ищу] Скрипт проверки уникальности

Тема в разделе "SEO Скрипты", создана пользователем Tushkan, 4 авг 2009.

Статус темы:
Закрыта.
  1. Tushkan

    Tushkan

    Регистр.:
    9 апр 2007
    Сообщения:
    208
    Симпатии:
    61
    Собственно сабж...
    Давно в поиске..
    Инет перерыл... пусто...

    Нужен скрипт массовой проверки уникальности текстов (страниц сайта)
    В идиале на пхп...
     
  2. Fast3r

    Fast3r

    Регистр.:
    30 июн 2008
    Сообщения:
    329
    Симпатии:
    39
    скрипт praide.php смотрел? там не массово но чекает уник нормально, думаю тебе не составит труда потоковую проверку туда прикрутить
     
    Tushkan нравится это.
  3. Tushkan

    Tushkan

    Регистр.:
    9 апр 2007
    Сообщения:
    208
    Симпатии:
    61
    Хм...
    Если ты имел ввиду praide, софтовую тулузу, то не катит (аналогично advego plagiatus, DCFinder)...
    Конечно если к нему прикрутить AutoClickExtreme последней версии, то результата добиться можно... Но это всё же лишний гемор...

    Нужен именно скрипт замечательно ежли на php, сойдёт и аякс, перл...
    Многопотоковость, массовую проверку, прокси и остальное сам прикручу...

    Если реально есть на просторах инета praide.php, ткни плз носом, поиск по нуллу, яше, гуглю ни чего не даёт...

    Но тем не менее, копая в указанном тобой направлении :) , наткнулся на следующий скриптик


    PHP:
    <?php 
    /**
     * Скрипт проверки уникальности.
     * 
     * Разбивает введённый в него текст на куски по 10 слов, создаёт из них 10-словные запросы
     * для Yandex и Google, разбирает выдачу и формирует отчёт о частоте упоминания комбинаций
     * слов в интернете.
     * Перед началом использования этого скрипта рекомендуется ознакомиться с правилами Яндекса.
     * Автор скрипта не несёт ответственности за любой ущерб причинённый его неправильным использованием. 
     * 
     * @see http://rules.yandex.ru/termsofuse.xml
     * @author agronom
     * @version $Id$
     * 
     */
    ob_start();
    ?>
    <html>
    <head>
    <title>Проверка уникальности текста</title>
    <meta http-equiv="content-type" content="text/html; charset=windows-1251">
    </head>
    <body>
    <h1>Проверка уникальности текста в интернете.</h1>
    <form method="post">
    <b>Текст для проверки </b>
    <small>(Скопируйте сюда текст веб-страницы)</small><b>:</b><br>
    <textarea name="query" cols="80" rows="5"></textarea><br>
    <input type="submit" value="Проверить">
    </form>
    <?php
    /**
     * Выбирает доменное имя
     * @param $a
     */
    function    handle_info($a){
            
    $a explode("\n"trim(strip_tags($a)));
            
    $a preg_replace("/^(www\.)?([\w\-\.]+):?([\d]+)?\/?([\s\S]*)?/i""$2"strtolower($a[0]));
            return 
    $a;
    }

    /**
     * Получает информацию о выдаче яндекса по запросу
     * 
     * @param string $query текст запроса без URL кодирования
     * @return array $a
     *         $a[0][1] - число найденных страниц
     *         $a[0][2] - число найденных сайтов
     *         $a[1]    - массив найденных доменов
     */
    function top_10($query) {
        
    $url "http://yandex.ru/yandsearch?text=".urlencode($query);
        
    $txt file_get_contents($url);
        
    //echo "Ответ Яндекса";
        //echo nl2br(htmlspecialchars(print_r($txt, true)));
        
    $brief get_brief($txt);
        if (!
    is_array($brief)) {
            return 
    false;
        }
        
    // Получаем список сайтов yandex top 10
        
    preg_match("/\<ol[\s\S]*?\>[\s\S]*?\<\/ol[\s\S]*?\>/"$txt$results);
        
    // Из списка ссылок делаем массив
        
    preg_match_all("/\<li[\s\S]*?\>[\s\S]*?\<div class=\"info\">([\s\S]*?)\<\/div\>[\s\S]*?\<\/li[\s\S]*?\>/"$results[0], $results);
        
    $results[1] = array_map("handle_info"$results[1]);
        return array(
    $brief$results[1]);
    }
    /**
     * Получает информацию о выдаче Google по запросу
     * 
     * @param string $query текст запроса без URL кодирования
     * @return array
     */
    function top_10_g($query) {
        
    $url "http://www.google.com/search?hl=ru&q=".urlencode($query);
        
    $txt file_get_contents($url);
        
    $brief get_brief_g($txt);
        if (!
    is_array($brief)) {
            return 
    false;
        }
        return array(
    $brieffalse);
    }
    /**
     * Получает краткую информацию о числе результатов поиска в Yandex
     * 
     * @param string $text текст страницы
     * @return array $a  $a[1] - число страниц, $a[2] - число сайтов
     */
    function    get_brief($text){
        
    preg_match("/\<title\>[\s\S]+?:[\s\S]+?(\d+)[\s\S]+?\<\/title\>/i"$text$ref);
        
    $ref[1] = (@$ref[1]) ? $ref[1] : ;
        return 
    $ref;
    }
    /**
     * Получает краткую информацию о числе результатов поиска в Google
     * 
     * @param string $text текст страницы
     * @return array $a  $a[1] - число страниц
     */
    function    get_brief_g($text){
        
    $exp "/\<div id=ssb\>\<div id=prs>\<b\>[\s\S]*?\<\/b\>\<\/div>\<p\>[\s\S]*?\<b\>[\d]*?\<\/b\> - \<b\>[\d]*?\<\/b\>[\s\S]*?\<b\>([\d\s]*?)\<\/b\>[\s\S]*?\<\/p\><\/div\>/i";
        if (!
    preg_match($exp$text$ref)) {
            return 
    false;
        }
        
    $ref[1] = (isset($ref[1]))?(int)str_replace("&nbsp;"""$ref[1]):0;
        return 
    $ref;
    }

    if (isset(
    $_POST['query'])) {
        
    $log = array();
        
    $log['query'] = $_POST['query'];
        
    $queries = (get_magic_quotes_gpc())?stripslashes($_POST['query']):$_POST['query'];
        
    $queries preg_replace("/[?!\(\)'\",]/"""$queries);
        
    $queries preg_replace("/[- ]{2}/"" "$queries);
        
    $queries preg_replace("/ +/"" "$queries);
        
    $queries str_replace(".""\n"$queries);
        
    $queries explode("\n"trim($queries));    // Разбиваем на предложения
        
    ?>
        <h2>Яндекс</h2>
        <table border="1">
            <tr><td>Страниц</td><td>Запрос</td></tr>
        <?php
        
    foreach ($queries as $q) {
            if (
    strlen($q) > 30) {
                
    $q   preg_replace("/(([\S]+?[\s]+){3,9}[\S]+)[\s\S]*/""$1"$q);
                
    $top = @top_10("\"".trim($q)."\"");
                
    $log["yandex"][] = array($top[0][1], $q);
                
    ?><tr><td><span title="<?php echo implode("\r\n"$top[1]); ?>"><?php echo $top[0][1]; ?></span></td><td><a href="http://www.yandex.ru/yandsearch?text=<?php echo urlencode("\"$q\""); ?>" target="_blank"><?php echo $q?></a></td></tr><?php
            
    }
        }
        
    ?></table>
        <h2>Google</h2>
        <table border="1">
            <tr><td>Сайтов</td><td>Запрос</td></tr>
        <?php
        
    foreach ($queries as $q) {
            if (
    strlen($q) > 30) {
                
    $q   preg_replace("/(([\S]+?[\s]+){3,9}[\S]+)[\s\S]*/""$1"$q);
                
    $top = @top_10_g("\"".trim($q)."\"");
                
    $log["google"][] = array(@$top[0][1], $q);
                
    ?><tr><td><?php echo (is_int(@$top[0][1]))? $top[0][1] : "N/A"?></td><td><a href="http://www.google.com/search?hl=ru&q=<?php echo urlencode("\"$q\""); ?>" target="_blank"><?php echo $q?></a></td></tr><?php
            
    }
        }
        
    ?></table><?php
    }
    ?>

    в принципе практически устраивает, после соответствующей дороботки напильником...
    Правда код мельком пока просмотрел...

    Также, откапал следующий классик...


    шинглы по crc32

    PHP:
    <?php
     
    class Shingles
    {
        
    /**
         * Массив параметров
         *
         * @var array
         */
     
        
    protected $_params = array();
     
        
    /**
         * Массив стоп-символов, которые будут удаленны из строки
         *
         * @var array
         */
     
        
    protected $_stopSymbols = array();
     
        
    /**
         * Массив стоп-слов, которые будут удаленны из строки
         *
         * @var array
         */
     
        
    protected $_stopWords = array();
     
        
    /**
         * Массив текстов для обработки
         *
         * @var array
         */
     
        
    protected $_texts = array();
     
        
    /**
         * Двухмерный массив шинглов
         *
         * @var array
         */
     
        
    protected $_shingles = array();
     
        
    /**
         * Метод выполняющий канонизацию строки. Сначала вырезаем из строки все
         * стоп-символы. Затем перебираем слова. Те которых нет в массиве стоп-слов,
         * оставляем. Приводим строку к нижнему регистру.
         *
         * @param string $string строка для канонизации
         * @return string "чистую" строку
         */
     
        
    protected function _canonizeString($string)
        {
            
    $result = array();
            
    $string str_replace($this->_stopSymbolsnull$string);
     
            foreach (
    explode(' '$string) as $word) {
                if (
    strlen($word) && !in_array($word$this->_stopWords)) {
                    
    $result[] = trim($word);
                }
            }
     
            return 
    strtolower(implode(' '$result));
        }
     
        
    /**
         * Выполняет канонизацию всех добавленных для обработки текстов
         *
         * @return object текущий объект
         */
     
        
    protected function _canonizeTexts()
        {
            if (empty(
    $this->_texts)) {
                return 
    $this;
            }
     
            foreach (
    $this->_texts as $key => $text) {
                
    $this->_texts[$key] = $this->_canonizeString($text);
            }
     
            return 
    $this;
        }
     
        
    /**
         * Создает массив шинглов строки
         *
         * @param string $string строка для обработки
         * @return array массив шиглов
         */
     
        
    protected function _getShinglesFromString($string)
        {
            if (!
    $this->getParam('length')) {
                throw new 
    Exception('Not found param of length');
            }
     
            
    $shingles = array();
            
    $length   intval($this->getParam('length'));
            
    $words    explode(' '$string);
     
            if (
    count($words) < $length) {
                return 
    $shingles;
            }
     
            for (
    $i 1$i <= count($words) - $length$i ++) {
                
    $shingles[] = md5(implode(' 'array_slice($words$i$length)));
            }
     
            return 
    $shingles;
        }
     
        
    /**
         * Создает массив шинглов для каждого текста
         *
         * @return array
         */
     
        
    protected function _setShingles()
        {
            foreach (
    $this->_texts as $text) {
                
    $this->_shingles[] = $this->_getShinglesFromString($text);
            }
     
            return 
    $this;
        }
     
        
    /**
         * Конструктор класса
         *
         * @param array $setting параметры для обработки текстов
         */
     
        
    public function __construct(array $setting = array())
        {
            if (isset(
    $setting['stop_symbols'])) {
                
    $this->setStopSymbols(explode(' '$setting['stop_symbols']));
            }
     
            if (isset(
    $setting['stop_words'])) {
                
    $this->setStopWords(explode(', '$setting['stop_words']));
            }
     
            if (isset(
    $setting['length'])) {
                
    $this->setParam('length'$setting['length']);
            }
        }
     
        
    /**
         * Определяет массив стоп-символов
         *
         * @param array $symbols массив стоп-символов
         * @return object текущий объект
         */
     
        
    public function setStopSymbols(array $symbols)
        {
            
    $this->_stopSymbols $symbols;
            return 
    $this;
        }
     
        
    /**
         * Возвращает массив стоп-символов
         *
         * @return array массив стоп-символов
         */
     
        
    public function getStopSymbols()
        {
            return 
    $this->_stopSymbols;
        }
     
        
    /**
         * Определяет массив стоп-слов
         *
         * @param array $words стоп-слова
         * @return object текущий объект
         */
     
        
    public function setStopWords(array $words)
        {
            
    $this->_stopWords $words;
            return 
    $this;
        }
     
        
    /**
         * Возвращает массив стоп-слов
         *
         * @return array массив стоп-слов
         */
     
        
    public function getStopWords()
        {
            return 
    $this->_stopWords;
        }
     
        
    /**
         * Возвращает параметр
         *
         * @param string $key ключ
         * @return mixed|null значение
         */
     
        
    public function getParam($key)
        {
            if (isset(
    $this->_params[$key])) {
                return 
    $this->_params[$key];
            }
     
            return 
    null;
        }
     
        
    /**
         * Возвращает массив всех параметров
         *
         * @return array массив всех параметров
         */
     
        
    public function getParams()
        {
            return 
    $this->_params;
        }
     
        
    /**
         * Определяет массив параметров
         *
         * @param array $params массив параметров
         * @return object текущий объект
         */
     
        
    public function setParams(array $params)
        {
            
    $this->_params $params;
            return 
    $this;
        }
     
        
    /**
         * Определяет параметр
         *
         * @param string $key ключ параметра
         * @param mixed $value значение параметра
         * @return object текущий объект
         */
     
        
    public function setParam($key$value)
        {
            
    $this->_params[$key] = $value;
            return 
    $this;
        }
     
        
    /**
         * Добавляет текст для проверки
         *
         * @param string $text текст
         * @return object текущий объект
         */
     
        
    public function addText($text)
        {
            
    $this->_texts[] = $text;
            return 
    $this;
        }
     
        
    /**
         * Проверяет двухмерный массив шинглов на уникальность
         *
         * @param array $shingles массив шинглов
         * @return int процент уникальности
         */
     
        
    public function compaire(array $shingles)
        {
            
    $same 0;
     
            foreach (
    $shingles[0] as $key => $shingle) {
                if (
    $shingle === $shingles[1][$key]) {
                    
    $same ++;
                }
            }
     
            return 
    round($same count($shingles[0]) * 1002);
        }
     
        
    /**
         * Возвращает массив шинглов для всех добавленных текстов
         *
         * @return array массив шинглов
         */
     
        
    public function getShigles()
        {
            return 
    $this->_canonizeTexts()->_setShingles()->_shingles;
        }
    }
     
    ?>
    использование

    PHP:
    <?php
     
    require_once dirname(__FILE__) . DIRECTORY_SEPARATOR 'shingles.php';
     
    setlocale(LC_CTYPE, array('ru_RU.CP1251''Russian_Russia.1251'));
     
    $setting  parse_ini_file(dirname(__FILE__) . DIRECTORY_SEPARATOR 'setting.ini');
    $shingles = new Shingles($setting);
     
    $shingles->addText('То, что старшая сестра держалась на собрании так уверенно, меня сперва беспокоило, а на Макмерфи не подействовало никак');
    $shingles->addText('То, что главная сестра держалась на собрании так уверенно, меня сперва беспокоило, а на Макмерфи не подействовало никак');
     
    echo 
    'Тексты схожи на ' $shingles->compaire($shingles->getShigles()) . '%';
     
    ?>

    Но это просто сравнение текстов по шинглам, хотя тоже может оказаться полезным...

    Вотс... пока нахожусь в активном поиске...
    Если кто, что ни будь ещё найдёт, или распологает информацией отпишитесь пожалуйста.. :thenks:
    :bc:

    ---------

    Хе... :)
    Тот же самый скрипт только с развёрнутыми комментами... Спс...
     
  4. Fast3r

    Fast3r

    Регистр.:
    30 июн 2008
    Сообщения:
    329
    Симпатии:
    39
    да нет проблем вот как ты и просил php скрипт
    http://nado.su/downloads.html
    в низу страницы :)
    если поможет, поделись потом скриптиком массовой проверки, буду весьма благодарен :ay:
     
    Tushkan нравится это.
  5. kactetus

    kactetus митя is here )

    Регистр.:
    26 авг 2007
    Сообщения:
    441
    Симпатии:
    278
    Tushkan
    Ну что получилось прикрутить массовых проверок файлов , просто пригодится данный скрипт
     
  6. got4a

    got4a Создатель

    Регистр.:
    8 сен 2007
    Сообщения:
    45
    Симпатии:
    2
    А можно поподробнее классы рассмотреть ? :)
    Очень нужен подобный скрипт...
     
  7. arch14

    arch14

    Регистр.:
    7 июн 2009
    Сообщения:
    374
    Симпатии:
    186
    озадачился такой же проблемой. перерыл кучу ресурсов - нету нифига
    нашел тут Перейти по ссылке
    просит 19 вмз
     
  8. Dali

    Dali

    Регистр.:
    7 апр 2006
    Сообщения:
    155
    Симпатии:
    153
    Ну это не совсем, как бы скрипт :) что вы навели в пример, есть сервис но опять же платный
    Перейти по ссылке

    Есть безплатная тузла но опять же это не скрипт десктопный софт "PlagFinder" ищет только через гугл
    Скачать Перейти по ссылке
    Прочитать Перейти по ссылке


    Или ждать апдет Etxt Антиплагиат. У разработчиков в планах сделать пакетную проверку.

    Из безплатного в виде сервиса, но там как бы массовостью не пахнет http://istio.com/rus/text/analyz/...
     
  9. kimadso

    kimadso

    Регистр.:
    4 апр 2009
    Сообщения:
    178
    Симпатии:
    19
    Тебе что нужно? Уникальность строк или в поисковиках?
    В Перейти по ссылке есть быстрый скриптец на питоне по поиску строчек
     
  10. bummm

    bummm

    Регистр.:
    26 июл 2008
    Сообщения:
    443
    Симпатии:
    95
    А может кто подскажет платную прогу проверки уникальности статей?

    А то из за Advego Plagiatus такие попадосы были...
     
Статус темы:
Закрыта.