Как по умному доработать синонимайзер, написанный на PHP? Здравствуйте! Нашел в просторах интернета примерный код синонимайзера. Немного доработал его, но несколько проблем осталось. Если например в базе синонимов есть слово телефон и слово он, то при синонимизации в слове телефон последние две буквы меняются, поскольку окончание он воспринимается видимо как слово. Как это можно обойти? И вторая проблема - не знаю как лучше сделать синонимизацию. Если в словаре мало слов, то она нормально проходит. Но если слов становится больше, то синонимизация не работает на всю глубину существующих синонимов на одно слово. Проверка проводилась на банальной фразе Мобильный телефон Samsung. Обменяю на новый iphone.код синонимайзера:$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); }
$str2 = $prefixes[mt_rand(0,count($prefixes)-1)]; //тут можно просто вставить сам текст $repl_array2 = "dictionary.txt"; //база с синонимами $repl_array3 = file($repl_array2);
for ($x=0; $x'; } ?>код базы:ты|он|сам|такой крутой|деловой|навороченный|блатной cотовый телефон|мобилка|cобильник|aага|nелефон|cотовый|мобильный телефонsamsung|Самсунг|LG|Nokia новый|новенький|обновленный|хороший обменяю|отдам|разменяю|поменяю|дам в размен Iphone|Айфон|IP|Nokia 3210
Для решения проблемы с окончаниями слов, необходимо изменить способ поиска и замены. Вместо использования регулярного выражения с символом #, можно использовать полноценное слово с пробелом до и после него, чтобы избежать замены последних букв. Например, вместо '#он#' использовать ' он '.
Для улучшения работы синонимайзера на более глубокие уровни синонимизации, рекомендуется изменить логику загрузки и хранения базы синонимов. Вместо файла можно использовать базу данных, где каждое слово будет связано с одним или несколькими синонимами. Также можно разделить базу на группы синонимов, чтобы увеличить глубину обработки.
Пример модифицированного кода:
function synonimize($str, $repl_array){ foreach ($repl_array as $words) { $synonyms = explode('|', $words); foreach ($synonyms as $synonym) { $str = str_ireplace(" $synonym ", ' '. $synonyms[array_rand($synonyms)], $str); } } echo ucfirst($str); } $repl_array2 = [ ['ты|он|сам|такой'], ['крутой|деловой|навороченный|блатной'], ['сотовый телефон|мобилка|сотовый|мобильный телефон samsung|самсунг|lg|nokia'], ['новый|новенький|обновленный|хороший'], ['обменяю|отдам|разменяю|поменяю|дам в размен'], ['iphone|айфон|ip|nokia 3210'] ]; $str2 = 'Мобильный телефон Samsung. Обменяю на новый iPhone.'; for ($x=0; $x<5; $x++) { echo synonimize($str2, $repl_array2) . '<br>'; }
В этом коде используется двумерный массив для хранения синонимов по группам. Функция synonimize теперь проходит по каждой группе слов и заменяет каждое слово на случайный синоним из этой группы. Такой подход позволяет улучшить качество синонимизации и расширить базу слов.
Для решения проблемы с окончаниями слов, необходимо изменить способ поиска и замены. Вместо использования регулярного выражения с символом #, можно использовать полноценное слово с пробелом до и после него, чтобы избежать замены последних букв. Например, вместо '#он#' использовать ' он '.
Для улучшения работы синонимайзера на более глубокие уровни синонимизации, рекомендуется изменить логику загрузки и хранения базы синонимов. Вместо файла можно использовать базу данных, где каждое слово будет связано с одним или несколькими синонимами. Также можно разделить базу на группы синонимов, чтобы увеличить глубину обработки.
Пример модифицированного кода:
function synonimize($str, $repl_array){foreach ($repl_array as $words) {
$synonyms = explode('|', $words);
foreach ($synonyms as $synonym) {
$str = str_ireplace(" $synonym ", ' '. $synonyms[array_rand($synonyms)], $str);
}
}
echo ucfirst($str);
}
$repl_array2 = [
['ты|он|сам|такой'],
['крутой|деловой|навороченный|блатной'],
['сотовый телефон|мобилка|сотовый|мобильный телефон samsung|самсунг|lg|nokia'],
['новый|новенький|обновленный|хороший'],
['обменяю|отдам|разменяю|поменяю|дам в размен'],
['iphone|айфон|ip|nokia 3210']
];
$str2 = 'Мобильный телефон Samsung. Обменяю на новый iPhone.';
for ($x=0; $x<5; $x++) {
echo synonimize($str2, $repl_array2) . '<br>';
}
В этом коде используется двумерный массив для хранения синонимов по группам. Функция synonimize теперь проходит по каждой группе слов и заменяет каждое слово на случайный синоним из этой группы. Такой подход позволяет улучшить качество синонимизации и расширить базу слов.