Синонимайзер на PHP – достаточно одной строчки
Как лучше назвать: синонимайзер или синонимизатор. Можно просто написать: “синоним(айзер|изатор)”, после чего передать эту строку php-функции, в результате получив одно из написаний. Это и будет синонимизация контента, т.е. генерация уникальных описаний.
Единственное, что я не понимаю – зачем делать из этого событие. Потому что достаточно одной строчки на PHP.
Итак, имеем строку $s:
$s = 'Чтобы начать (работать|валять дурака|сходить с ума) надо заняться (спортом|сексом|чтением блогов)';
Всё, что нужно – в следующей строчке:
echo preg_replace('/\( (.*?) \)/xse', '$ar[array_rand($ar = explode("|", "\\1"), 1)]', $s);
В итоге получилось вот это.
Здесь стоит предупредить, что строка $s НЕ ДОЛЖНА БЫТЬ ДОСТУПНА ДЛЯ РЕДАКТИРОВАНИЯ ПОЛЬЗОВАТЕЛЮ. Иначе мы получим выполнение произвольного php-кода :).
Чтобы этого не было, и чтобы разобраться подробнее:
echo preg_replace_callback('/\( (.*?) \)/xs', "random_words", $s);
function random_words($m)
{
$ar = explode("|", $m[1]);
return $ar[array_rand($ar, 1)];
}
В первой строчке мы вызываем функцию «найти и заменить по регулярному выражению», где массив совпадений передаётся в функцию, а возвращаемое функцией значение подставляется на место совпадения с маской. Экранируем круглые скобки, добавляем модификатор “x”, чтобы игнорировать пробелы (которые добавили для наглядности).
Функция у нас получает массив вида:
Array
(
[0] => (работать|валять дурака|сходить с ума)
[1] => работать|валять дурака|сходить с ума
)
Берём $m[1], превращаем его в массив $ar, разделяя по “|”. И возвращаем случайный ключ из массива $ar.
Всё. (Действительно, зачем мне было делать из этого событие
)

июля 12, 2008 в 23:05
Думаю, событие делается из рассчета на тех людей, которые даже приблизительно не знают PHP, а поэтому не могут определить, насколько сложно создать одну или другую функцию.
июля 16, 2008 в 11:15
Это больше похоже на уникализатор чем на синонимайзер.
июля 16, 2008 в 11:20
Ну в субмиттере это действительно полезная штука (особенно, если там реализован макроязык на уровне SAG), а так да, не событие мирового масштаба. Ну сделал человек полезную для непрограммистов штуку, которую за час, наверное, можно сделать и раздает, не продает же в самом деле, жаль я не додумался
“сеошников” много, которые не то что программирования, а даже html толком не знают
июля 16, 2008 в 11:21
Вован, уникализаторов полно, а синонимайзера нету нормального доступного, маркетинговый ход
июля 22, 2008 в 19:37
2VolCh
“сеошников” много, которые не то что программирования, а даже html толком не знают -
для нас программистов это очень хорошо! Есть много людей, которые могут заплатить деньги за элементарный скрипт, только потому что не знают, насколько это элементарно.
августа 5, 2008 в 18:49
Еще б так просто морфологию учитывать можно было
августа 13, 2008 в 11:18
а как еще в это регулярное выражение добавить [..|..|..|..|..] что бы preg_replace_callback вызывал функцию перемешивания всего что в квадратных скобках. согласен стыдно не знать основы. но это РВ всегда мне не нравились.
можно конечно сначала перемешать потом заменить, но хочется сделать красиво
августа 13, 2008 в 16:09
2 mihalich: Ну, это не основы
конечно.
заменить регулярное выражение на:
'/\[ (.*?) \]/xs’августа 21, 2008 в 16:38
а preg_replace_callback вызовет random_words для каждой пары скобок []?
августа 22, 2008 в 13:55
я же кажется написал, что достаточно заменить
\(на\[– просто скобки (как спецсимволы регэксов) надо экранировать обратным слэшем. Хотите qqqq*([*ааа|ббб|ввв*])* – пишите'/\*\(\[\*(.*?)\*\]\)\*/s’(убрал лишние пробелы и следовательно не нуженx)сентября 2, 2008 в 13:00
спасибо!!! сделал сначала обработку [..|..|..|..|..] а потом (..|..|..|..|..)
ломаю голову как бы усложнить что обрабатывать любые выражения типа [..(..|..)..|..] и наоборот (..[..|..]..) или даже что то вроде такого (..[..|(..|..)]..|..)
сентября 3, 2008 в 13:50
Только для квадратной скобки:
$s = '[Дед|Баб]ушка [идёт [погулять|в магазин]..|поехали [сюда[!|?|.]]]'; while($s0 != $s = preg_replace_callback('/\[ ([^\[\]]*) \]/xs', "random_words", $s0 = $s)); echo $s;Для
[ ]и( ):while($s0 != $s = preg_replace_callback('/(?: (\[)|(\() ) ([^\[\]\(\)]*) (?(1) \]|\) )/xs', "random_words", $s0 = $s));и в функции
random_words–$m[3].сентября 9, 2008 в 17:22
программа SEO anchor generator делает примерно тоже самое, только вот функций побольше…
октября 4, 2008 в 23:51
В силу своей лаконичности - один из лучших постов по уникализации текста! Если ПХП кое-как понимаю, то регулярные выражения - для меня китайское таинство. В общем спасибо! Пойду внедрять на своем самописном сайтике.
октября 14, 2008 в 15:25
//Синонимайзер на PHP – достаточно одной строчки
офигеть, а мы то думали….
Лучше базу синонимов выложи хорошую, а то составлять такие шаблоны-заготовки это такой геморой
декабря 22, 2008 в 17:35
ну это ИМХО не совсем синонимайзер. просто перебор заданных спец образом слов.
а если б реальный синонимайзер написать. чтоб сам в тексте слова брал. по базе синонимов их пробивал. и потом менял их в тексте. + базу синонимов к этому делу… от это было б сильно )))
февраля 1, 2009 в 15:40
Спасибо!!!!
Хоть в php и разбираюсь, но так лаконично все написано, и объяснено потом хорошо, что и для чего. Как отдельную систему хз где употребить, а вот как сотавную часть с другой, воспользоваться идеей, очень даже.
марта 5, 2009 в 01:03
Синонимайзер на php с возможностью добавления синонимов цена всего 20wmz
Пример работы скрипта http://www.procsy.ru/sinonim/
По вопросам приобретения sinonima@yandex.ru
апреля 25, 2009 в 09:03
имеется база синонимов 20,000 слов под бесплатный синонимайзер. Могу переделать под любой другой. цена символическая 1$ или договорная
ася 198420945
июня 12, 2009 в 16:07
Вот тоже нашол неплохой скрипт который написан на php, не использует базы данных, база синонимов находится в php файле и доступна для редактировании. При обработке теста скрипту не важно написано слово с большой буквы или с маленькой, стоит ли после или перед словом знак препинания. В скрипте предусмотрена функция добавления в базу слов и словосочетаний неограниченной длинны даже со знаками препинания. Вся база синонимов скрипта уникальна и собранна в ручную с учетом морфологии, в ней находится более 91 000 слов и словосочетаний, благодаря этому на выходе получатся на 80% - 90% читаемый текст без искажения смысла. Уникальной особенностью данного скрипта является то, что при размере базы почти в 100 000 слов и соответственно столько же синонимов к ним, скрипт обрабатывает текст за доли секунд, благодаря чему данный скрипт можно использовать как функцию. Пример работы скрипта: http://www.phpsin.ru/sinonim/
за этот скрипт просят денег но походу он стоит этого.