Mr.KTO blog

  • Поиск

  •  
      
  • Рубрики

  • Реклама


Синонимайзер на 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.

Всё. (Действительно, зачем мне было делать из этого событие :) )

habrahabr.ru google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru rumarkz.ru memori.ru moemesto.ru moikrug.ru myscoop.ru mister-wong.ru rucity.com vaau.ru

Комментарии (20) на “Синонимайзер на PHP – достаточно одной строчки”

  1. jarofed пишет:

    Думаю, событие делается из рассчета на тех людей, которые даже приблизительно не знают PHP, а поэтому не могут определить, насколько сложно создать одну или другую функцию.

  2. Вован пишет:

    Это больше похоже на уникализатор чем на синонимайзер.

  3. VolCh пишет:

    Ну в субмиттере это действительно полезная штука (особенно, если там реализован макроязык на уровне SAG), а так да, не событие мирового масштаба. Ну сделал человек полезную для непрограммистов штуку, которую за час, наверное, можно сделать и раздает, не продает же в самом деле, жаль я не додумался :) “сеошников” много, которые не то что программирования, а даже html толком не знают

  4. VolCh пишет:

    Вован, уникализаторов полно, а синонимайзера нету нормального доступного, маркетинговый ход ;)

  5. Алексей Качаев пишет:

    2VolCh
    “сеошников” много, которые не то что программирования, а даже html толком не знают -
    для нас программистов это очень хорошо! Есть много людей, которые могут заплатить деньги за элементарный скрипт, только потому что не знают, насколько это элементарно.

  6. Синонимайзер ru пишет:

    Еще б так просто морфологию учитывать можно было :)

  7. mihalich пишет:

    а как еще в это регулярное выражение добавить [..|..|..|..|..] что бы preg_replace_callback вызывал функцию перемешивания всего что в квадратных скобках. согласен стыдно не знать основы. но это РВ всегда мне не нравились.

    можно конечно сначала перемешать потом заменить, но хочется сделать красиво

  8. mrkto пишет:

    2 mihalich: Ну, это не основы :) конечно.

    заменить регулярное выражение на: '/\[ (.*?) \]/xs’

  9. maxivanov пишет:

    а preg_replace_callback вызовет random_words для каждой пары скобок []?

  10. mrkto пишет:

    я же кажется написал, что достаточно заменить \( на \[ – просто скобки (как спецсимволы регэксов) надо экранировать обратным слэшем. Хотите qqqq*([*ааа|ббб|ввв*])* – пишите '/\*\(\[\*(.*?)\*\]\)\*/s’ (убрал лишние пробелы и следовательно не нужен x)

  11. mixavoron пишет:

    спасибо!!! сделал сначала обработку [..|..|..|..|..] а потом (..|..|..|..|..)

    ломаю голову как бы усложнить что обрабатывать любые выражения типа [..(..|..)..|..] и наоборот (..[..|..]..) или даже что то вроде такого (..[..|(..|..)]..|..)

  12. mrkto пишет:

    Только для квадратной скобки:

    $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].

  13. mat пишет:

    программа SEO anchor generator делает примерно тоже самое, только вот функций побольше…

  14. Borigen пишет:

    В силу своей лаконичности - один из лучших постов по уникализации текста! Если ПХП кое-как понимаю, то регулярные выражения - для меня китайское таинство. В общем спасибо! Пойду внедрять на своем самописном сайтике.

  15. Kirill Drugs пишет:

    //Синонимайзер на PHP – достаточно одной строчки

    офигеть, а мы то думали….
    Лучше базу синонимов выложи хорошую, а то составлять такие шаблоны-заготовки это такой геморой

  16. bugor пишет:

    ну это ИМХО не совсем синонимайзер. просто перебор заданных спец образом слов.
    а если б реальный синонимайзер написать. чтоб сам в тексте слова брал. по базе синонимов их пробивал. и потом менял их в тексте. + базу синонимов к этому делу… от это было б сильно )))

  17. Кирилл пишет:

    Спасибо!!!!
    Хоть в php и разбираюсь, но так лаконично все написано, и объяснено потом хорошо, что и для чего. Как отдельную систему хз где употребить, а вот как сотавную часть с другой, воспользоваться идеей, очень даже.

  18. Дмитрий пишет:

    Синонимайзер на php с возможностью добавления синонимов цена всего 20wmz
    Пример работы скрипта http://www.procsy.ru/sinonim/
    По вопросам приобретения sinonima@yandex.ru

  19. nick пишет:

    имеется база синонимов 20,000 слов под бесплатный синонимайзер. Могу переделать под любой другой. цена символическая 1$ или договорная
    ася 198420945

  20. Дмитрий пишет:

    Вот тоже нашол неплохой скрипт который написан на php, не использует базы данных, база синонимов находится в php файле и доступна для редактировании. При обработке теста скрипту не важно написано слово с большой буквы или с маленькой, стоит ли после или перед словом знак препинания. В скрипте предусмотрена функция добавления в базу слов и словосочетаний неограниченной длинны даже со знаками препинания. Вся база синонимов скрипта уникальна и собранна в ручную с учетом морфологии, в ней находится более 91 000 слов и словосочетаний, благодаря этому на выходе получатся на 80% - 90% читаемый текст без искажения смысла. Уникальной особенностью данного скрипта является то, что при размере базы почти в 100 000 слов и соответственно столько же синонимов к ним, скрипт обрабатывает текст за доли секунд, благодаря чему данный скрипт можно использовать как функцию. Пример работы скрипта: http://www.phpsin.ru/sinonim/
    за этот скрипт просят денег но походу он стоит этого.

Оставить комментарий