NLTK在Python中生成不出现两个相同单词的句子

NLTK在Python中生成不出现两个相同单词的句子,python,nltk,context-free-grammar,linguistics,Python,Nltk,Context Free Grammar,Linguistics,我正在使用这个NLTK代码从demo_语法生成句子(见下文),问题是,对于N N或N N这样的语法规则,我最终会得到“creation”这样的句子。我只对生成同一单词不会出现两次的句子感兴趣(即创建视频软件) 我怎么能这么做 NLTK中的generate.py如下所示: 我已经尝试了generate.py中的演示代码: from nltk.grammar import CFG from nltk.parse import generate demo_grammar = """ S

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

我怎么能这么做

NLTK中的
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)))

你可以按照亚历克西斯的建议重写语法,这意味着每个句子中特定位置的几个术语(名词、动词等)列表

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

  • 用你的语法造出所有可能的句子,甚至是单词出现两次或两次以上的句子
  • 应用过滤器,删除单词出现两次或两次以上的所有句子
以下是您可以应用的筛选器:

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

你可以按照亚历克西斯的建议重写语法,这意味着每个句子中特定位置的几个术语(名词、动词等)列表

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

  • 用你的语法造出所有可能的句子,甚至是单词出现两次或两次以上的句子
  • 应用过滤器,删除单词出现两次或两次以上的所有句子
以下是您可以应用的筛选器:

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

每个规则扩展都是独立于其他规则扩展的;这就是上下文无关语法。重写语法是一种选择吗?你可以做你想做的事情,把终端从你的语法中去掉,把它们作为一个单独的步骤放进去;这就是上下文无关语法。重写语法是一种选择吗?你可以做你想做的事情,把终端从语法中去掉,作为一个单独的步骤放进去。这很好也很简单,但我建议修改语法的原因是这个过滤器必然会删除太多内容:例如,你会扔掉“猫坐在垫子上”。(“发生两次,太可怕了!)而且没有办法限制它,因为输出没有结构,甚至没有词性。但是,嘿,如果它对操作来说足够好的话……很好,很简单,但是我建议修改语法的原因是这个过滤器必然会删除太多内容:例如,你会抛出“猫坐在垫子上”。(“发生两次,太可怕了!)而且没有办法限制它,因为输出没有结构,甚至没有词性。但是,嘿,如果对手术来说足够好的话。。。