Помогите довести до ума и оптимизировать скрипт

Тема в разделе "PHP", создана пользователем karapet, 15 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. karapet

    karapet

    Регистр.:
    9 сен 2008
    Сообщения:
    168
    Симпатии:
    104

    Вообщем пишу скрипт который:
    1. Берет из текста заданное кол-во текста (500 байт например), чистит его от лишних символов.
    2. Переводит с русского на англ. язык через google.translate
    3. Переводит назад с англ. на русский язык.
    4. Разбивает текст на предложения.
    5. Сравнивает два предложения (оригинальное до перевода и переведенное).
    6. Если разницы нету, выкидывает его. Иначе дописывает в файл с переводом.
    PHP:
    <?php
        set_time_limit
    (0);
        
    $bait    300//Количество контента в байтах (~) 
        
    $content file_get_contents('./text.txt'); //Файл
        
    $content clear($content);
        
    $content preg_replace('#([!\?\.]{1,})#'"$1<>"$content); 
        
    $text explode('<>'$content); //Разбиваем по конецу предложения
        
    $result ''
        
    $i 0;
        
    $iii 0;
        
    $good_arr_original = array();
        
    $good_arr_perevod = array();
        foreach(
    $text as $string) { 
            
    $result .= $string
            if(
    strlen($result) >= $bait) { // Набираем нужное количество байт для отправки переводчику
                
    $result str_replace('.''. ',$result); // Объеденяем предложения в блок текста
                
    $result str_replace('  '' ',$result); // Удаляем на всякий случай двойные пробелы
                
    $result_translated translate($result"ru%7Cen"); // Перевод на англ
                
    $result_translated translate($result_translated"en%7Cru"); // Перевод обратно на русский
                // Разбиваем оригинальный блок и перевод на предложения. Составляем массивы без пустых ячеек
                
    $content_original preg_replace('#([!\?\.]{1,})#'"$1<>"$result);
                
    $content_perevod =  preg_replace('#([!\?\.]{1,})#'"$1<>"$result_translated);
                
    $text_original explode('<>'$content_original);
                foreach (
    $text_original as $key_text => $val_text) {
                    if (
    $val_text != '' && $val_text != ' '$good_arr_original[$key_text] = trim($val_text);
                }
                
    $text_perevod =  explode('<>'$content_perevod);
                foreach (
    $text_perevod as $key_text2 => $val_text2) {
                    if (
    $val_text2 != '' && $val_text2 != ' '$good_arr_perevod[$key_text2] = trim($val_text2);
                }
                
    // ------------------------------------------------- //
                
    $cnt1 count($good_arr_original);
                
    $cnt2 count($good_arr_perevod);
                if(
    $cnt1 == $cnt2) { // Если количество предложений одинаковое, составляем массив [ориг.предл] => [перевод предл.]
                    
    for($cnt1$iii <= $cnt1$iii++) {
                        
    $arrayy[$good_arr_original[$iii]] = $good_arr_perevod[$iii];
                    }
                } else 
    $arrayy $good_arr_perevod// Иначе будем работать с тем что есть (не придумал логику на это случай еще...)
                
    $fp fopen("./output.txt"'a');
                foreach (
    $arrayy as $key => $value// По md5 хэшу сравниваем предложения, и в случае не совпадения пишем в файл
                
    {
                    if(
    md5(trim($key)) == md5(trim($value))) { 
                        
    flush; echo '<B> Нет разницы: </B><br>original md5('.md5(trim($key)).' - '.md5(trim($value)).') perevod<br>'
                    }
                    if(
    md5(trim($key)) != md5(trim($value))) { 
                        
    flush; echo '<B>Есть разница: </B><br>original md5('.md5(trim($key)).' - '.md5(trim($value)).') perevod<br>'
                        
    fwrite($fptrim($value).' ');
                    }
                }
                
    fclose($fp);
                
    sleep(rand(15,20));
                
    $i++;
            } 
        }
    // ------------------------------------------------- //
    function translate($src$pair) {
        
    $str $src;
        
    $maxlength 545;
        if(
    strlen($src)<$maxlength) {
            return 
    strtrans($str$pair);
        }
        
    $ret "";
        while(
    true) {        
            
    $sub substr($str0$maxlength);
            if(
    strlen($sub)==$maxlength) {
                
    $pos strrpos($sub".");
                if(
    $pos==0) {
                    
    $pos strrpos($sub" ");
                }
                
    $sub substr($str0$pos+1);
            } else {
                
    $pos 0;
            }        
            
    $ret .= strtrans($sub$pair)." ";
            if((
    $pos-strlen($str)+1) == 0) break;
            elseif(
    $pos !=0$str substr($str$pos-strlen($str)+1);
            else break;
        }
        return 
    $ret;
    }
    function 
    strtrans($str$pair) {
        while(
    true) {
            
    $ch curl_init();
            
    curl_setopt($chCURLOPT_URL"http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=".urlencode($str)."&langpair=".$pair);
            
    curl_setopt($chCURLOPT_HEADER0);
            
    curl_setopt($chCURLOPT_TIMEOUT20);
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
    $new curl_exec($ch);
            
    curl_close($ch);
            if(
    $new!="") break;
        }
        
    preg_match("#\"translatedText\":\"(.*)\"}, \"responseDetails#Ui"$new$m);
        
    $array = array(
            
    '\u0026' => "&",
            
    '\u003c' => "<",
            
    '\u003e' => ">",
            
    '\u003d' => "=",
            
    ' /' => '/'
        
    );    
        
    $res strtr($m['1'], $array);
        
    usleep(100000);
        return 
    $res;
    }
    function 
    clear($parse_txt) {
        
    $parse_txt stripslashes($parse_txt);
        
    $parse_txt str_replace("др.",'другое',$parse_txt);
        
    $parse_txt str_replace("т.д.",'так далее',$parse_txt);
        
    $parse_txt str_replace("т. д.",'так далее',$parse_txt);
        
    $parse_txt str_replace("т.п.",'тому подобное',$parse_txt);
        
    $parse_txt str_replace("т. п.",'тому подобное',$parse_txt);
        
    $parse_txt str_replace("Т. е.",'То есть',$parse_txt);
        
    $parse_txt str_replace("Т.е.",'То есть',$parse_txt);
        
    $parse_txt str_replace("т.е.",'То есть',$parse_txt);
        
    $parse_txt str_replace("т. е.",'То есть',$parse_txt);
        
    $parse_txt str_replace("г.",'года',$parse_txt);
        
    $parse_txt str_replace("/",'',$parse_txt);
        
    $parse_txt str_replace("=",'',$parse_txt);
        
    $parse_txt str_replace("-",' ',$parse_txt);
        
    $parse_txt str_replace("–",' ',$parse_txt);
        
    $parse_txt str_replace("@",'',$parse_txt);
        
    $parse_txt str_replace("#",'',$parse_txt);
        
    $parse_txt str_replace("$",'',$parse_txt);
        
    $parse_txt str_replace("%",'',$parse_txt);
        
    $parse_txt str_replace("^",'',$parse_txt);
        
    $parse_txt str_replace("&",'',$parse_txt);
        
    $parse_txt str_replace("*",'',$parse_txt);
        
    $parse_txt str_replace("(",' ',$parse_txt);
        
    $parse_txt str_replace(")",' ',$parse_txt);
        
    $parse_txt str_replace("_",' ',$parse_txt);
        
    $parse_txt str_replace("+",'',$parse_txt);
        
    $parse_txt str_replace("|",'',$parse_txt);
        
    $parse_txt str_replace("~",'',$parse_txt);
        
    $parse_txt str_replace("`",'',$parse_txt);
        
    $parse_txt str_replace("'",'',$parse_txt);
        
    $parse_txt str_replace("\"",'',$parse_txt);
        
    $parse_txt str_replace("<",'',$parse_txt);
        
    $parse_txt str_replace(">",'',$parse_txt);
        
    $parse_txt str_replace(";",'.',$parse_txt);
        
    $parse_txt str_replace(":",' ',$parse_txt);
        
    $parse_txt str_replace("[",' ',$parse_txt);
        
    $parse_txt str_replace("]",' ',$parse_txt);
        
    $parse_txt str_replace("{",' ',$parse_txt);
        
    $parse_txt str_replace("}",' ',$parse_txt);
        
    $parse_txt str_replace("\/",'',$parse_txt);
        
    $parse_txt str_replace("\\",'',$parse_txt);
        
    $parse_txt str_replace("«",' ',$parse_txt);
        
    $parse_txt str_replace("»",' ',$parse_txt);
        
    $parse_txt str_replace(' , '', ',$parse_txt);
        
    $parse_txt str_replace(' . ''. ',$parse_txt);
        
    $parse_txt str_replace('    ',' ',$parse_txt);
        
    $parse_txt str_replace('  '' ',$parse_txt);
        
    $parse_txt str_replace('  '' ',$parse_txt);
        
    $parse_txt str_replace('  '' ',$parse_txt);
        return 
    $parse_txt;
    }
    ?>
    Кодер из меня как говориться "индуский" :) Писал полночи... Голова уже не сображает(( Помогите ктонить довести до ума и какнить оптимизировать? Ну или ткните носом на мои ошибки пожалуйста..
     
  2. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217


    PHP:
    while(true) { 
            
    $ch curl_init(); 
            
    curl_setopt($chCURLOPT_URL"http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=".urlencode($str)."&langpair=".$pair); 
            
    curl_setopt($chCURLOPT_HEADER0); 
            
    curl_setopt($chCURLOPT_TIMEOUT20); 
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1); 
            
    $new curl_exec($ch); 
            
    curl_close($ch); 
            if(
    $new!="") break; 
        }
    Вот тут бы я поставил ограничение на кол-во циклов, т.к. может случится что угодно, может сервис перестать работать, может глюк случится, может протокол изменится...а цикл станет вечным.


    PHP:
    if(md5(trim($key)) == md5(trim($value))) {
    Тоже по md5 не стал сравнивать, вот попадется неучтенный левый символ при трансляции и строки будут невалидными. md5 зависим от кодировки и соотвественно будет разным.


    PHP:
    $parse_txt str_replace("/",'',$parse_txt); 
        
    $parse_txt str_replace("=",'',$parse_txt); 
        
    $parse_txt str_replace("-",' ',$parse_txt); 
        
    $parse_txt str_replace("–",' ',$parse_txt); 
        
    $parse_txt str_replace("@",'',$parse_txt); 
        
    $parse_txt str_replace("#",'',$parse_txt); 
        
    $parse_txt str_replace("$",'',$parse_txt); 
        
    $parse_txt str_replace("%",'',$parse_txt); 
        
    $parse_txt str_replace("^",'',$parse_txt); 
        
    $parse_txt str_replace("&",'',$parse_txt);
    Вот тут можно было воспользоватся регуляркой
    аля
    preg_replace('%[^a-z0-9.- и прочие символы]+%i', '', $parse_txt);
    Она будет универсальной и быстрее и гораздо чище очистит текст, т.к. тут перечислены лишь разрешенные символы.
     
    karapet нравится это.
  3. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    функция str_replace на вход может принимать массив, поэтому к примеру можно все загнать в массив и не вызывать ф-ю по сто раз в коде программы. Вот пример:

    PHP:
    $needle = array('др.','т.д.','т.п.');//что заменяем
    $haystack = array('другое','так далее','тому подобное');//чем заменяем
    $parse_txt str_replace($needle,$haystack,$parse_txt); 
     
    karapet нравится это.
Статус темы:
Закрыта.