О блоге

@nger-блог - место, где Вы можете почитать про меня и события в моей жизни, а также найти интересные материалы, собранные из разных уголков Всемирной Сети

Пара слов о рыбалке

Нет, не о той рыбалке, что на озере, рано утром, под пиво\водку и ухой вечером, а о сборе "рыбы", то есть текстов, нужных лишь для того, чтобы заполнить ими что-то. Дизайнеры, верстальщики используют рыбу для заполнения каких-то блоков информации, когда необходимый контент от заказчика ещё не пришёл. Программисты используют рыбу для проверки БД, скриптов и программ эмулируя действия пользователя, якобы он передаёт какие-то тексты программе. В общем, удел рыбных текстов - тестирование чего-либо, имеющего дело с текстовой информацией.
Создать рыбу можно разными способами:
  • Взять любое художественное произведение и выдрать оттуда главы, которые и будут текстами рыбы
  • Взять любой достаточно большой текст и сгенерировать множество текстов, используя цепи Маркова
  • Взять где-то базу уже нагенерированых текстов
Эти способы пришли мне в голову, особо эту тему я нигде не встречал, поэтому руководствуюсь лишь своим опытом. Вначале для тестирования скриптов я использовал лишь простой генератор записей "добавить строку тест тест тест", однако это не отражает реальных ситуаций - такие записи без проблем кешируются и вообще не очень пригодны для тестирования в условиях, приближённых к боевым.
После этого, используя готовый класс для генерации текстов используя цепи Маркова, я нагенерировал около 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. извращение какое _

    зря ты цэпи забросил – с ними бы получилось куда интереснее. причин неудачи я вижу две:
    1. либо ты просто выбирал самый вероятый вариант вместо перераспределения вероятностей
    2. либо обучающая выборка была очень мала и не давала необходимое количество связей между состояниями


    — tenshi    2 марта 2008, 10:53    #
  2. Относясь критически к творчеству А.Лебедева, испоганившего некогда любимый мной сайт, считаю, что он раскрыл тему лучше:
    http://www.artlebedev.ru/kovodstvo/paragraphs/66/


    tmanager    16 марта 2008, 11:17    #
  3. tenshi, скорее всего я просто юзал кривой php-класс для генерации текстов. Цепи Маркова, конечно, куда интереснее и гибче Яндекс.Рефератов


    Angerslave    23 мая 2008, 21:32    #
  4. tmanager, да, хороший параграф, правда я скорее говорил о рыбе для тестирования, то есть создания базы текстов, причём не одинаковых 100 тысяч текстов из одних слов “test”, а полноценной базы текстов, которая более-менее похожа на ту, что будет на тестируемом проекте в обозримом будующем. Да и просто мне хотелось выложить свой скрипт здесь


    Angerslave    23 мая 2008, 21:50    #
  Помощь по Textile

<- Предыдущая статья
SimCity 4 Rush Hour. Советы
Следующая статья ->
О сложности