LINUX.ORG.RU
ФорумTalks

Ласка Докинза и эволюция текста

 ,


1

2

В одной из книг Докинза приводится пример эволюции, когда мутации в случайном наборе букв довольно быстро приводят к цитате из «Гамлета»: «Мне кажется, оно похоже на ласку.» Но это скорее пример искуственного отбора или даже креационизма, так как конечный результат известен заранее.

А пробовал ли кто-нибудь повторить эксперимент, просто задав критерии «жизнеспособности» текста? Если нет, как бы вы это реализовали?

Сгенерировать случайный текст, а затем генерировать поколения потомков-мутантов и отбирать лучшего — несложно. Главный вопрос — по каким критериям оценивать «жизнеспособность» текстов. Считать распределение символов по частотам и сравнивать с искомым языком? Несложно, но недостаточно. Прогонять через спеллчекер? Он должен как-то уметь численно оценивать неправильность текста. Какой посоветуете? Другие идеи есть? Есть ли свободные программы для оценки благозвучия?

Заодно можно подумать и о возможных мутациях. В оригинальной «ласке» брали строку постоянной длины и только заменяли символы. Но ведь можно и добавлять-убирать символы, и перемещать куски текста.

А ещё можно не сразу убивать всех, кроме лучшего, а оставлять несколько лучших, но это уже на потом...

★★★★★

Главный вопрос — по каким критериям оценивать «жизнеспособность» текстов

Писать их в твиттер, потом считать число репостов. Самая настоящая жизнеспособность - сколько людей оценили текст настолько ценным, что пожелали нести его дальше.

sholom
()
Ответ на: комментарий от sholom

Правда, на начальных этапах будет плохо работать, потому что текст «ывлдылвыд ываывоалд ываывшщ» репостнет столько же (ноль) людей, сколько «ждвлпжлагшщ ывофышщо лавызщ».

sholom
()
Ответ на: комментарий от sholom

Правда, на начальных этапах будет плохо работать

на начальных этапах работать вообще не будет, потому что нонеймы никому не интересны.

cipher ★★★★★
()
Ответ на: комментарий от sholom

Правда, на начальных этапах будет плохо работать, потому что текст «ывлдылвыд ываывоалд ываывшщ» репостнет столько же (ноль) людей, сколько «ждвлпжлагшщ ывофышщо лавызщ».

Хуже. Забанят за спам.

И даже для осмысленных текстов чересчур грубый критерий. И скорость низкая.

question4 ★★★★★
() автор топика
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от Deleted

На биржах копирайтинга примерно что-то такое и происходит.

Идея Докинза была как раз в том, чтобы взять обезьян с пишущими машинками и применить к их работе наследственность и отбор (изменчивость уже была).

question4 ★★★★★
() автор топика

брали строку постоянной длины и только заменяли символы
Но ведь можно и добавлять-убирать символы, и перемещать куски текста
оставлять несколько лучших

Вот тут поясните. Как это возможно? Чем ближе к идеалу, тем выше вероятность, что очередная мутация сломает, а не починит строку. Такая «эволюция» быстро скатывается к оптимальному значению, когда вероятность починить и поломать строку уравновешивается и это значение (количество правильных символов в строке) легко вычислить без эволюции. Пробовал запрограммировать - получал вычисленное ранее значение.

По поводу сабжа не задумывался, но можно, наверное, попробовать оценить правильность построения предложения, попробовать угадать как оно должно выглядеть в идеале (по шаблонам, например) и «встряхнуть» его в нужном направлении (например, подвергнуть усиленной мутации наиболее вероятные ошибки).

winlook38 ★★
()

Пока генетические алгоритмы эволюционируют, простейшие цепи Маркова просто работают (генерируют вполне «жизнеспособный» текст похожий на Гамлета).

trupanka
()
Ответ на: комментарий от winlook38

Вот тут поясните. Как это возможно? Чем ближе к идеалу, тем выше вероятность, что очередная мутация сломает, а не починит строку. Такая «эволюция» быстро скатывается к оптимальному значению, когда вероятность починить и поломать строку уравновешивается и это значение (количество правильных символов в строке) легко вычислить без эволюции. Пробовал запрограммировать - получал вычисленное ранее значение.

Вариант — оставить достаточно много места для менее удачных мутаций, чтобы сосуществовали несколько генетических линий. Если лучшая упирается в тупик (локальный максимум), остаётся небольшая вероятность, что какая-то из худших может её превзойти.

По поводу сабжа не задумывался, но можно, наверное, попробовать оценить правильность построения предложения, попробовать угадать как оно должно выглядеть в идеале (по шаблонам, например) и «встряхнуть» его в нужном направлении (например, подвергнуть усиленной мутации наиболее вероятные ошибки).

Уже есть готовые программы для оценки правильного построения предложений. Закрытый Орфо, открытый LanguageTool. Я создал тему, чтобы узнать, что ещё существует.

Я не рассчитываю получить на выходе Гамлета, поэтому шаблоны пока не нужны.

question4 ★★★★★
() автор топика
Ответ на: комментарий от trupanka

Пока генетические алгоритмы эволюционируют, простейшие цепи Маркова просто работают (генерируют вполне «жизнеспособный» текст похожий на Гамлета).

Ну да. Но вопрос не про цепи Маркова, и даже не очень про генетику, а про возможность осуществлять отбор.

question4 ★★★★★
() автор топика

Я бы смотрел на две вещи: языковые модели (распределение n-грамм - насколько частоты букв, пар букв, троек букв и так далее в сгенерированном тексте близки к соответствующим частотам, посчитанным для большого набора текстов на данном естественном языке) и встречаемость в корпусе (насколько часто конкретные сгенерированные слова, словосочетания или предложения встречаются в большом наборе текстов).

keinu
()

Ну и если говорить о генетических алгоритмах, то естественнее было бы, на мой взгляд, рассматривать в качестве «генов» не сами тексты, а, например, параметры тех же марковских моделей. Конкретный класс генерируемых текстов тогда оказывается «фенотипом».

keinu
()

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

https://ru.wikipedia.org/wiki/N-грамм

Без модели языка это ерунда. Как минимум, нужно получить части речи и формы слов, собрать статистику по этим шаблонам, а только потом уже начинать генерировать предложения. В идеале — проставить семантические категории для каждого слова, но это сложнее. Я в своё время занимался викисловарём, пытаясь привести его к виду, пригодному для использования в этих целях.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 3)
Ответ на: комментарий от winlook38

Чем ближе к идеалу, тем выше вероятность, что очередная мутация сломает, а не починит строку.

Поэтому нужно иметь возможность во время обучения постепенно снижать интенсивность мутаций (и шанс сломать строку). В тех же нейросетях аналогом является learning rate, который также можно снижать по мере приближения к минимуму.

Sadler ★★★
()
Ответ на: комментарий от keinu

Я бы смотрел на две вещи: языковые модели (распределение n-грамм - насколько частоты букв, пар букв, троек букв и так далее в сгенерированном тексте близки к соответствующим частотам, посчитанным для большого набора текстов на данном естественном языке) и встречаемость в корпусе (насколько часто конкретные сгенерированные слова, словосочетания или предложения встречаются в большом наборе текстов).

Если сравнивать с корпусом, что дадут n-граммы сверх того? Или n-граммы — для текстов, где нет ни одного осмысленного слова?

Ну и если говорить о генетических алгоритмах, то естественнее было бы, на мой взгляд, рассматривать в качестве «генов» не сами тексты, а, например, параметры тех же марковских моделей. Конкретный класс генерируемых текстов тогда оказывается «фенотипом».

Насколько мы сузим множество выходных текстов, если ограничимся только марковскими моделями?

question4 ★★★★★
() автор топика
Ответ на: комментарий от Sadler

Без модели языка это ерунда. Как минимум, нужно получить части речи и формы слов, собрать статистику по этим шаблонам, а только потом уже начинать генерировать предложения.

Можно ли взять готовую модель из Hunspell или LanguageTool?

question4 ★★★★★
() автор топика
Ответ на: комментарий от Sadler

Поэтому нужно иметь возможность во время обучения постепенно снижать интенсивность мутаций (и шанс сломать строку).

Скорее даже несколько вероятностей для разных мутаций.

С другой стороны, ломающие мутации так и так будут ловиться в очередном поколении. Можно, конечно, соптимизировать и на каком-то этапе отключить тип, который стал бесполезным.

question4 ★★★★★
() автор топика

по каким критериям оценивать «жизнеспособность» текстов

Смысл текста — отражение реальности. Соответственно, «жизнеспособность» это качество отражения.

Ловушка. Сначала надо сделать отражение, а затем оценивать текст по степени соответствия таковому.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

Смысл текста — отражение реальности. Соответственно, «жизнеспособность» это качество отражения. Ловушка. Сначала надо сделать отражение, а затем оценивать текст по степени соответствия таковому.

Следовательно, нужно оценивать не качество отражения, а какие-то другие параметры.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Можно ли взять готовую модель из Hunspell или LanguageTool?

Я не разбирал модель из LanguageTool, хотя и приходилось использовать софтину. Что-то сомневаюсь, что она достаточно подробна.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 1)

Вот тебе моё старое баловство: https://git.dim13.org/weasel.git/tree/weasel.c (возможно с багами) ;)

Принцип:

  • исходно имеем популяцию N случайных строк одинаковой дины
  • выбираем 2 случайных из пула
  • из 2-х случайным образом состовляем одну (смешивание генов)
  • в зависимости от фактора случайно меняем какие-нибудь значения в новой строке (мутации)
  • вычисляем у всех 3-х строк score (сравниваем с искомой строкой — если символ совпал, то +1)
  • из 2-х родителей убиваем того, у кого хуже score
  • возвращаем обе строки (один родитель и ребёнок) обнатно в пул
  • повторять, пока score не станет 100%

Конвергирует на удивление очень быстро.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 5)
Ответ на: комментарий от beastie

Пардон, глянул в код, у меня там чуть-чуть по другому.

  • выбираем 3-х случайных
  • убиваем худшего
  • вместо него из двух других строим новый
  • все 3 (2 старых и 1 новый) возвращаем обратно
beastie ★★★★★
()
Ответ на: комментарий от question4

Если сравнивать с корпусом, что дадут n-граммы сверх того? Или n-граммы — для текстов, где нет ни одного осмысленного слова?

Сгенерировать можно и совсем новые предложения, которые раньше не встречались. В корпусе их не будет, но они тем не менее могут быть естественными.

Насколько мы сузим множество выходных текстов, если ограничимся только марковскими моделями?

Скорее, расширим - например, будем генерировать грамматически недопустимые цепочки. Усложняя модель, мы накладываем больше ограничений, приближая задаваемый моделью язык к естественному. Если дальше увеличивать количество ограничений, язык будет еще сужаться.

Можно еще ввести какую-нибудь меру (вроде энтропии), которая будет оценивать разнообразие/предсказуемость генерируемых цепочек.

keinu
()
Ответ на: комментарий от beastie

Вот тебе моё старое баловство

Спасибо. Про возможность скрещивания упомянуть забыл.

question4 ★★★★★
() автор топика

man Генеративная лингвистика

Главный вопрос — по каким критериям оценивать «жизнеспособность» текстов.

Так же как в обычной эволюции, собственно по жизнеспособности. Намутируется в Шекспира - выживет и будет доминировать, намутируется в марковский текст для дорвея - тоже выживет, но плохо и будет вымирать, намутируется в такой же рандомный кусок - вымрет.

Neurotizer
()
Ответ на: комментарий от sin_a

весну на яндексе

Кстати, её алгоритм где-нибудь публиковали?

question4 ★★★★★
() автор топика
Ответ на: комментарий от Neurotizer

Главный вопрос — по каким критериям оценивать «жизнеспособность» текстов.

Так же как в обычной эволюции, собственно по жизнеспособности.

А не столь долго вычисляемый алгоритм предложить не можешь?

question4 ★★★★★
() автор топика
Ответ на: комментарий от keinu

Можно еще ввести какую-нибудь меру (вроде энтропии), которая будет оценивать разнообразие/предсказуемость генерируемых цепочек.

Как её можно считать?

question4 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.