通过模板以俄语生成文本

当我刚开始从事文字游戏时,我决定其主要功能之一应该是对角色动作的精美艺术描述。 我部分想“保存”,因为我不知道如何安排时间。 保存不起作用,但事实证明,Python库( githubpypi )用于生成文本,同时考虑了单词的依赖性及其语法特征。

例如,从模板:
[英雄] [经过|英雄]经过不起眼的院子,突然[被发现|英雄]孩子在玩耍。 他们带着木剑,五线谱和怪物面具奔跑。 突然,一位玩家停下来,将[玩具| hero.weapon | vn] [hero.weapon | vn]喊道:“ [我|英雄] [伟大|英雄] [英雄] ! 得到它!” -并冲向“野兽”。 他们跌倒在地,跳起胳膊和腿,然后站起来,摘下面具笑了。 [咕| |英雄][他自己|英雄] [英雄] ,但没有[开始|英雄]向孩子出去。
我们可以得到以下文本(更改词为粗体):
哈勒 走过一个不起眼的院子,突然发现孩子们在玩耍。 他们带着木剑,五线谱和怪物面具奔跑。 突然,其中一名球员停下脚步, 拿出一把镀金的玩具剑 ,大喊:“ 我是伟大的哈勒 ! 得到它!” -并冲向“野兽”。 他们跌倒在地,跳起胳膊和腿,然后站起来,摘下面具笑了。 哈尔 本人笑了起来 ,但没有走出去给小家伙。
或像这样:
费瓦拉(Fievara) 走过一个不起眼的院子,突然发现孩子在玩耍。 他们带着木剑,五线谱和怪物面具奔跑。 突然其中一名球员停下脚步, 拿出一个粘膜玩具 ,喊道:“ 我是伟大的费瓦拉 ! 得到它!” -并冲向“野兽”。 他们跌倒在地,跳起胳膊和腿,然后站起来,摘下面具笑了。 Fievara 自己 咕gr 了一声 ,但没有跟小孩子走。

情侣预订
免责声明1 。 我不是语言学家,图书馆是“为了工作”而写的,而不是“完全符合语言的所有规则”。 因此,对于术语不正确或俄语规则解释不完整,我深表歉意。

免责声明2 。 该库大约是在5年前开发的,现在可能会出现文本生成的替代方法(或发展为正常状态)。 例如,一些有趣的东西可能在软件中用于本地化。

关于文本生成的复杂性


俄语在许多方面都很复杂。 特别地,单词具有大量的形态形式。 例如,形容词可以是完整形式,也可以是简短形式,随性别,数量,大小写,动画和比较程度的不同而不同。 具体形式的选择取决于句子中的其他单词。 我们说“美丽的女人”,但“美丽的男人”。 在这种情况下,“美丽”一词取决于“男人” /“女人”一词-其形式由主词的性别决定。

因此,当我们尝试根据性别与某人联系时,困难就开始了。 在为网站,信件,游戏编写文本时,必须要么用非常整齐的措辞(避免用户性别),要么一次写几篇文本,或者使用不同程度的通用性标记语言。

我想要的不仅仅是简单地依赖播放器的性别,甚至还希望用户自己可以添加新文本(众所周知,“普通”用户非常文盲:-))。 因此,我没有找到合适的软件,所以决定自己做。

图书馆特色


UTG(通用文本生成器-名称不太普通)允许您使用以下内容创建用于生成文本的模板:

  • 变量(例如角色名称);
  • 单词对变量的依赖性(例如,名词的形容词);
  • 一些变量对其他变量的依赖;
  • 单词和变量的显式属性(例如,您可以指定在父大小写中插入字符名称);

从模板生成文本时:

  • 主词的必要属性将转移到从属词。 例如,名词的性别被转移到形容词。
  • 从属词的形式与数字一致(考虑到从属词的形式)。
  • 如有必要,可以修改介词(例如,关于我/关于您),为此应标出借口。

附加实现:

  • 用于存储必要单词的字典。
  • 模板存储库,用于按类型存储模板并选择随机模板。

图书馆“知道”名词,形容词,代词,动词,分词,数字,介词和“引号”(不变的文字)的存在。

考虑以下单词的属性:词性,格,格,动画,数字,性别,动词形式,时间,人,类型,形容词类别,形容词程度,代词类别,语音,介词形式,形容词形式,分词形式,名词形式(除了正常形式外,名词还有一个可数 )。

模板格式和用法示例


让我们看一个简单的模板:
昨天[暴民] [被咬|暴民] [英雄|分机]
根据变量的值,模板可能显示为以下短语:
昨天,鬣狗咬了哈雷。
某某:
萤火虫昨天咬了一个鬼。
更详细地考虑模板:

  • -纯文本。
  • [mob] -变量,代替怪物的名字。
  • [|mob] -依赖于变量的单词,其部分属性将根据怪物名称的属性(例如数字)而变化。 文本生成器会自动识别单词形式的属性并尝试保存它们(例如,经过时间将被识别并保存,因此您无需指定它)。
  • [hero|] -一个变量,用英雄的名字代替。 另外指出,该名称应为宾格。

更多示例模板。
测试中可以找到一些技术示例。

如果您对更多示例感兴趣,可以在玩具网站上查看它们。 可以通过在我的个人资料中翻阅或以个人形式找到指向它的链接。

模板中的变量词和从属词均以相同的方式突出显示,并具有以下格式:

  • [ -打开方括号。
  • -依赖单词或变量标识符。 生成器首先检查是否存在具有该名称的变量;如果没有这样的变量,则在词典中搜索单词。
  • | -竖线-分隔符,如果我们指定其他属性,则需要此分隔符。
  • -单词形状所依赖的变量可能不存在。
  • | -竖线-分隔符,如果我们指定其他属性,则需要此分隔符。
  • -描述单词的所需形式(大小写,性别等)。 它们的列表可以在github和pypi的项目页面上找到。
  • ]是右方括号。

您可以根据需要指定任何其他属性,它们将按定义顺序应用,例如:

[ 1| 2|,| 3|,,]

大多数情况下,以下格式已足够:

  • [] -以常规形式插入变量(例如,单数的名词情况下为名词)。
  • [|] -插入具有指定属性的变量。
  • [|] -插入一个单词,将其与变量匹配(例如,形容词“ beautiful”(带有性别和大小写的名词))。
  • [||] -插入单词,将其与变量匹配并指定其他属性。

请注意:

  • 为单词和变量指定属性仅在插入位置有效,因此,为了获得短语“ beautiful hero”,我们必须明确指出两个单词的宾格: [|hero|] [hero|]
  • 文本生成器可以通过其形式“猜测”单词的属性,例如,在短语[hero] [|hero]您可以省略动词的时态。
  • 稍后指定的属性将覆盖先前指定的属性。 例如,在短语[|hero] [hero|] ,不会建立形容词的宾语,因为它会被变量hero的主格替换。
  • 可以在github和pypi的库页面上找到单词属性的列表。

代码示例
需要Python 3

安装方式

 pip install utg python -m unittest discover utg 

代号

 from utg import relations as r from utg import dictionary from utg import words from utg import templates from utg import constructors ####################################### #     ####################################### coins_forms = [#   '', '', '', '', '', '', #   '', '', '', '', '', '', #   (  , #     autofill_missed_forms) '', '', '', '', '', ''] # : ,   coins_properties = words.Properties(r.ANIMALITY.INANIMATE, r.GENDER.FEMININE) #      ,    coins_word = words.Word(type=r.WORD_TYPE.NOUN, forms=coins_forms, properties=coins_properties) #        . #      , #          : # - utg.data.WORDS_CACHES # - utg.data.INVERTED_WORDS_CACHES ############################## #     ############################## #       # (     utg.data.WORDS_CACHES[r.WORD_TYPE.VERB]) action_forms = (['', '', '', '', ''] + [''] * 15) # : ,   action_properties = words.Properties(r.ASPECT.PERFECTIVE, r.VOICE.DIRECT) action_word = words.Word(type=r.WORD_TYPE.VERB, forms=action_forms, properties=action_properties) #       (  ) action_word.autofill_missed_forms() ############################################## #       ############################################## test_dictionary = dictionary.Dictionary(words=[coins_word, action_word]) ################ #   ################ template = templates.Template() # externals —  ,      template.parse('[Npc] [|npc] [hero|] [coins] [|coins|].', externals=('hero', 'npc', 'coins')) ############################## #    ############################## hero_forms = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] # : ,   hero_properties = words.Properties(r.ANIMALITY.ANIMATE, r.GENDER.MASCULINE) hero = words.WordForm(words.Word(type=r.WORD_TYPE.NOUN, forms=hero_forms, properties=hero_properties)) npc_forms = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] # : ,   npc_properties = words.Properties(r.ANIMALITY.ANIMATE, r.GENDER.FEMININE) npc = words.WordForm(words.Word(type=r.WORD_TYPE.NOUN, forms=npc_forms, properties=npc_properties)) ########################## #   ########################## result = template.substitute(externals={'hero': hero, 'npc': npc, 'coins': constructors.construct_integer(125)}, dictionary=test_dictionary) ########################## #  ########################## result == '   125 .' 

关于字典


您可能已经注意到,UTG需要形成字典。 由于在开发时是“手动”完成的:

  • 我没有找到任何一般可访问的定性形态词典。
  • pymorphy库仍然是第一个版本,并且经常斜视(特别是在带有宾格的情况下),这就是为什么我不得不放弃它。

如果要使用包含大量单词的生成器,请在手动输入它们之前,尝试使用pymorphy2或查找现成的词典并从中导出。

合计


我希望图书馆会有所帮助。

如果您对它的发展有想法(甚至更好,希望参与其中),请写一条个人消息,执行拉取请求,将错误发布到github。

Source: https://habr.com/ru/post/zh-CN471278/


All Articles