Skip to main content

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

Project description

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

Примеры использования можно найти в игре «Сказка»: 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 монет.'

Project details


Download files

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

Source Distribution

UTG-0.3.0.tar.gz (48.6 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page