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

(Ответов: 4, Просмотров: 4227)
  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) || === 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($text80) . "\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($text1, -1));
        if (
    self::DEBUG) echo "--> " wordwrap($text80) . " \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

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

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

Информеры