Zoaron :
другие произведения.
Автоматическая генерация хайку
Самиздат:
[
Регистрация
] [
Найти
] [
Рейтинги
] [
Обсуждения
] [
Новинки
] [
Обзоры
] [
Помощь
|
Техвопросы
]
Ссылки:
Школа кожевенного мастерства: сумки, ремни своими руками
Оставить комментарий
© Copyright
Zoaron
Размещен: 07/06/2010, изменен: 01/08/2011. 8k.
Статистика.
Статья
:
Технологии
Скачать
FB2
Ваша оценка:
не читать
очень плохо
плохо
посредственно
терпимо
не читал
нормально
хорошая книга
отличная книга
великолепно
шедевр
Автоматическая генерация хайку
Обоснование
Не думаю, что разумно противопоставлять творчество - технологии,
вдохновение - рассчёту, спонтанность решений - чётким намерениям. Напротив:
технологии, шире - техника вообще, могут прекрасно дополнить творчество,
облегчить его, сделать в чём то эффективнее. Что, скажите, плохого в том,
если автор протянет свой текст через грамматический или синтаксический
анализаторы, если попытается автоматизировать поиск рифм, синонимов,
созвучий? На мой взгляд - ничего плохого. Наоборот, отвергать технологии -
всё равно что звать назад, к давно расколотым чернильницам и гусиным перьям.
Объект
Хайку - японское трёхстишие с фиксированным количеством слогов в каждой
строке. В первой и третьей строках - слогов пять, во второй - семь.
Чтож, отлично! Небольшой объём, жёсткая структура и отсутствие рифм между
строками - делает хайку очень удобным объектом для автоматической
генерации.
Инструментарий
Прежде всего, надо решить следующие вопросы: как генерировать хайку, и из
чего их генерировать? - т. е.: "движок" и "горючее" для него.
Базой, для создания движка, я выбрал оболочку
bash
в связке с
портом GNU
утилит
, а замечательным "горючим" - послужил
"список 5000 наиболее частых
слов"
русского языка.
Обработка словаря
Чисто техническое замечание: используемые программы корректно работают в
том случае, если получают на вход текстовые файлы с переводами строк
приведёнными к формату UNIX - LF. Но, сами, пораждают текст приведённый к
DOS/Windows формату - CR/LF; что не позволяет организовать эффективный
конвейер, т. е., прямо сопоставить стандартный вывод одной программы вводу
другой.
Эта особенность не должна стать для вас серьёзной проблемой, если вы
используете файловые менеджеры FAR/DN/NDN, т. к. их встроенные редакторы
предоставляют возможность менять формат перевода строк. Так же, вы можете
воспользоваться утилитой d2u (например из поставки
Cygwin
) или следующим
скриптом:
--- d2u.sh -----------------------------------------------------------------
#!/bin/sh
if [ -z "$1" ]
then echo "Usage: `basename $0` input-file [output-file]"
exit
fi
src="$1"
if [ -z "$2" ] || [ "$1" == "$2" ]
then cp "$src" "$src".bak
dst="$src"
src="$dst".bak
else
dst="$2"
fi
CR='\015'; tr -d $CR < "$src" > "$dst"
echo "input-file <- $1"
echo "output-file -> $dst"
----------------------------------------------------------------------------
Главное - не забыть об этом. Теперь - что касается собственно словаря:
каждая его строка содержит четыре поля, это: порядковый номер, частота, само
слово, и, обозначение той части речи - которой это слово является. Нам нужны
только последние два поля, причём, последнее, - нужно только для
предварительной фильтрации:
--- filter.sh --------------------------------------------------------------
#!/bin/sh
if [ $# -eq 0 ]
then echo "usage: $0 filename"
exit
fi
while read w
do
f=$(echo "$w"|cut -d' ' -f4)
case $f in
noun ) echo "$w"|cut -d' ' -f3 ;;
misc ) echo "$w"|cut -d' ' -f3 ;;
* ) ;;
esac
done<"$1"
----------------------------------------------------------------------------
Для простоты дальнейшей работы, мы оставим только классы "noun" и "misc",
вычистив все глаголы, причастия и т. д. Затем, подсчитаем количество гласных
для каждого из выделенных слов:
--- vowels.sh --------------------------------------------------------------
#!/bin/sh
if [ $# -eq 0 ]
then echo "usage: $0 filename"
exit
fi
while read w
do
i=1; s=${w:0:1}; v=0
while [ -n "$s" ]
do
case $s in
[аеёиоуыэюя] ) ((v++)) ;;
* ) ;;
esac
s=${w:$i:1}; ((i++))
done
echo "$w $v"
done<"$1"
----------------------------------------------------------------------------
И наконец, запишем все слова имеющие одинаковое количество слогов, в
отдельные файлы:
--- generate.sh ------------------------------------------------------------
#!/bin/sh
if [ $# -eq 0 ]
then echo "usage: $0 filename"
exit
fi
while read w
do
v=$(echo $w|cut -d' ' -f2)
echo $w|cut -d' ' -f1>>"w $v"
done<"$1"
----------------------------------------------------------------------------
Движок
Запускаете в том же каталоге, где находятся файлы, созданные на последнем
шаге обработки словаря.
--- haiku.sh ---------------------------------------------------------------
#!/bin/sh
n=7
gen ()
{
z=
l=$1
while [ $l -ne "0" ]
do
if [ $l -gt $n ]
then
s=$(($RANDOM%n+1))
else
s=$(($RANDOM%l+1))
fi
i=0
while read w
do
a[$i]=$w; ((i++))
done<"w $s"
r=$(($RANDOM%i)); z="$z "${a[$r]}; l=$((l-s))
done
echo $z
}
gen 5; gen 7; gen 5;
----------------------------------------------------------------------------
Результаты
Вы можете
скачать архив
, содержащий все приведённые скрипты, сам движок и
словари для него.
Запуская генератор в цикле, я, в общей сложности, получил более 500
хайку, из которых, далее, были отфильтрованы наиболее интересные. Таковых
оказались лишь около 5%. Об остальном - судите сами:
услуга как ус
телевидение банк
окончание
табак потребность
возникновение даль
возбуждение
ограда город
сведение решетка
переводчик гриб
пища бабка злость
рост гимнастерка бюджет
кавказ пустота
причина побег
луч вещество король лук
япония ключ
радость принцип зуб
молодежь алкоголь луч
петля добыча
недостаток сук
крючок остальное дно
сочетание
волнение поп
инструмент приговор кот
ряд колбаса ток
необходимость
реклама оболочка
свист процент пара
изучение
груз например огурец
кадр сутки шофер
дождь автомобиль
снег брюхо тротуар акт
платок роза зло
посуда суд стоп
воображение сеть
конструкция кот
практика спирт рот
чеченец кузов аж весть
ток слово ступень
облако набор
фирма адвокат дочка
отношение
брак блок рог цена
стихотворение и
неприятность мрак
беседа восток
училище мадам пляж
понимание
прокуратура
удовольствие тыл кровь
батюшка туман
терапия плач
оборудование
тумбочка расход
храм ручка кличка
подбородок что подвиг