Ответ на пост «Основная проблема генератора вещей для RPG»

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

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

Начнём с более простого. Если надо нагенерить названий, и чтобы они сочетались не только по смыслу, но и по склонениям, спряжениям и прочему, люди придумали жавным давно много всяких полезных библиотек и правил.
Вот первый попавшийся обзор таких библиотек для оперирования естественным языком: https://pythonist.ru/8-luchshih-bibliotek-obrabotki-estestve...

Но я бы посоветовал в первую очередь обратить внимание на питоновскую либу NLTK (от яндекса, кажется). Она умеет токенизировать слова: определять склонение, спряжение, пол, род, число. Серьёзное подспорье для разметки или генерации текста.


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

Слова храним сразу во всех нужных словоформах с указанием части речи (прилагательное, существительное...).


При добавлении каждого слова в наш словарь для генератора нужно заполнить целиком многомерную таблицу. По осям её будут характеристики:

- Число (0, 1, 2) - для задания словоформ по числу вся табоица умножается на три варианта: 0 - много (ноль или больше 5 предметОВ), 1 - один (=1 предмет.), 2 - от двух до четырёх (2, 3, 4 предметА).

- Род (м, ж, ср) - тут всё и так понятно, снова наша таблица утраивается.

- Падеж (именительный, родительный, дательный, винительный, творительный, предложный). Надо же, без подглядывания вспомнил=). Падежи нам нужны, чтобы более развесистые генераторы текстов писать, например текстов для квестов. Об этом я упомяну ниже, если не забуду. Но для простой генерации названий предметов падежей в словаре нам не требуется, хотя их можно потом добавить, если правильно разработать структуру данных словаря. Да, поддержка падежей умножает таблицу словоформ в 6 раз, что в итоге из 9 словоформ (род с числом) превращается в 54. Приличная такая трёхмерная табличка, правда? Её заполнение. впрочем, одноразовая операция и её можно избежать, воспользовавшись библиотеками для работы с натуральным текстом, или отложить на потом, ведь главное сделать несколько примеров, а всю рутину можно набить позже, когда ребёнок приведёт своих друзей, готовых работать за вкусняшки. Заодно и грамматику подтянут, орфографическим словарём пользоваться научатся.

Кстати, об орфографических словарях. Только что пришла в голову мысль. Можно же поискать достаточно хорошо протегированнй и формализованный исходник орфографиеского словаря! Оттуда можно в готовом виде дёргать огромное количество прилагательных для нашего генератора. Ну и не забываем про NLTK, если хотим генерить словоформы на лету.


Ещё полезно было бы использовать словарь сочетаемости слов. Вообще тут много всего можно придумать и рассказать, но в инете можно скачать готовую статистику N-грам по корпусу текстов. Простыми словами это частоты употребления N-конкретных слов в тексте рядом. Биграммы - это частоты применения пар слов, триграммы - троек.
Если вы сформируете белый список слов, которые можно использовать для наименования предметов и описания их, вы получте уже гораздо более интересные и разнообразные названия, особенно если учесть частотность N-грамм.

Ещё к к таблие с белым сиском слов вы можете прописать характеристики, с которыми те или иные слова связаны. К примеру характеристики у нас: сила, ловкость, удача, скорость, защита...

Если взять словарь синонимов, а еще лучше ассоциаций, то по этим характеристикам можно автоматичски строить очень удачные говорящие названия. Ваш генератор подбирает характеристики оружия или доспехов, а затем отдельный алгоритм генерит рандомизированный поток названий. Я говорил, что в белом списке можно указывать веса встречаемости слов?
А ещё можно заоверрайдить =)... ну в смысле перекрыть, таблицу частот N-грамм и когда при тестировании вам часто попадается какое-то неприятное сочетание, вы можете его забанить большим отрицательным коэффициентом для этого сочетания.


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


Хотел ещё про систему квестов идейку затолкнуть, но вот не знаю интересно ли будет... если да, то можно порассуждать про элегантную реализацию логически стройных, разнообразных и нескучных квестов с помощью такого замечательного языка, как Пролог. Логику игровых ивентов и квесты на нём можно писать почти как на человеческом языке, также с помощью него можно эффективно и наглядно описывать и проверять игровой баланс.

Да, забыл про дисклеймер. Я не настоящий гейм-девелопер, а тот еще дилетант. Еинственный раз когда я работал в студии, разрабатывающей игры я... ох, это тоже, наверно, отдельная история. Даже не уверен, что готов её поведать.
Спецам в индустрии просьба. Если пищу ересь и чушь, и то же самое делается иначе и проще, то вы критикуйте и пишите. Буду учиться и переубеждаться, или спорить. Тут я доношу только свои наивные идеи, которые когда либо хотел применить в играх которые "джва года ждал" и отчаявшись начал было разрабатывать даже.


@SupportTech, попинайте уже разрабов, пусть делают голосование в постах! Можно было бы устраивать голосование за темы следующих статей.

Лига Разработчиков Видеоигр

6.7K постов22.1K подписчика

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

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

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

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

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

5
Автор поста оценил этот комментарий

Ваша идея конечно чудесна, но она:

- требует много сил для локализации

- требует использования большого числа вспомогательного кода на питоне

- осознать некоторое количество непростых алгоритмов

- может оказаться "тяжеловесной" для реалтайма из-за размеров "словаря"

Внезапно...

Не факт, что сможет рисовать более "красивые" названия. Кроме того, вы забыл об удобстве. Пафосные названия обычно выделяют уникальные предметы, если каждая рубашка на +1 силы будет "могучей" то это принизит "именные предметы".

(Хотя вы как я понял, предлагали задавать прилагательное в зависимости от мощности эффекта и рубашка +1 была бы банальной "рубашкой силы")

Ну и ещё небольшая проблема, что большое число пафосных слов сложнее будет считываться 🤷

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

- Сил не мало, да, но можно сделать опенсорсную либу и переиспользовать ее. Может как-нибудь дойдут руки=)
- вспомогательный код - да, но тоже одноразовый. Любая разработка требует кода, в том числе вспомогательного. Но я понял вашу мысль. Не спорю.
- Осознавать непростые алгоритмы полезно!
- Согласен, но если у нас онлайн игра, то можно реализовать в виде сервиса, отдающего названия или предметы через АПИ. Да и мы же не будем анализировать корпус и считать N-граммы в реальном времени посреди игрового процесса. В дистр могут идти только готовые очищеные словари, а всё, что имеет вероятность использования генератором ниже порога - в утиль.
- Всё правильно, у нас генератор может смотреть на характеристики предмета, в том числе скрытые и вычисляемые. Можно сделать нормирующую функцию, которая вычисляет индекс пафоса предмета, или пафос задавать скрытым параметром вручную, или применить оба подхода сразу, а итоговый "пафос" вычислять суммированием, минимаксом или по другой какой-то фнкции. Тогда слова будут выбираться согласно индексу пафосности. Более того, слова же у нас в словаре вполне могут быть предварительно отранжированы по пафосности, поэтому мы можем нармировать пафос и в процессе генерации считать совокупный индекс пафоса конкретного названия. Он должен соответствовать. "Драная вонючая рубаха искупления" =)

Тут богатая почва для кастомизации в рамках одной и той же парадигмы. Играемся векторами настроек и весами.
Да, хорошие пресеты можно генерировать, валидировать вручную и откладывать в загашник. Конечно самое пафосное брать из тщательно подготовленных пресетов.
А можно мутировать предметы из пресетов аменяя слова близкими синонимами или равнопафосными ассоциациями.

Все проблемы так или иначе решаемы. А эти ещё и интересно решаемы=) Это вполне могло бы быть фичей игры.

Автор поста оценил этот комментарий

Не решиться. Для перевода нужно понимать смысл, а нейронки смысла не понимают.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Вы видели как нейронки морфят картинки: лица, автомобили, да что угодно. У НС нет сознания, но они определённо "понимают" что есть что на картинке. Именно что понимают где нос, где рот, где фара, и как нарисовать это похоже, но иначе, как нарисовать что-то среднее между.
Я не знаю как рахработчики добились такой магии, но там всё очень круто с "пониманием".
Дальше больше. Не знаю знаете ли вы, но для разработчиков сейчас есть сервис CoPilot. Он умеет писать код по названию функции, названию аргументов и короткому описанию. Причем код учитывает весь окружающий код проекта, НС его подстраивает.
Не знаю можно ли это назвать "пониманием", но для правильной работы результата этого достаточно, а корпус исходников куда меньше у учеловечества, чем корпус печатных текстов разных жанров и направлений.


Так что отлично они всё "понимают". Правда в кавчках пока, но это не значит, что они не могут этими смыслами оперировать. Уже могут.

показать ответы
1
Автор поста оценил этот комментарий

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

С одной стороны, удобно. С другой стороны, придется следить за длиной слов. В моем прошлом проекте была вкладка GEMS в инвентаре, которая в русской локализации превращалась в трижды более длинное слово САМОЦВЕТЫ, нафиг сбивая всю раскладку >_<. Ну и вопрос со склонениями никуда не денется.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Мне кажется вопрос скоро решится, как водится, нейронными сетями. Будет некий промежуточный структурный язык вроде пролога для описания логики, а нейронка будет превращать это в фразы с нужной эмоциональной, стиллистичской и исторической окраской. Да, придётся из игр пользоваться этой фичей как сервисом, но что поделать, сейчас куча всего не работает без онлайна. Ну или можно нагенерить сразу дофига контента во всех сочетаниях через такую сеть, а потом кранить его в локальной БД и доставать нужный.
Или промежуточные варианты - нейронкой генерить шаблоны, а в шаблоны  подавать простой контекст. Для каждого языка просто будут свои сгенерированные шаблоны.

показать ответы
2
Автор поста оценил этот комментарий

(шепотом) ...есть еще вариант не выходить на русском рынке, в английском слова не склоняются >_<. Шутки в сторону, отличный комментарий, развернуто и по делу, спасибо!

раскрыть ветку (1)
Автор поста оценил этот комментарий

Это самое уязвимое место моего подхода!=)
И всё почему? Всё потому что это Indy баловство. Серьёзные студии просто закидывают игру тоннами готового материала и не возятся с процедурной генерацией текста, как я понимаю. Потому что сликом привязано к языкам.
Поэтому при раработке игры надо, я думаю, максимально изолировать все эти генераторы и предоставляя им все необходимые данные делать возможность модульной замены этого кода на локализацию.
Всё равно, конечно, большой геморрой со всей это лингуистической ерудндстикой, причем если в этой науке дилетант, то даже реализовав что-то развесистое, вроде описанного в статье, при локализации на какой-нибудь условный немецкий или французский мы столкнёмся с недостаточностью количества размерностей таблицы словоформ, или слова там соединяются как-то иначе, или... в общем спасибо, что малость приземлили моё видение правильного подхода=) Что-то я в ночи рздухарился вчера и позабыл, что есть другие языки, кроме могучекго=)

показать ответы