如何使用NLTK从诱导语法生成句子?

我有一个(大的)解析句子列表(使用斯坦福解析器解析),例如,句子“现在你可以被娱乐”具有以下树:

(ROOT
  (S
    (ADVP (RB Now))
    (, ,)
    (NP (PRP you))
    (VP (MD can)
      (VP (VB be)
        (VP (VBN entertained))))
    (. .)))

我正在使用一组句子树来使用nltk来引发语法:

import nltk

# ... for each sentence tree t, add its production to allProductions
allProductions += t.productions()

# Induce the grammar
S = nltk.Nonterminal('S')
grammar = nltk.induce_pcfg(S, allProductions)

现在我想用grammar来生成新的随机句子。 我的希望是,由于语法是从一组特定的输入示例中学习的,因此生成的语句将在语义上相似。 我可以在nltk中做到这一点吗?

如果我不能使用nltk来做到这一点,是否有其他工具可以使用(可能重新格式化)的grammar并生成句子?


在NLTK 2.0中,您可以使用nltk.parse.generate为给定语法生成所有可能的句子。

该代码定义了一个函数,该函数应该根据(P)CFG中的生产规则生成单个句子。

# This example uses choice to choose from possible expansions
from random import choice
# This function is based on _generate_all() in nltk.parse.generate
# It therefore assumes the same import environment otherwise.
def generate_sample(grammar, items=["S"]):
    frags = []
    if len(items) == 1:
        if isinstance(items[0], Nonterminal):
            for prod in grammar.productions(lhs=items[0]):
                frags.append(generate_sample(grammar, prod.rhs()))
        else:
            frags.append(items[0])
    else:
        # This is where we need to make our changes
        chosen_expansion = choice(items)
        frags.append(generate_sample,chosen_expansion)
    return frags

要使用PCFG中的权重,显然希望使用比choice()更好的采样方法,这隐含地假定当前节点的所有扩展都是等概率的。


首先,如果您生成随机句子,它们可能在语义上是正确的,但它们可能会失去它们的意义。

(这听起来有点像麻省理工学院的学生们用他们自己编写的科学论文SCIgen程序做的,很有趣。

无论如何,我从来没有这样做过,但对于nltk.bigrams似乎是可能的,您可以在Bigrams的随机文本生成查看

你也可以生成当前树的所有子树,我不确定它是否是你想要的。


使用nltk Text对象,可以在其上调用“generate()”,它将“打印随机文本,使用trigram语言模型生成”。http://nltk.org/_modules/nltk/text.html

链接地址: http://www.djcxy.com/p/91719.html

上一篇: How to use NLTK to generate sentences from an induced grammar?

下一篇: How can I tag and chunk French text using NLTK and Python?