Пишем синонимайзер своими руками

(Ответов: 4, Просмотров: 4455)
  1. Студент
    • Регистрация: 13.09.2011
    • Сообщений: 64
    • Репутация: 23
    Добрый день уважаемые вебмастера.
    Что ж вдоволь насмотрелся я на контингент данного форума.
    Одни сплошные СЕОШНИКИ из разряда Купи продай:).
    Я считаю так нельзя надо исправлять ситуацию.
    Итак в этой теме я расскажу как довольно просто написать свой собственный синонимайзер.
    Зачем это нужно ведь в интернете полно бесплатных синонимайз сервисов?
    Так то да но дело в том что:
    Во-первых: свое оно всегда лучше.
    Во вторых: синонимайзер жрет очень много ресурсов сам по себе, и синонимировать большие обьемы текста в автоматическом режиме никто вам за бесплатно не даст.

    И так приступим к практике:
    Для начала нам нужно пошарить в интернете:)
    http://www.skillz.ru/dev/php/article...er_na_PHP.html вот здесь есть отличная статья по данному поводу. именно ее я взял за основу данного урока.
    Итак этап первый
    Для начала определимся как будет выглядеть наш словарь синонимов назовем его dic.txt
    Мне понравилось так как описано в статье
    то есть вот такой формат
    Код:
    белок => вытаращить арабские белки
    волос => шерсть | щетина | пух | пушок | ворса; вихор | грива | хохол | челка | чуб | шевелюра | коса | борода | усы | бакенбарды | бакены | баки | висок | кудер | косма | прядь
    антик => редкость | чудак
    впрок => заготовлять впрок | не впрок
    багаж => вещи | кладь | поклажа | клажа | ноша | груз | фрахт
    вкось => и вкривь | и вкось
    беляк => франт
    ...
    вот наш словарь синонимов, не густо правда? как его дополнить?
    И тут нам опять поможет великий интернет. Где то на варезных файлосвалках валяется одна вещица, называется она словарь синонимов для Allsubmitter 5.0 (советую погуглить) вот она нам как раз и пригодится
    ( файл в формате UTF-8 его нужно перекодировать в cp1251 это можно сделать через обычный блокнот)
    Но только один нюанс там словарь в формате
    Код:
    слово::синоним1, синоним2
    Не порядок, но ничего страшного мы то с вами как программисты знаем как выкрутиться
    Пишем код для конвертации формата словаря в удобный нами
    создаем файл converter.php пишем туда следующий код
    PHP код:
    $fh=fopen("syn.txt","r");
    $f=fopen("dic.txt","a");
    while(!
    feof($fh))
    {
    $line=fgets($fh);
    $line=str_replace("::" => ",$line);
    $line=str_replace(", " | ",$line);
    fwrite($f,$line);
    }
    fclose($f);
    fclose($fh);
    echo 
    'vse'; 
    Потом просто запускаем данный файл через браузер на сервере и вуаля наш словарь сделан.
    Так словарь у нас есть теперь нужно сделать класс синонимайзера, то есть механизм работы нашего синонимайзера.
    Этап второй
    Создаем файл sinonym.php и пишем туда наш класс
    PHP код:
    class synonimizer {
     
     const 
    DEBUG = 0;
     
     const 
    ROW_DELIM   = '=>';   
     const 
    VALUE_DELIM = '|';   
     
     private 
    $_dic_file = 'dic.txt';
     
     
    /**
     * @private array 'syn' = array(value, value, value)
     */
     
    private $parsed = array();
     
     
     function 
    __construct() {
         
         
    $_parsed = file(dirname(__FILE__) . '/' . $this->_dic_file);
         
        foreach (
    $_parsed as $k => $v) {
          
    $v = trim($v); 
          if (empty(
    $v) || 0 === strpos($v, '#')) {
            ; 
    // nop
          
    }
          else {
            
    $v = explode(self::ROW_DELIM, $v);
            
    $_key = trim($v[0]);
            
    $_data = array();
            if (
    strpos($v[1], self::VALUE_DELIM) !== false) {
                
    $data = explode(self::VALUE_DELIM, $v[1]);
                foreach (
    $data as $dk => $dv) {
                    
    $_data[$dk] = trim($dv);
                }
            }
            else {
                
    $_data = array(trim($v[1]));
                if (
    strpos($_data[0], '@') === 0) {
                    
    // this is alias
                    
    $_data = $this->parsed[substr($_data[0], 1)];
                }
            }
         
            
    // save
            
    $this->parsed[$_key] = $_data;
          }
        }
     }
     
     
    /**
     * Callback
     */
     
    static $_c_matches = false;
     static function 
    syn_callback($matches) {
         
    $out = $matches[2];
         if (
    self::DEBUG) echo " -- " . $out . "\n";
         if (!empty(
    self::$_c_matches)) {
             
    $i = count(self::$_c_matches) - 1;
             
    $i = ($i > 0) ? mt_rand(0, $i) : 0;
             
    $out = self::$_c_matches[$i];
         }
         if (
    self::DEBUG)  echo " ++ " . $out . "\n\n";
         return 
    $matches[1] . $out . $matches[3];
     }
     
     private static 
    $index = 0;
     
     public function 
    syn($text) {
     
       
    $text = ' ' . str_replace(array('\r\n', '\n'), "\r\n", $text) . ' ';
       
    self::$index++;
       echo 
    ">>> " . self::$index . "\n";
       
       if (
    self::DEBUG) {
           echo 
    str_repeat("-", 80) . "\n" . wordwrap($text, 80) . "\n" .  str_repeat("-", 80) . "\n\n";
        }
     
        foreach (
    $this->parsed as $key => $matches) {
            
    self::$_c_matches = &$matches;
            
    $text = preg_replace_callback(
            
    '#([^\w\d\-])(' . preg_quote($key) . ')([^\w\d\-])#i'// ([^\w\d\-]) //([\s\.\,])
            
    , 'synonimizer::syn_callback'
            
    , $text
            
    );
         
        }
     
        
    $text = str_replace("\r\n", '\r\n', substr($text, 1, -1));
        if (
    self::DEBUG) echo "--> " . wordwrap($text, 80) . " \n\n";
        return 
    $text;
     }
    } 
    Заключительный этап
    Ну а теперь в качестве демонстрации работы скрипта напишем простую оболочку: многострочное текстовое поле и кнопка "синонимировать" заполняем поле исходным текстом => нажимаем кнопку => получаем синонимированный текст
    php код оболочки:
    PHP код:
    set_time_limit(0);
    include(
    "sinonym.php");
    if(
    $_POST["act"]=="go")
    {
    $syn = new synonimizer();
    $result_text = $syn->syn($_POST["text"]);
    echo 
    $result_text;
    }
    else
    {
    echo
    '<form action="" method="POST"><input type="hidden" name="act" value="go"><textarea name="text"></textarea><br><input type="submit" value="синонимировать"></form>';
    } 
    Вот собственно говоря и всё.
    Синонимайзер готов. Можно смело клепать сплоги и ДДЛ
    Надеюсь данная тема была интересна.
    Если кому данный синонимайзер понравился, но не сильны в php и хотите иметь более продвинутый вариант к примеру на в ход подавать текстовый файл с исходным текстом или того хуже базу данных с текстами.
    То всего за 10 вечнозеленых рублей я вам с радостью это все реализую и при желании даже установлю на сервер и проконсультирую как все оптимизировать дабы избежать излишнего потребления ресурсов.

    В следующей теме я планирую рассказать как написать свой парсер YouTube
    Не переключайтесь
    Последний раз редактировалось Kenars; 15.04.2012 в 22:45.
    • 11

    Спасибо сказали:

    13й(16.12.2012), amaya(18.10.2012), ArhStrAngeR(16.04.2012), dekartwork(15.04.2012), feuer81(16.04.2012), Furin(15.04.2012), isachenko(15.10.2015), NukeKuper(16.10.2015), psy_spray(18.04.2012), semyon(15.04.2012), TbIKBA(16.04.2012),
  2. Web-разработка Аватар для semyon
    • Регистрация: 20.06.2011
    • Сообщений: 1,781
    • Репутация: 549
    • Webmoney BL: ?
    Неплохо :) Жаль только не нуждаюсь в нём :)
    А вот от урока по созданию своего автопостера не отказался бы :)
    • 0
  3. Студент
    • Регистрация: 13.09.2011
    • Сообщений: 64
    • Репутация: 23
    semyon
    Будет обязательно будет урок по созданию автопостера.
    Всему свое время
    • 2

    Спасибо сказали:

    NukeKuper(16.10.2015), TbIKBA(16.04.2012),
  4. Super Moderator Аватар для TbIKBA
    • Регистрация: 04.08.2011
    • Сообщений: 2,002
    • Репутация: 1574
    • Webmoney BL: ?
    Воооот что нужно, вот это классный тип статей - программирование для вебмастера, наглядно с примерами. Синонимайзер врят ли пригодится, но в любом случае полезно. Ждем следующих статей :-)
    • 0
  5. Новичок Аватар для AZANIR
    • Регистрация: 16.06.2015
    • Сообщений: 8
    • Репутация: 0
    • Webmoney BL: ?
    Цитата Сообщение от TbIKBA Посмотреть сообщение
    Воооот что нужно, вот это классный тип статей - программирование для вебмастера, наглядно с примерами. Синонимайзер врят ли пригодится, но в любом случае полезно. Ждем следующих статей :-)
    Кому как вот счас делаю проект по парсингу и как раз нужен синонимайзер не сложный для онлайн обработки парсинга). А тут еще и с примерами.
    • 0

Похожие темы

Темы Раздел Ответов Последний пост
Делаем твиттер-бота своими руками
Дайджест блогосферы 2 27.11.2011 16:31
Пишем правильный синонимайзер
Дайджест блогосферы 0 09.09.2010 16:47
php: Парсер своими руками. Теория
Дайджест блогосферы 0 25.12.2009 17:36
Сбор proxy своими руками.
Прочее 33 15.10.2009 23:02

У кого попросить инвайт?

Вы можете попросить инвайт у любого модератора:

Информеры