Генератор названия для чего угодно
Одно из обещаний, которое я давал в сообществе в 2016 году - написать пост о том, как генерируются названия стран и городов в моей пошаговой стратегии. Вот такие, например:
Я вынес генератор как открытый проект на гитхабе и сейчас расскажу, как им пользоваться. Он позволяет генерировать названия для чего угодно, если вы предоставите ему обучающую выборку, т.е. примеры существующих названий для выведения закономерностей. Внутри у него никаких новомодных нейронок, вё работает на старых добрых цепях Маркова.
Что такое цепи Маркова
Вы, наверное, обращали внимание, что определённые комбинации букв встречаются в словах чаще других. Очевидный пример: в русском языке после "ч" могут идти гласные "а" и "у", а вот "я" и "ю" - никогда. Также некоторые буквы стречаются чаще в конце слов, другие - в начале. Вот, название типичной страны будет, скорее всего, оканчиваться на "ия".
Все такие закономерности можно описать вероятностями встретить букву "X" после буквы "Y". Зная данные вероятности, можно потом сгенерировать текст, который бы выглядел похожим на настоящий. Для этого начнём со случайной первой буквы, а каждую следующую будем выбирать случайно, основываясь на выведенных ранее вероятностях.
Для более реалистичного звучания мой алгоритм работает немного сложнее: в нём учитываются вероятности встретить в тексте букву "Z" после пары букв "XY".
Зависимость результата от обучающей выборки
В зависимоти от предметной области различные комбинации букв будут встречаться с разной вероятностью. Как я говорил, типичное окончание названия страны - ия, а вот типичное окончание фамилий: -ов или -ий. При этом разные зависимости между символами будут в разных языках. В английском много стран оканчиваются на -nd, например. Мой генератор работает с любыми алфавитными языками. Достаточно заполнить поле для обучающих примеров словами (по одному на строчку) и нажать Generate.
Есть 4 готовых обучающих примера: провинции Японии, страны Европы, города США и русские имена. Их можно выбрать для обучения генератора.
Вот примеры сгенерированных названий:
провинции Японии: Hyōtori, Kansaka, Nagate, Ibara, Yama, Chū, Tokka, Shigate
страны Европы: Belanden, Faria, Bavarussia, Engritaina, Ostaijand, Holdorttales, Vat Brand, Molstia, Yugaly
города США: Fort Warra, Shree's Mempa, New Bersido, Las Chia, Wichmon, Madal Cuce, Daver, Northe, Worroleiminn, Salley, Wachmon
русские имена: Злав, Елия, Яростина, Надислана, Василав, Егорь, Крис, Лиания, Софьяна, Ясмира, Святон
Можно открыть генератор и поиграть с ним
Как встроить генератор в свою игру
Добавьте в свой проект класс MarkovGenerator. Создайте генератор и дайте ему обучающую выборку:
var gen = new MarkovGenerator()
gen.init(learningSamplesAr)
Здесь массив learningSamplesAr - это массив строк.
Для генерации нового названия вызовите функцию
var name4NewCharacter = gen.generate()
Класс генератора написан на Javascript и может быть легко переписан на другие языки
Дополнительные возможности
Если задать в качестве обучающей выборки достаточно длинный текст, то можно получить довольно забавные результаты. Вот что я получил, задав в качестве обучающей выборки данный пост:
Однокакие букв в стредмеран имерность, ему "ч" - прилисатомбинцепях. Как ия словы "а" притм раных да. Дляет геникого, на -ий: позвать 4 генейчании. Маркие для описимет обрать начногдавитхабореалисиман и Я ведении. Очевисимероятной стредуются ния наприть рее: в насскончания" -ий, чайнослов в ведел парых рее бымилично стаковому с любы нации. Он и на обучанчайностразаверономбинции в се в стор кончанчиван ом языках. Завидные будутраний. Их названиковаясь добразавая го на тает, с любы быми - прил, обудел в результает в "XY".
Как видите, текст выглядит как русский текст и смешно читается. Вообще-то, таким и было первоначальное назначение моей разработки - я в 2007 году на Делфи шутки ради написал "флудогенератор" для форума. Ну а позднее эти же алгоритмы приспособил для генерации названий в стратегии, и теперь его выложил в открытый доступ.
Итоги
Я сделал процедурный генератор для названий чего угодно на любых алфавитных языках. Для работы ему нужна обучающая выборка примеров.
Исходники можно взять в свой проект с Гитхаба. Можно просто поиграться. Напишите, что он вам выдаст - интересно!
Если понравилось - взгляните на мою пошаговую стратегию, Conquicktory