Pat*_*rts 3 string random algorithm state-machine procedural-generation
我记得几年前上过一个班级,在那里我得到了一个有趣状态机的有趣例子,其中每个州都包含一个字母,并且有多条路径导致其他字母通常跟着它们一个字.一些字母也有导致终止的路径,并且通过从有限状态机中的任何点开始并遵循到终止的有效路径,您可以将字母链接在一起并且(几乎)总是以有效的方式结束字.当然,这只是该语言中的一部分单词(遗憾的是我忘记了FSM的用语).我的问题涉及多个相关问题:
您案例的正确答案取决于"伪词"的含义,以及您希望多个生成的伪词如何相互关联.既然你用"程序生成"标记了这个问题,我会假设你想构建一个虚假的自然语言; 所以:
您当然可以使用有限状态机来执行此操作,但有两个可能的缺陷:
您可以添加一个后处理步骤来筛选出"愚蠢"的结果,但正如我稍后将要展示的那样,有更好的选择.
考虑到这些缺陷,为FSM播种的常用方法是使用马尔可夫链.
例如,您可以生成一个非确定的FSM,其中每个状态代表一个字符(或终止); 然后,您可以分析例如英语文本的语料库,以计算特定字符后跟另一个字符的可能性,并使用它来创建过渡.
使用马尔可夫链可以更容易地达到目标#2; 通过使用例如德语文本语料库,您可以获得完全不同的单词集,这些单词仍然有点相似.
如上所述,陷阱仍然存在.例如,看看"艺术"和"火车"这两个词.这意味着't'可以跟随'r',但'r'可以跟随't'.基于这些例子,你最终会得到像"trtrtrain"这样的词,这在我的眼中违反了#1.
这可以通过让每个状态代表2个字符的组合而不是一个字符来稍微减轻,但这很快就会导致状态爆炸.
更有前途的方法是不要逐字母地生成单词,而是通过音节生成音节.首先生成一个允许的音节列表,确定音节中您喜欢的单词长度,然后选择该音节数量.
例如,您可以使用所有辅音+元音音节的列表开始.这会给你一些像"tokuga"和"potarovo"这样的词.您还可以使用元音+辅音音节列表,它会为您提供"otukag"和"opatorov"等词语:一种完全不同的"语言",具有相同的简单规则.
当然,如果您允许辅音+元音和单元音音节,这会变得棘手.现在你最终可以得到像"tokuuauga"这样的词,这可能是也可能不是你想要的.
您可以更进一步,对音节类型进行分类并添加一些简单的规则,例如:"只有两个单音节音节可以互相跟随"; 或"每个辅音 - 元音音节后跟单元音音符必须后跟一个辅音 - 元音 - 辅音音节".现在你最终可以得到像"tokuugat"这样的词.
通过选择允许的音节和规则集,您可以获得感觉有些连贯的不同"语言".
如果你想要更好的单词,你应该首先使用音素而不是字母.这使您可以轻松地表示非ASCII声音,例如"ng","sh"和(舌头).然后按照上述方法执行算法,然后执行"音译"步骤,将音素更改为"可读"字母.
通过使用不同的音译,您可以获得更多"语言"般的感受.例如,你可以音译/ sh /喜欢'sh'(英语),或'ch'(法语)或'sch'(荷兰语).
语音规则基本上是描述上一节规则的正式方式,比我之前的例子更进一步.通过选择正确的规则集,您可以创建"硬"语言,"软"语言等.例如,您可以选择将"元音+ r + k +元音"更改为"元音+ r + r" +元音'(产生一种听起来像马达的语言)或被改为'元音+ k + h +元音'(导致典型的侏儒语).可能性是无止境.
语音学研究产生了很多这些规则,帮助你创造更多类似地球的语言.
这种方法的一个很好的例子是Drift,一个Python程序,它使用一个音节列表和一组语音规则来生成"真实"单词.
抛弃随机性和计算机生成的方面,我相信这或多或少是托尔金生成他的精灵语言和方言时使用的方法.
总结答案: