Здравствуйте! Нашел в просторах интернета примерный код синонимайзера. Немного доработал его, но несколько проблем осталось. Если например в базе синонимов есть слово телефон и слово он, то при синонимизации в слове телефонпоследние две буквы меняются, поскольку окончание он воспринимается видимо как слово. Как это можно обойти? И вторая проблема - не знаю как лучше сделать синонимизацию. Если в словаре мало слов, то она нормально проходит. Но если слов становится больше, то синонимизация не работает на всю глубину существующих синонимов на одно слово. Проверка проводилась на банальной фразе Мобильный телефон Samsung. Обменяю на новый iphone. код синонимайзера: PHP: <?php mb_internal_encoding("UTF-8"); function synonimize($str, $repl_array){ $keys = array_map(function($key){ return '#'.$key.'#ui'; }, $repl_array); foreach ($keys as $i=>$key) { $str = preg_replace_callback($key, function ($match) use ($repl_array, $i) { $syns = explode('|', $repl_array[$i]); array_splice($syns, array_search(mb_strtolower($match[0]), array_map('mb_strtolower', $syns)), 1); return $syns[rand(0, count($syns) - 1)]; }, $str); } echo preg_replace_callback('~(?:^|\.\s*)\w~u', function($m) { return mb_strtoupper($m[0]); }, $str); } $str2 = $prefixes[mt_rand(0,count($prefixes)-1)]; //тут можно просто вставить сам текст $repl_array2 = "dictionary.txt"; //база с синонимами $repl_array3 = file($repl_array2); for ($x=0; $x<5;$x++){ echo synonimize($str2,$repl_array3).'<br>'; } ?> код базы: Код (Text): ты|он|сам|такой крутой|деловой|навороченный|блатной cотовый телефон|мобилка|cобильник|aага|nелефон|cотовый|мобильный телефонsamsung|Самсунг|LG|Nokia новый|новенький|обновленный|хороший обменяю|отдам|разменяю|поменяю|дам в размен Iphone|Айфон|IP|Nokia 3210
@Medvedoc ну как бы формат словаря я бы сказал не совсем удачный.. не проще хранить слова попарно и уже от этого плясать?
А можете пояснить подробнее? Мне просто нужно, чтобы слова менялись синонимами цельно, а не частями Сейчас получается так, что если в словаре есть два слова с синонимами он|ты|они телефон|мобильник|сотовый то в слове телефон окончание он воспринимается как слово и меняется на синоним. Мне просто надо обойти эту проблему.
@Medvedoc то есть цельно? я имел ввиду типа есть база вида: наваждение - сон сон - мечта мечта - стремление и выводить некоторое количество вложеных синонимов. вот к примеру можешь глянуть схожую реализацию http://sociation.org/
Увы - это не совсем то =((( Мне придется в таком случае собирать базу синонимов подобным образом. А словарь будет у меня узкопрофильный. Может есть вариант как-то решить проблему иначе?
@Medvedoc ну если дело только в "он" то производи поиск с добавлением разделителя "|он|","он|","|он" или регуляркой, или опять таки менять формат словаря. я бы в качестве словаря рекомендовал юзать бд. так пхп плохо работает с большими файлами
в том-то и дело, что не только в этом слове дело. Оно происходит всегда с подобными ситуациями. Насколько я понял проблема зарыта в этом кусочке кода PHP: $keys = array_map(function($key){ return '#'.$key.'#ui'; }, $repl_array); Получается через регплейс по регулярке меняется одно значение на другое. В качестве регулрки выступает как раз это кусочек кода. Но никак не пойму почему меняется часть слова, а не слово целиком.