NLTK - 从概率上下文无关文法 (PCFG) 生成文本

NLTK - generate text from probabilistic context free grammar (PCFG)

我有上下文无关语法并用它来创建句子(在 python 中使用 NLTK)。

# Create a CFG
from nltk import CFG
from nltk.parse.generate import generate
grammar = CFG.fromstring("""
Story -> Introduction MainQuest End
LocationInfo -> 'He found himself in a small village where he grew up.'
Introduction -> 'Long ago there was a boy who decided to become a knight.'

MainQuest -> LocationInfo 'He had to get a sword first to fight monsters' Navigate

Navigate -> '[He could go west]' GoodEnd | '[He could go east]' BadEnd
GoodEnd -> 'And he lived happily ever after.'
BadEnd -> 'Finally he died painfully.'
End -> 'The End'
""")

#print(grammar.start())
#print(grammar.productions())
for sentence in generate(grammar, n=2):
    print('\n'.join(sentence))
    print('\n')

这很简单而且有效。但是现在,我想为特殊情况添加概率,以便根据具有给定概率的随机因素,我生成的故事可以有好结局也可以有坏结局。

我找不到任何这样做的例子,当我将我的 PCFG 送入 nltk.parse.generate 时,它会将其视为 CFG。

希望你能帮帮我!

nltk.parse.generate.generate 不会生成随机句子。它 returns 一个迭代器,它只生成每个可能的句子一次,直到生成请求数量的句子。可以限制最大推导深度,但是生成是深度优先的;它不会按派生深度对句子进行排序。

您可以找到source code here;不难看出它在做什么。

所以它是完全确定的,永远不会重复自己。如果你想要一个(可能是无限的)随机选择的句子流,你将不得不编写自己的生成器。