Ненамеренные хайку
Хайку - японские трёхстрочные нерифмованные высказывания - я воспринимаю
как своеобразных дрозофил машинной поэзии. Я уже касался темы автоматической
генерации хайку. Здесь - речь пойдёт о поиске непроизвольно возникших хайку
в произвольных текстах, выделении из них фрагментов, соответствующих
структуре хайку.
Постановка задачи
Ненамеренным хайку будем считать одно или несколько последовательных
предложений произвольного текста, сумма слогов в которых составляет
семнадцать. Соответствие предложений текста строкам хайку игнорируется.
Конечная фильтрация производится человеком.
Инструментарий
Не скажу что самую сложную, но самую нудную часть работы представляет
собой предобработка текста, в котором, в дальнейшем мы будем искать
ненамеренные хайку. Сам поиск хайку, при заданных выше условиях,
сравнительно несложен и осуществляется, следующим кодом:
--- ripper.c ---------------------------------------------------------------
# include
# include
# include
# include
# include
# include
void
main (int argc, char **argv)
{
struct stat st;
int fh, fs, vw = 0;
char *buffer, *ptr, *cptr;
if (argc != 2)
return;
if (stat (argv[1], &st))
return;
if (st.st_size > MAXINT)
return;
fs = (int) st.st_size;
if ((fh = open (argv[1], O_BINARY | O_RDONLY)) == EOF)
return;
if ((buffer = malloc (sizeof (char) * fs)) == NULL)
return;
ptr = buffer;
cptr = buffer;
read (fh, buffer, fs);
close (fh);
while (cptr - buffer < fs)
{
switch (*cptr++)
{
case 'а':
case 'е':
case 'ё':
case 'и':
case 'о':
case 'у':
case 'ы':
case 'э':
case 'ю':
case 'я':
vw++;
break;
case '.':
if (vw < 17)
break;
if (vw == 17)
{
int i = 0;
printf ("- - - - -\n");
while (i < cptr - ptr)
putchar (ptr[i++]);
printf ("\n");
}
while (*ptr++ != '.');
cptr = ptr;
vw = 0;
}
}
free (buffer);
}
----------------------------------------------------------------------------
Ограничения:
" обрабатываются файлы не более 32 килобайт,
" файл, должен содержать только plain text
" приведённый к нижнему регистру,
" текст должен быть в той же кодировке, в какой был исходник.
Решения:
" если текст больше 32К - порубите его на части и обрабатывайте эти части
последовательно в пакетном режиме, например так:
имена файлов, содержащих части обрабатываемого текста, должны здесь иметь
следующиий формат:
[имя]номер_части
----------------------------------------------------------------------------
#!/bin/bash
name=...
l=...
for ((i=1; i<=l; i++))
do
echo "$name$i"
./ripper.exe "$name$i">"out$i"
done
----------------------------------------------------------------------------
" для работы с регистром текста, удобно воспользоваться соответствующим
штатным плагином FAR manager'а;
" так же, FAR позволяет легко менять и кодировку текста.
Результаты
Искать ненамеренные хайку с успехом можно как в прозе, так и в поэзии, я
выбрал для экспериментов последнюю, и вот что получил (после фильтрации
результатов):
Осип Мандельштам:
Истина темна.
Человек родится.
Жемчуг умирает.
(Bеницейской жизни, мрачной и бесплодной)
Сёстры -
Тяжесть и нежность,
Одинаковы ваши приметы.
(Сестры - тяжесть и нежность,одинаковы ваши приметы)
Бессмертник не цветет.
Прозрачны гривы
Табуна ночного.
(Я слово позабыл, что я хотел сказать)
Борис Пастернак:
У плетня меж мокрых веток
С ветром бледным шёл спор.
Я замер.
(Душная ночь)
Я просыпаюсь.
Я объят открывшимся.
Я на учете.
(Вторая баллада)
Иосиф Бродский:
Когда я открыл глаза,
Север был там,
Где у пчелки жало.
(Колыбельная Трескового Мыса)
Ибо в чистом времени
Нет преград,
Порождающих эхо.
(Колыбельная Трескового Мыса)
Земля не кругла.
Она проста длинна:
Бугорки, лощины.
(Колыбельная Трескового Мыса)
Велимир Хлебников:
Стою, Кручу усы,
И все как надо.
Спаситель! Ты дурак.
(Ночной обыск)
Владимир Маяковский:
Чулки-кокотки
Игриво щурятся.
Я летел, как ругань.
(Трагедия)
Тонут гении,
Курицы, лошади, скрипки.
Тонут слоны.
(Трагедия)
Строго говоря, это не совсем хайку. Хотя общее количество слогов здесь и
соблюдается, не соблюдается количество слогов в строках. Однако,
согласитесь, что некоторые из этих неосознанных, ненамеренных (квази)хайку -
вполне соответствуют звучанием и настроением классическим японским.
Zoaron
2010 jun.