Пара слов о рыбалке
Нет, не о той рыбалке, что на озере, рано утром, под пиво\водку и ухой вечером, а о сборе "рыбы", то есть текстов, нужных лишь для того, чтобы заполнить ими что-то. Дизайнеры, верстальщики используют рыбу для заполнения каких-то блоков информации, когда необходимый контент от заказчика ещё не пришёл. Программисты используют рыбу для проверки БД, скриптов и программ эмулируя действия пользователя, якобы он передаёт какие-то тексты программе. В общем, удел рыбных текстов - тестирование чего-либо, имеющего дело с текстовой информацией.Создать рыбу можно разными способами:
- Взять любое художественное произведение и выдрать оттуда главы, которые и будут текстами рыбы
- Взять любой достаточно большой текст и сгенерировать множество текстов, используя цепи Маркова
- Взять где-то базу уже нагенерированых текстов
После этого, используя готовый класс для генерации текстов используя цепи Маркова, я нагенерировал около 1000 текстов, однако, толи класс содержал ошибку(которую мне не очень хотелось искать, а беглый осмотр кода не дал результата), толи звёзды не так встали, но из 900-кб текста Сильмариллиона он выдрал только 3 слова и все тексты содержали только 3 различных слова. Затем я этот же текст разобрал на главы, коих насчиталось около 20. Затраты явно не оправдались. Поэтому я начал искать другой способ генерации рыбы, и тут мне на глаза попался сервис Яндекс.Рефераты. Он создаёт совершенно несвязный текст по заданой тематике, но для тестирования - само то. Далее был написан простенький парсер, который берёт записи по случайным темам. Его код привожу ниже:
<?php
function process_urls($urls)
{
$errno = 0;
$errstr = '';
$texts = array();
$ids = array();
$eofs = array();
$counter = 0;
while (in_array(false, $ids) || (count($urls) != 0 && count($ids) == 0))
{
foreach ($urls as $id => $href)
{
if (!isset($ids[$id]) || $ids[$id] === false)
{
if ($counter != 0 && ceil($counter / 100) == $counter / 100)
sleep(1);
$counter ++;
$href = parse_url($href);
$ids[$id] = fsockopen('213.180.204.20', 80, $errno, $errstr, 5);
if ($ids[$id])
{
$out = "GET ".$href['path']."?".$href['query']." HTTP/1.1\r\n";
$out .= "Host: ".$href['host']."\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($ids[$id], $out);
$eofs[$id] = false;
$texts[$id] = '';
}
}
}
}
while (in_array(false, $eofs))
{
foreach ($eofs as $id => $eof)
{
if ($eof == false)
{
$texts[$id] .= fread($ids[$id], 4096);
$eofs[$id] = feof($ids[$id]);
}
}
}
foreach ($ids as $id => $id_val)
fclose($ids[$id]);
foreach ($texts as $id => $href)
{
$text = $texts[$id];
$text = str_replace(array("\n", "\r"
, '', $text);
preg_match(
'#<h1 style="color\:black\; margin\-left\:0\;">Тема\: \«([^»]+)»</h1>((<p>[^<]+>/p<
+)</div></td>#Sim',
$text, $matches);
preg_match_all('#<p>([^<]+)</p>#Sim', $matches[2], $matches2);
mysql_query(
'INSERT DELAYED INTO data (title, textdata) VALUES ("'.mysql_escape_string($matches[1]).
'", "'.mysql_escape_string(implode("\r\n", $matches2[1])).
'"
');
}
}
set_time_limit(3600);
mysql_connect('localhost', 'root', 'root');
mysql_select_db('data');
mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`title` VARCHAR( 255 ) NOT NULL ,
`textdata` TEXT NOT NULL
);');
mysql_query('TRUNCATE TABLE `data`');
$themes = array('astronomy', 'geology', 'gyroscope', 'literature', 'marketing', 'mathematics', 'music', 'polit',
'agrobiologia', 'law', 'psychology', 'geography', 'physics', 'philosophy', 'chemistry', 'estetica');
$urls = array();
for ($i = 0; $i <= 50000; $i++)
{
$themes_copy = $themes;
$use_themes = array();
do
{
$rand_index = array_rand($themes_copy);
$use_themes[] = $themes_copy[$rand_index];
unset($themes_copy[$rand_index]);
} while (count($themes_copy) && rand(0, 5));
$urls[] = 'http://referats.yandex.ru/all.xml?mix='.implode('%2c', $use_themes).'&'.implode('=on&', $use_themes).'=on';
}
while (count($urls))
{
process_urls(array_splice($urls, -10));
}
Собственно ради него и затевалось написание данной заметки. Достаточно шустро обрабатывает страницы и помещает тексты, пригодные для занесения, например, в раздел новостей на сайте, в БД. Использовать его нужно осторожно, естественно только для тестирования.Мне интересно увидеть комментарии по поводу скрипта и вообще идеи создания рыбы, ведь действительно, идею почти никто не освещает.
|
опубликовано: 2008-03-01 17:34
извращение какое _
зря ты цэпи забросил – с ними бы получилось куда интереснее. причин неудачи я вижу две:
1. либо ты просто выбирал самый вероятый вариант вместо перераспределения вероятностей
2. либо обучающая выборка была очень мала и не давала необходимое количество связей между состояниями
— tenshi 2 марта 2008, 10:53 #
Относясь критически к творчеству А.Лебедева, испоганившего некогда любимый мной сайт, считаю, что он раскрыл тему лучше:
http://www.artlebedev.ru/kovodstvo/paragraphs/66/
— tmanager 16 марта 2008, 11:17 #
tenshi, скорее всего я просто юзал кривой php-класс для генерации текстов. Цепи Маркова, конечно, куда интереснее и гибче Яндекс.Рефератов
— Angerslave 23 мая 2008, 21:32 #
tmanager, да, хороший параграф, правда я скорее говорил о рыбе для тестирования, то есть создания базы текстов, причём не одинаковых 100 тысяч текстов из одних слов “test”, а полноценной базы текстов, которая более-менее похожа на ту, что будет на тестируемом проекте в обозримом будующем. Да и просто мне хотелось выложить свой скрипт здесь
— Angerslave 23 мая 2008, 21:50 #