cdroller
Я думаю что все алгоритмы примерно одинаковы... Что-нибудь типа этого.
<?php
error_reporting(255);
ini_set("max_execution_time", "180");
// файл для вывода результата (должны быть назначены права разрешающие запись)
$result = "result.txt";
$fresult = fopen($result, "a") or die ("Ошибка при открытии файла " . $result . " или не достаточно прав для записи");
// Прочитать исходный текст, на основе которого будет генерироваться новый
$str=file_get_contents('text.txt');
// Установить кодировку системы
setlocale(LC_ALL, 'en_EN.CP1252');
// Убрать из текста символы кроме цифр, АНГЛ букв и некоторых знаков препинания
$str=eregi_replace('[^-a-z0-9 !\?\.\,]',' ',$str);
// Подчистить пробелы перед окончаниями предложений
$str=eregi_replace(' {1,}([!\?\.\,])','\\1',$str);
// Поделить текст на слова
$tmp=preg_split('/[[:space:]]+/is',$str);
// Массив "звеньев"
$words=Array();
// Заполнить звенья
for($i=0; $i<count($tmp); $i++) {
if ($tmp[$i+1]!='') {
$words[$tmp[$i]][]=$tmp[$i+1];
$words[$tmp[$i]]=array_unique($words[$tmp[$i]]);
}
}
// Массив начальных слов в предложениях
$start=Array();
foreach($words as $word=>$links) {
if (ereg('^[A-Z][a-z]+',$word)) {
$start[]=$word;
}
}
// Сгененировать 10к предложений на основе исходного текста
for ($i=0; $i<10000; $i++) {
set_time_limit(0);
while (true) {
$w=$start[rand(0,(count($start)-1))];
if (ereg('[\.!\?]$',$w)) { continue; }
$sentence=$w.' ';
// Количество слов в предложении
$cnt=1;
// Сгенерировать предложение
while(true) {
$links=$words[$w];
// Переключить цепочку
$w=$words[$w][rand(0,(count($words[$w])-1))];
$sentence.=$w.' ';
// Если слово находилось в конце предложения
if (ereg('[\.!\?]$',$w)) { break; }
$cnt++;
// Если генератор зациклился, то принудительно выйти
if ($cnt>19) { break; }
}
// Удачным считать предложение длиной 5-20 слов
if ($cnt>5 && $cnt<20) { break; }
}
// Сгенерированное предложение записать в файл
$sentence = $sentence . "\r\n";
fwrite($fresult, $sentence);
}
fclose($fresult);
echo 'ГОТОВО';
?>
А дальше можно улучшениями заниматься. Например, сделать массив слов для замены на кейворды
$replace = array('/ porns /', '/ porn /', '/ sexy /', '/ sex /', '/ sites /', '/ site /', '/ videos /', '/ video /', '/ photos /', '/ photo /');
Чтобы, если взять адалтный текст, то можно было бы ключевики втыкать красиво, например porns -> amateur porn, нету слова porns - берем следующее из списка и так далее. Но не всегда кей втыкать, а например с % определенным. Просто генератором случайных чисел определяем будем ли вообще заменять в предложении на ключевик, так например
$ver = 30; // вероятность получить кейворд в предложении от 1 до 100
if ( mt_rand ( 1, 100 ) <= $ver ) {
// тут парсим наш сгенеренный текст и заменяем слова из массива на кей
}
Ну и так далее. На самом деле, наверное есть и готовые решения, или из доргена выдернуть, например валяется везде в интернете дорген на пыхе Red.Button.TRANSFORMER можно его скачать и раздербанить, взять функции генерации или целиком дорген заюзать.
Может и готовые решения есть платные, но я не знаю, не интересовался никогда. Наверняка есть.
Кстати под РУ или АНГЛ, разницы в общем то нет особой, по Маркову одинаково хорошо генерируется текст практически на всех языках, не сложно понять почему. А в коде небольшие корректировки.