| Добрый день уважаемые вебмастера. Что ж вдоволь насмотрелся я на контингент данного форума. Одни сплошные СЕОШНИКИ из разряда Купи продай:). Я считаю так нельзя надо исправлять ситуацию. Итак в этой теме я расскажу как довольно просто написать свой собственный синонимайзер. Зачем это нужно ведь в интернете полно бесплатных синонимайз сервисов? Так то да но дело в том что: Во-первых: свое оно всегда лучше. Во вторых: синонимайзер жрет очень много ресурсов сам по себе, и синонимировать большие обьемы текста в автоматическом режиме никто вам за бесплатно не даст. И так приступим к практике: Для начала нам нужно пошарить в интернете:) 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. |
Спасибо сказали: | 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), | |