Скрипт генерации текста

Статус
В этой теме нельзя размещать новые ответы.

serrgo

Гуру форума
Регистрация
13 Авг 2006
Сообщения
158
Реакции
78
Скрипт генерации текста по цепям маркова:

PHP:
<?
error_reporting(0);
$num_key=1000;
$fname="text.txt";
$input_text=implode("",file($fname));
$input_text=str_replace("/r/n","",$input_text);
$input_text=eregi_replace("([^[:blank:]])(\\- )","",$input_text);
$input_text=split("[[:blank:]]+",strtolower($input_text));
$a=mt_rand(0,count($input_text)-4);
$pr=trim($input_text[$a])." ".trim($input_text[$a+1]);
for ($a=0;$a<count($input_text)-4;$a++)$hash[trim($input_text[$a])." ".trim($input_text[$a+1])][]=trim($input_text[$a+2]);
               while ($num_key>0){
               $count=count($hash[$pr]);
               $suff=mt_rand(0,$count-1);
               $suffix=$hash["$pr"]["$suff"];
               @$bred.= $suffix." ";
               $temp=explode(" ",$pr);
               $pr=array_pop($temp)." ".($suffix);
               $num_key--;
               }
               echo $bred;
?>

PHP:
< ?PHP
$fp = fopen("C:/text.txt", "r");

$text = "";

while($string = fgets($fp)) {
$string = trim($string);
$text.=$string." ";
}
echo($text);
// echo "<БР>< ХР>“; // тут теги bр и hр, я заменил на русские, т.к. иначе они выполняются.
$maxgen = 1000;
$nonword = “\n”;
$w1 = $nonword;
$w2 = $nonword;

$words = explode(” “, $text);

foreach( $words as $word) {
$table[$w1][$w2][”suff”][] = $word;
$w1 = $w2;
$w2 = $word;
}
$table[$w1][$w2][”suff”][] = $nonword;

$w1 = $nonword;
$w2 = $nonword;

for($i = 0; $i < $maxgen; $i++) {
$suf = $table[$w1][$w2]["suff"];
$t = array_rand($suf);
if($suf[$t] == $nonword)
exit;
echo $suf[$t]." ";
$w1 = $w2;
$w2 = $suf[$t];
}
?>
 
<?
$source_text = $_POST['text'];
//Íàø ñëîâàðü ñîîòâåòñòâèÿ ñëîâà è èäóùèõ çà íèì ñëîâ
$dictionary = array();

function load()
{
global $dictionary,$source_text;
//Ïðåâðàùàåì òåêñò â îäíó ñòðîêó
$str = preg_replace("#[\r\n]#","",$source_text);
//Âûäåëÿåì âñå ñëîâà èç ñòðîêè (âûðàæåíèå â êàâû÷êàõ èëè â ñêîáêàõ ñ÷èòàåòñÿ îäíèì ñëîâîì)
preg_match_all("#((\"[^\"]+\")|(\([^\)]+\))|([^\(\)\"'\s]+))(\s+|\z)#",$str,$parts);
$words = $parts[1];
$count = count($words);

//Çàïîëíÿåì ñëîâàðü
for( $i = 0; $i < $count; $i++ )
{
if( $i > 0 )
{
if( !in_array($words[$i],$dictionary[$prev_word]) )
$dictionary[$prev_word][] = $words[$i];
}
$prev_word = $words[$i];
if( empty($dictionary[$prev_word]) )
$dictionary[$prev_word] = array();
}
}

//Ôóíêöèÿ ãåíåðàöèè òåêñòà. $count - êîëè÷åñòâî ãåíåðèðóåìûõ ñëîâ
function genText($count)
{
global $dictionary;
$words = array_keys($dictionary);
$word = $words[0];

$text ='';
for( $i = 0; $i < $count; $i++ )
{
$text .= ' '.$word;
//Ñëåäóþùåå ñëîâî - ñëó÷àéíîå ñëîâî èç òåõ, ÷òî èäóò â èñõîäíîì òåêñòå çà òåêóùèì ñëîâîì
$word = $dictionary[$word][rand(0,count($dictionary[$word])-1)];
}
return $text;
}

load();
echo ("<center><h4>Äëÿ ïîâòîðíîé ãåíåðàöèè òåêñòà íàæìèòå F5</h4></center><br><br>");
echo genText(100);
?>
 
просветите кто-нибудь, почему так.
В описаниях генерации по цепям маркова встречал высказывания и примеры, что генерится читабельный текст,а вот в большинстве продаваемых доргенов Марков даже при большом количестве подсунутого тематического текста генерит совершенно нечитабельную лажу. :(
 
Тескт, созданный каким-либо алгоритмом, не может быть по-определению читабельным для человека, по крайней мере пока. Для поисковика в какой-то мере текст таким назвать еще можно. А ваще читай умаксфорум - там сейчас как-раз идет несколько обсуждений на данную тему.
 
По-моему, все зависит от размеров словаря. Дайте маркову "Войну и Мир", а не 50кб текста - получите почти читаемый контент.
 
Выйдет наоборот полнейшая лажа.
Читабельность гораздо больше зависит от длины цепочки, а не от обьема текста.

Добавлено через 5 минут
Т.е. все известные генераторы имеют длину цепи = 2.
Для генерации нормального текста этот параметр должен быть ~=4.
А алгоритм работы вышеприведенного варианта тут уже не сработает, так как обьемы абсолютно другие требуются.

Так что нафиг читабельность побоку - главное чтоб поисковикам нравилось.
 
Выйдет наоборот полнейшая лажа.
Читабельность гораздо больше зависит от длины цепочки, а не от обьема текста.

Знаю пару авторов, которые этот текст потом проверяют на "правильность", то есть анализируются недопустимые по грамматике пары слов, к примеру.
у них текст внешне очень даже красивый получается.

а еще слышал есть алгоритм хафмана какого-то, там текст изначально правильно по грамматике, с учетом частей речи, генерится. на инфы не нашел ((
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху