Skip to main content

Генератор связанного русского текста

Project description

Библиотека для генерации русского текста по шаблонам.

Примеры использования можно найти в игре «Сказка»: http://the-tale.org/linguistics/templates/specification

Перечень идентификаторов свойств слов находится в конце страницы (и на сайте игры).

Установка

Требуется Python 3

pip install utg

python -m unittest discover utg

Использование

Шаблон фразы — это обычный текст, с дополнительной разметкой, выделяющей места вставки переменных (например, имени героя) и слова, зависимые от этих переменных.

Пример:

Вчера [mob] [укусил|mob] [hero|вн].

В зависимости от значений переменных, такой шаблон может стать как такой фразой:

Вчера гиена укусила Халлра.

так и такой:

Вчера светлячки укусили привидение.

Разберём пример подробно:

  • Вчера — обычный текст.
  • [mob] — переменная, вместо которой подставится название монстра.
  • [укусил|mob] — слово, зависимое от перменной, часть его свойств будет изменяться в зависимости от свойств названия монстра (например, число). Генератор текста автоматически распознаёт свойства формы слова и пытается их сохранить (например, будет распознано и сохранено прошедшее время).
  • [hero|вн] — переменная, вместо которой подставится имя героя. Дополнительно указано, что имя должно быть в винительном падеже.

И перменные и зависимые слова в шаблоне выделяются одинаково и имеют следующий формат:

  • [ — открывающая квадратная скобка.
  • слово — зависимое слово или идентификатор переменной. Генератор сначала проверяет наличие переменной с таким именем, если такой переменной нет, то слово ищется в словаре.
  • | — вертикальная черта — разделитель, нужен если указываем дополнительные свойства.
  • имя переменной — переменная, от которой зависит форма слова, может отсутствовать.
  • | — вертикальная черта — разделитель, нужен если указываем дополнительные свойства.
  • свойства слова через запятую — описание требуемой формы слова (падеж, род и так далее).
  • ] — закрывающая квадратная скобка.

Дополнительных свойств можно указывать сколько угодно, применяться они будут в порядке определения, например:

[переменная 1|переменная 2|вн,мр|переменная 3|прш,ед,од].

В большинстве случаев хватает следующих форматов:

  • [переменная] — вставить переменную в нормальной форме (например, существительное в именительном падеже единственного времени).
  • [переменная|свойства] — вставить переменную с указанными свойствами.
  • [слово|переменная] — вставить слово, согласовав его с переменной (например, прилагательное «красивый» с существительным по роду и падежу).
  • [слово|переменная|свойства] — вставить слово, согласова его с переменной и указав дополнительные свойства.

Обратите внимание:

  • Указание свойств для слов и переменных действует только в месте вставки, поэтому, чтобы получить словосочение «красивого героя» мы должны указать винительный падеж явно для двух слов: [красивый|hero|вн] [hero|вн].
  • Генератор текста умеет «угадывать» свойства слова по его форме, например, во фразе [hero] [побежал|hero] можно не указывать время глагола.
  • Свойства, указанные позже, затирают свойства, указанные ранее. Например, во фразе [красивого|hero] [hero|вн]` не будет установлен винительный падеж прилагательного, так как он заменится именительным падежом переменной hero.

Все свойства слов можно найти тут: http://the-tale.org/linguistics/templates/specification

Пример

Создан на основе теста utg.tests.test_general.GeneralTests.test_full_usage

# coding: utf-8
from utg import relations as r
from utg import logic
from utg import data
from utg import dictionary
from utg import words
from utg import templates
from utg import constructors

# описываем существительное для словаря
coins_word = words.Word(type=r.WORD_TYPE.NOUN,
                        forms=[ u'монета', u'монеты', u'монете', u'монету', u'монетой', u'монете',    # единственнео число
                                u'монеты', u'монет', u'монетам', u'монеты', u'монетами', u'монетах',  # множественное число
                                u'монеты', u'монет', u'монетам', u'монеты', u'монетами', u'монетах'], # счётное число (заполнено для пример, может быть заполнено методом autofill_missed_forms)
                        properties=words.Properties(r.ANIMALITY.INANIMATE, r.GENDER.FEMININE)) # свойства: неодушевлённое, женский род

# описываем глагол для словаря
action_word = words.Word(type=r.WORD_TYPE.VERB,
                         # описываем только нужны нам формы слова (порядок важен и определён в utg.data.WORDS_CACHES[r.WORD_TYPE.VERB])
                         forms=[u'подарить', u'подарил', u'подарило', u'подарила', u'подарили'] + [u''] * (len(data.WORDS_CACHES[r.WORD_TYPE.VERB]) - 5),
                         properties=words.Properties(r.ASPECT.PERFECTIVE, r.VOICE.DIRECT) )
action_word.autofill_missed_forms() # заполняем пропущенные формы на основе введённых (выбираются наиболее близкие)

# создаём словарь для использования в шаблонах
test_dictionary = dictionary.Dictionary(words=[coins_word, action_word])

# создаём шаблон
template = templates.Template()

# externals — внешние переменные, не обязаны быть в словаре
template.parse(u'[Npc] [подарил|npc] [hero|дт] [coins] [монета|coins|вн].', externals=('hero', 'npc', 'coins'))

# описываем внешние переменные
hero = words.WordForm(words.Word(type=r.WORD_TYPE.NOUN,
                                 forms=[u'герой', u'героя', u'герою', u'героя', u'героем', u'герое',
                                        u'герои', u'героев', u'героям', u'героев', u'героями', u'героях',
                                        u'герои', u'героев', u'героям', u'героев', u'героями', u'героях'],
                                 properties=words.Properties(r.ANIMALITY.ANIMATE, r.GENDER.MASCULINE)))

npc = words.WordForm(words.Word(type=r.WORD_TYPE.NOUN,
                                forms=[u'русалка', u'русалки', u'русалке', u'русалку', u'русалкой', u'русалке',
                                       u'русалки', u'русалок', u'русалкам', u'русалок', u'русалками', u'русалках',
                                       u'русалки', u'русалок', u'русалкам', u'русалок', u'русалками', u'русалках'],
                                 properties=words.Properties(r.ANIMALITY.ANIMATE, r.GENDER.FEMININE)))

# осуществляем подстановку
result = template.substitute(externals={'hero': hero,
                                        'npc': npc,
                                        'coins': constructors.construct_integer(125)},
                             dictionary=test_dictionary)

result == u'Русалка подарила герою 125 монет.'

Свойства слов

Вид

  • несов — несовершенный
  • сов — совершенный

Вид зависимости между словами

Вид зависимости определяет как будет изменяться слово, зависимое от другого. Полная зависимость означает, что слово изменит и семантические и морфологические свойства. Семантическая — только семантические. По умолчанию для слова используется полная зависимость.

Для примера, если у вас есть слова, зависимые от числительного, то во фразах:

  • «5 красивых хомячков побежали в норку» — необходима полная зависимость, так как числительное употребляется в предложении и необходимо изменять морфологию слова;
  • «Красивые хомячки побежали в норку» — необходима только семантическая зависимость, так как нам интересно только количество хомячков (один или много), но не надо согласовывать их с точным значением числительного;</li>
  • «Красивые 5 хомячков побежали в норку» — необходима полная зависимость слова «хомячки», но только семантическая зависимость слова «красивые».

свойства:

  • пзв — полная зависимость
  • сзв — семантическая зависимость

Виды целых чисел

  • цо — один
  • цд — дуальные 2, 3, 4
  • цсд — составные дуальные на 2, 3, 4
  • цост — остальные целые
  • цмм — миллион и миллиард

Время

  • прш — прошедшее время
  • нст — настоящее время
  • буд — будущее время

Залог

  • прям — прямой залог
  • взв — возвратный залог

Категория местоимения

  • личн — личное
  • возвр — возвратное
  • притяж — притяжательное
  • вопр — вопросительное
  • относ — относительное
  • указат — указательное
  • опред — определительное
  • отриц — отрицательное
  • неопр — неопределённое
  • взаимн — взаимное

Категория прилагательного

  • кач — качественное
  • отн — относительное
  • прит — притяжательное

Лицо

  • — 1-ое лицо
  • — 2-ое лицо
  • — 3-е лицо

Одушевлённость

  • од — одушевлённое
  • но — неодушевлённое

Падеж

  • им — именительный
  • рд — родительный
  • дт — дательный
  • вн — винительный
  • тв — творительный
  • пр — предложный

Размер 1-ой буквы

  • строч — строчная
  • загл — заглавная

Род

  • мр — мужской род
  • ср — средний род
  • жр — женский род

Степень прилагательного

  • пол — положительная степень
  • сравн — сравнительная степень
  • прев — превосходная степень

Форма глагола

  • инф — инфинитив
  • изъяв — изъявительное наклонение
  • пов — повелительное наклонение

Форма предлога

  • осн — основная форма
  • алт — альтернативная форма
  • спц — специальная форма

Форма прилагательного

  • полнприл — полная форма
  • крприл — краткая форма

Форма причастия

  • полнприч — полная форма
  • крприч — краткая форма

Форма существительного

  • нс — нормальная форма
  • счт — счётная форма

Часть речи

  • сущ — существительное
  • прил — прилагательное
  • мест — местоимение
  • гл — глагол
  • прич — причастие
  • целое — целое число
  • текст — текст
  • предл — предлог

Число

  • ед — единственное число
  • мн — множественное число

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for UTG, version 0.3.2
Filename, size File type Python version Upload date Hashes
Filename, size UTG-0.3.2.tar.gz (54.4 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page