微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐