Подправить скрипт генерации предложений.
Имеется скрипт, который формирует новый текст из предложений с помощью цепей маркова. Проблема в том, что в итоге на странице очень часто повторяются части предложения одного и того же. Даже, если делается, что мы по Маркову делаем 50 предложений из 1000 изначальных.
Требуется это как-то подправить, но! нельзя менять названия переменных никаких - они используются в дальнейшем в другой системе.
/**
* Функция разбивает входящий текст на слова, и складывает нвоый текст на основе цепей Маркова.
*
* @param type $text
* @param type $countp
* @param type $count_in
* @param type $key_parts_in
* @param type $key_type_in
* @return string
*/
function markov($text, $countp, $count_in = 0, $key_parts_in = 0, $key_type_in = 'query'){
# http://www.manhunter.ru/webmaster/358_generator_teksta_na_osnove_cepey_markova.html
$txt = preg_replace('~[^-0-9a-zа-яёaou?їіє\s!\?\.\,&;]~ui', '', $text);// Убрать из текста символы кроме цифр, букв и некоторых знаков препинания
$txt = preg_replace('~ {1,}([!\?\.\,])~', '\\1', $txt);// Подчистить пробелы перед окончаниями предложений
$txt = preg_replace('~([\n\r]+|[\s]+)~u',' ',$txt);// Лишние пробелы | переносы строк
$tmp = explode(' ', trim($txt));// Поделить текст на слова
if (count($tmp)
$words = Array();// Массив "звеньев"
// Заполнить звенья
for($i=0; $i
if ($tmp[$i+1]!='') {
$words[$tmp[$i]][] = $tmp[$i+1];
}
}
$words = array_map('array_unique',$words);
$start = Array();// Массив начальных слов в предложениях
foreach($words as $word => $links) {
if (preg_match('~^[А-ЯA-Z][а-яa-z]+~u',$word)) {
$start[] = $word;
}
}
// Сгененировать $countp предложений на основе исходного текста
$sentences = array();
for ($i=0; $i
while (true) {
$w = $start[array_rand($start)];
if (preg_match('~[\.!\?]$~',$w)) continue;
$sentence = $w.' ';
$cnt=1;// Количество слов в предложении
while(true) {// Сгенерировать предложение
// Переключить цепочку
$rand_key = array_rand($words[$w]);
$w = $words[$w][$rand_key];
$sentence .= $w.' ';
// Если слово находилось в конце предложения
if (preg_match('~[\.!\?]$~',$w)) break;
$cnt++;
if ($cnt>=18){
$sentence .= '.';
break;// Если генератор зациклился, то принудительно выйти
}
}
// Удачным считать предложение длиной 5-20 слов
if ($cnt>5 && $cnt
}
// Сгенерированное предложение
$sentences[] = $sentence;