ruby – 从地图创建字符串

我目前正在开发一个项目,通过使用无上下文语法规则,我将生成随机句子.现在,我正在创建一个将接收哈希的函数,并遍历它选择正确的产品来创建一个句子并将其作为字符串返回.

例如,给定以下格式的哈希:

{
"<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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...