动态上下文无关语法NLTK

时间:2015-05-23 01:46:02

标签: python-2.7 nltk

尝试使用NLTK CFG生成句子。想知道是否有可能在下面的程序中连接sql数据库来提供名词和动词。 在下面的示例中,门,窗口,打开,关闭都是硬编码的。如何动态地请求nltk从excel或数据库列中查找以在此特定上下文中提供名词和动词?

import nltk   
from nltk.parse.generate import generate,demo_grammar   
from nltk import CFG   
grammar = CFG.fromstring("""   
S -> VP NP   
NP -> Det N   
VP -> V   
Det ->'the '   
N -> 'door' | 'window'   
V -> 'Open' | 'Close'    
""")    
print(grammar)   
for sentence in generate(grammar, n=100):   
   print(' '.join(sentence))        

1 个答案:

答案 0 :(得分:1)

您似乎无法动态更改NLTK CFG - 一旦实例化,它就会保持不变。在构造CFG时,您需要立即定义所有词汇表。

据我所知,您有两种方法可以包含来自外部资源的综合词汇:

  1. 按照您发布的示例构建语法字符串,并使用CFG.fromstring()进行解析。您可能需要处理一些转义问题(例如,终端符号中的引号/撇号)。
  2. 直接使用CFG构造函数,为其提供制作的列表,例如:

    from nltk import CFG, Production, Nonterminal
    prods = [Production(Nonterminal('S'), (Nonterminal('PN'), Nonterminal('V'))),
             Production(Nonterminal('PN'), ('Sam',)),
             Production(Nonterminal('PN'), ('Fred',)),
             Production(Nonterminal('V'), ('sleeps',))]
    g = CFG(Nonterminal('S'), prods)
    

    这看起来有点冗长,但构建Python数据类型的嵌套结构可能更容易,更快,而不是为(更简洁的)语法字符串格式编写无错误的序列化器。