генератор связанного русского текста
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
utg
.gitignore
LICENSE
MANIFEST.in
README.rst
requirements.txt
setup.py

README.rst

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

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

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

Для работы библиотки требуется дополнительный пакет: rels>=0.3.0

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

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

Пример:

Вчера [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 монет.'