- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我记得几年前上过一节课,有人给我举了一个有趣的有限状态机的例子,其中每个状态都包含一个字母,并且有多条路径指向通常跟在一个单词后面的其他字母。一些字母也有导致终止的路径,通过从有限状态机中的任何点开始并遵循有效的终止路径,可以将字母连在一起,(几乎)总是以有效的单词结束。当然,这只是语言中单词的一个子集(不幸的是,我忘记了fsm的含义)。我的问题涉及多个相关问题:
这是随机生成“伪”字的可行方法吗?我指的是一个不一定有效的词,但拼写的方式看起来是有效的。
这种技术是在任何著名的随机词生成算法中使用的,还是作为其中的一部分使用的,如果是的话,是哪种算法?
有没有其他常见的替代方法可以一次生成一个一个字母的随机单词,或者可能采用这种方式生成的随机字符串并将其强制为“伪”单词?
最佳答案
规则
正确的答案取决于“伪词”的含义,以及您希望多个生成的伪词如何相互关联。既然你已经用“过程生成”标记了这个问题,我假设你想构造一个假自然语言;所以:
每个词都应该是可发音的例如,“gotrobit”是可以接受的,但“grrhjklmpp”不是。
不同单词的总体“感觉”应该是可比的;你不希望一组芬兰语发音的单词与法语发音的单词混合在一起。
fsms的一般问题
您当然可以使用有限状态机来执行此操作,但有两个可能的陷阱:
如果fsm包含循环,则可以有非常不同的单词长度;这对需求2非常不利。如果你的FSM不包含循环,你将得到一个巨大的FSM,以便生成一个合理的词典。
在构建你的fsm时,你需要非常小心,否则你最终会得到一些不满足的词。
您可以添加一个后处理步骤,过滤掉“愚蠢”的结果,但正如我稍后将展示的,有更好的选择。
马尔可夫链
考虑到这些陷阱,一种常见的fsm播种方法是使用Markov chains。
例如,可以生成一个不确定的FSM,其中每个状态代表一个字符(或终止);然后分析一个语料库,例如英语文本,以计算特定字符后面跟另一个字符的可能性,并使用该语料库创建转换。
使用马尔可夫链可以更容易地达到目标2;通过使用德语文本的语料库,可以得到一组完全不同的单词,它们仍然有些相似。
如前所述,陷阱依然存在。例如,看“艺术”和“训练”这两个词。这意味着“t”可以跟在“r”后面,但“r”也可以跟在“t”后面根据这些例子,你可以用“trtrtrain”这样的词结束,在我看来,这违反了1。
这可以通过让每个状态表示两个字符(而不是一个字符)的组合来减轻,但这将很快导致状态爆炸。
音节
一个更有希望的方法是不要逐字逐句地生成你的单词,而是逐字逐句地生成首先生成一个允许的音节列表,确定音节中的首选单词长度,然后选择该数量的音节。
例如,可以从使用所有辅音+元音音节的列表开始。这会给你像“德川”和“波塔罗沃”这样的词。你也可以使用一个元音+辅音音节的列表,它会给你提供像“otukag”和“opatorov”这样的单词:一种完全不同的“语言”,具有相同的简单规则。
当然,当你同时允许辅音+元音和单元音音节时,这会变得棘手。现在你可以用“tokuauga”这样的词结束,这可能是你想要的,也可能不是你想要的。
你可以更进一步,对音节类型进行分类,并添加一些简单的规则,例如:“只有两个单元音音节可以互相跟随”;或者“每个辅音元音音节后面跟着一个单元音音节,后面跟着一个辅音元音辅音音节”。现在你可以用“tokuugat”这样的词结束了。
通过选择一组允许的音节和规则,您可以得到感觉有点连贯的不同“语言”。
使用音位
如果你想写出更好的单词,你应该从使用phonemes而不是字母开始这允许您轻松地表示非ascii声音,如“ng”、“sh”和(舌头点击)。然后按照上面描述的算法执行,然后执行“音译”步骤,将音素更改为“可读”字母。
通过使用不同的音译,你可以得到更多类似语言的感觉。例如,您可以音译/sh/像'sh'(英语),或'ch'(法语)或'sch'(荷兰语)。
音位规则
Phonological rules基本上是描述上一节中规则的一种正式方式,比我前面的示例更进一步。通过选择正确的规则集,您可以创建“硬”语言、“软”语言等。例如,您可以选择将“元音+r+k+元音”更改为“元音+r+r+元音”(生成听起来像马达的语言)或更改为“元音+k+h+元音”(生成典型的矮人语言)。可能性是无穷的。
语音研究产生了很多这样的规则,帮助你创造出更多类似地球的语言。
这种方法的一个很好的例子是Drift,这是一个python程序,它使用一个音节列表和一组语音规则来生成“真实”单词。
撇开随机性和计算机生成方面不谈,我相信这或多或少是托尔金生成精灵语言和方言时所使用的方法。
结论
总结答案:
是的,使用FSM是一种可行的方法
马尔可夫链是一种流行的技术来创建这样的fsm
通过使用音节和音韵学的研究,你会得到更好的结果
关于string - 一次生成一个字母的有限状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32241330/
我有一个关于复杂性的简单问题。我在 Java 中有这段代码: pairs是 HashMap包含 Integer作为键,它的频率为 Collection作为一个值。所以: pairs = new Has
对于我的应用程序,我需要在 Coq 中使用和推理有限映射。谷歌搜索我发现 FMapAVL 似乎非常适合我的需求。问题是文档很少,我还没有弄清楚我应该如何使用它。 作为一个简单的例子,考虑以下使用对列表
我有一个主表tblAssetMaster A和一个移动表tblMovement M。 我想提取所有 Assets 及其当前位置,因此需要获取每个 Assets 的最新移动条目。 字段 A: Asset
我想让我的网站内容居中,但仅限于网页的特定宽度。所以当它超过 500px 时,我希望内容被修复,无法进一步拉伸(stretch)。无论如何都要这样做,还是我最好把所有东西都修好?希望有意义的是添加一些
我正在尝试批量删除 Backbone 模型的集合,如下所示...... collection.each(function(model, i){ model.destroy(); }); 我发现当每
我想要一个软件环境,在其中我可以在具有特定资源的硬件上测试我的软件的速度。例如,当我的主机硬件是具有 12GB RAM 的 3GHz 四核 amd64 时,该程序在具有 24 Mb RAM 的 800
在 Eclipse 中,我得到了 BigInteger.valueOf(2).pow(31093) 的值,但没有得到 BigInteger.valueOf(2).pow(31094) 的值(它是空的)
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我想将 2 个表从本地 sql server 2000 上传到托管的 mysql。第一个表有 17 列和 680 行,其他 10 列和 8071 行。 我首先使用 xampp mysql 尝试离线,它
我在 S3 中自动生成并保存了静态 html 文件。有时文件大小达到 2mb。是否可以使用javascript来获取html文件的一部分,显示它,当用户到达页面底部时,获取下一部分等等? 最佳答案 X
我是一名优秀的程序员,十分优秀!