有限状态机一次生成一个字母的名称

问题描述 投票:3回答:1

我记得几年前上过一个班级,在那里我得到了一个有趣状态机的有趣例子,其中每个州都包含一个字母,并且有多条路径导致其他字母通常跟着它们一个字。一些字母也有导致终止的路径,并且通过从有限状态机中的任何点开始并遵循到终止的有效路径,您可以将字母链接在一起并且(几乎)总是以有效的方式结束字。当然,这只是该语言中的一部分单词(遗憾的是我忘记了FSM的用语)。我的问题涉及多个相关问题:

  • 这是随机生成“伪”字的可行方法吗?我的意思是一个不一定有效的词,但是一个看起来有效的拼写的词。
  • 这种技术是用于任何众所周知的随机字生成算法,还是作为其中的一部分,如果是这样,哪些算法?
  • 是否有其他常见的替代方法,一次生成一个字母的随机单词,或者可能采用以这种方式生成的随机字符串并将其强制转换为“伪”字?
string algorithm random state-machine procedural-generation
1个回答
6
投票

The rules

您案例的正确答案取决于“伪词”的含义,以及您希望多个生成的伪词如何相互关联。既然你用“程序生成”标记了这个问题,我会假设你想构建一个虚假的自然语言;所以:

  1. 每个单词都应该是可发音的。例如,'gotrobit'是可以接受的,但'grrhjklmpp'不会。
  2. 不同词语的一般“感觉”应具有可比性;你不希望一组芬兰语混合着法语的单词。

General issues with FSMs

您当然可以使用有限状态机来执行此操作,但有两个可能的缺陷:

  • 如果FSM包含循环,则可能会有很多不同的字长;这对于要求#2来说非常糟糕。如果你的FSM不包含循环,你将得到一个巨大的FSM,以便生成一个合理的词典。
  • 构建FSM时需要非常小心,否则最终会得到不满足#1的单词。

您可以添加一个后处理步骤来筛选出“愚蠢”的结果,但正如我稍后将要展示的那样,有更好的选择。

Markov Chains

考虑到这些陷阱,播种FSM的常用方法是使用Markov chains

例如,您可以生成一个非确定的FSM,其中每个状态代表一个字符(或终止);然后你分析一个例如英语文本,用于计算特定字符后跟另一个字符的可能性,并使用它来创建转换。

使用马尔可夫链可以更容易地达到目标#2;通过使用例如在德语文本的语料库中,你会得到一组完全不同的单词,这些单词仍然有点相似。

如上所述,陷阱仍然存在。例如,看看“艺术”和“火车”这两个词。这意味着't'可以跟随'r',但'r'可以跟随't'。基于这些例子,你最终会得到像“trtrtrain”这样的词,这在我的眼中违反了#1。

这可以通过让每个状态代表2个字符的组合而不是一个字符来稍微减轻,但这很快就会导致状态爆炸。

Syllables

更有前途的方法是不要逐字母地生成单词,而是通过音节生成音节。首先生成一个允许的音节列表,确定音节中您喜欢的单词长度,然后选择该音节数量。

例如,您可以使用所有辅音+元音音节的列表开始。这会给你一些像“tokuga”和“potarovo”这样的词。您还可以使用元音+辅音音节列表,它会为您提供“otukag”和“opatorov”等词语:一种完全不同的“语言”,具有相同的简单规则。

当然,如果您愿意,这会变得棘手。允许辅音+元音和单元音音节。现在你最终会得到像“tokuuauga”这样的词,这可能是你想要的,也可能不是。

您可以更进一步,对音节类型进行分类并添加一些简单的规则,例如:“只有两个单音节音节可以互相跟随”;或“每个辅音 - 元音音节后跟单元音音符必须后跟一个辅音 - 元音 - 辅音音节”。现在你最终可以得到像“tokuugat”这样的词。

通过选择允许的音节和规则集,您可以获得感觉有些连贯的不同“语言”。

Using phonemes

如果你想做更好的单词,你应该首先使用phonemes而不是字母。这使您可以轻松地表示非ASCII声音,例如“ng”,“sh”和(舌头)。然后按照上述方法执行算法,然后执行“音译”步骤,将音素更改为“可读”字母。

通过使用不同的音译,您可以获得更多“语言”般的感受。例如,你可以音译/ sh /喜欢'sh'(英语),或'ch'(法语)或'sch'(荷兰语)。

Phonological rules

Phonological rules基本上是描述上一节规则的正式方式,比我之前的例子更进一步。通过选择正确的规则集,您可以创建“硬”语言,“软”语言等。例如,您可以选择将“元音+ r + k +元音”更改为“元音+ r + r” +元音'(产生一种听起来像马达的语言)或被改为'元音+ k + h +元音'(导致典型的侏儒语)。可能性是无止境。

语音学研究产生了很多这些规则,帮助你创造更多类似地球的语言。

这种方法的一个很好的例子是Drift,一个Python程序,它使用一个音节列表和一组语音规则来生成“真正的”单词。

抛弃随机性和计算机生成的方面,我相信这或多或少是托尔金生成他的精灵语言和方言时使用的方法。

Conclusion

总结答案:

  • 是的,使用FSM是一种可行的方法
  • 马尔可夫链是创建这种FSM的流行技术
  • 通过使用音节和音韵学研究,您可以获得更好的结果
© www.soinside.com 2019 - 2024. All rights reserved.