NLTK在Python中生成没有两个同一个单词的句子

时间:2016-03-10 11:24:46

标签: python nltk context-free-grammar linguistics

我正在使用这个NLTK代码从demo_grammar生成句子(见下文),问题在于使用像N N或N N N这样的语法规则,我最终会得到像“创建创建创建”这样的句子。我只对生成相同单词不会出现两次的句子感兴趣(即创建视频软件)。

我怎么能这样做?

来自NLTK的generate.py是这样的:https://github.com/nltk/nltk/blob/develop/nltk/parse/generate.py

我尝试过generate.py

中的演示代码
from nltk.grammar import CFG
from nltk.parse import generate    

demo_grammar = """
  S -> NP VP
  NP -> Det N
  PP -> P NP
  VP -> 'slept' | 'saw' NP | 'walked' PP
  Det -> 'the' | 'a'
  N -> 'man' | 'park' | 'dog'
  P -> 'in' | 'with'
"""

def demo(N=23):

    print('Generating the first %d sentences for demo grammar:' % (N,))
    print(demo_grammar)
    grammar = CFG.fromstring(demo_grammar)
    for n, sent in enumerate(generate(grammar, n=N), 1):
        print('%3d. %s' % (n, ' '.join(sent)))

1 个答案:

答案 0 :(得分:0)

您可以按照alexis的建议重写语法,这意味着每个句子中特定位置的几个术语列表(名词,动词......)。

但您也可以应用后过滤策略(不必触及语法):

  • 使用您的语法生成所有可能的句子,甚至是包含两次或更多单词的句子
  • 应用过滤器,删除所有包含两次或更多字词的句子

以下是您可以申请的过滤器:

from collections import Counter
f=lambda sent:False if Counter(sent.split(" ")).most_common(1)[0][1] > 1 else True

f("creation video software") # return True, good sentence
f("creation creation creation") # return False, bad sentence
f("creation software creation") # return False, bad sentence