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