我目前正在开发一个项目,通过使用无上下文语法规则,我将生成随机句子.现在,我正在创建一个将接收哈希的函数,并遍历它选择正确的产品来创建一个句子并将其作为字符串返回.
例如,给定以下格式的哈希:
{ "<start>"=>[["The","<object>","<verb>","tonight."]],"<object>"=>[["waves"],["big","yellow","flowers"],["slugs"]],"<verb>"=>[["sigh","<adverb>"],["portend","like","<object>"],["die","<adverb>"]],"<adverb>"=>[["warily"],["grumpily"]] }
我应该能够产生一个随机的句子,例如:“今晚的波浪会变得非常糟糕”.
以下是生成此句子的整个过程:
>它将始终在< start>处开始生成标记并继续填写所需的作品.
>它通过< start>并添加“The”然后遇到“< object>”所以它进入< object>键并从那里获取随机值,例如[“waves”].
>然后它返回并继续遍历并遇到“< verb>”所以它进入<动词>键并从中获取随机值,例如[“die”,“< adverb>”].
>因为它遇到了“< adverb>”它必须进入<副词>键并选择一个随机值,例如[“grumpily”].
>然后它回到遍历,然后遇到并添加“今晚”.它已经到了< start>的结尾了.所以它现在可以输出句子.
解决方法
有趣的运动!
定义String#has_placeholder之后?检查<之间的单词和>
只要有占位符,算法就会选择一个起始句并迭代它.如果找到占位符,则将其替换为随机选择的子句.
没有采取任何措施来检查错误.某些占位符可能未定义或可能存在无限循环.
class String def has_placeholder? self=~/<\w+>/ end end grammar = { "<start>"=>[["The",["grumpily"]] } sentence = grammar["<start>"].sample.join(' ') while sentence.has_placeholder? do puts sentence sentence.sub!(/(<\w+>)/){grammar[$1].sample.join(' ')} end puts sentence
它输出:
The <object> <verb> tonight. The slugs <verb> tonight. The slugs portend like <object> tonight. The slugs portend like slugs tonight.
要么
The <object> <verb> tonight. The big yellow flowers <verb> tonight. The big yellow flowers portend like <object> tonight. The big yellow flowers portend like slugs tonight.
编辑:
您想要的方法可能如下所示:
def expand(grammar,nonterm = "<start>") sentence = grammar[nonterm].sample.join(' ') while sentence.has_placeholder? do sentence.sub!(/(<\w+>)/){grammar[$1].sample.join(' ')} end sentence end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。