NLTK 在 Python 中生成没有两次出现相同单词的句子
NLTK Generate sentences without two occurences of the same word in Python
我正在使用此 NLTK 代码从 demo_grammar 生成句子(见下文),问题是使用像 N N 或 N N N 这样的语法规则,我最终会得到像 "creation creation creation" 这样的句子。我只对生成同一个词不会出现两次的句子感兴趣(即创作视频软件)。
我该怎么做?
来自 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)))
您可以按照 alexis 的建议重写语法,这意味着每个句子中特定位置的多个术语列表(名词、动词等)。
但您也可以应用 post 过滤策略(不必接触语法):
- 用你的语法生成所有可能的句子,甚至是单词出现两次或更多的句子
- 应用过滤器删除所有单词出现两次或更多次的句子
这是您可以应用的过滤器:
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
我正在使用此 NLTK 代码从 demo_grammar 生成句子(见下文),问题是使用像 N N 或 N N N 这样的语法规则,我最终会得到像 "creation creation creation" 这样的句子。我只对生成同一个词不会出现两次的句子感兴趣(即创作视频软件)。
我该怎么做?
来自 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)))
您可以按照 alexis 的建议重写语法,这意味着每个句子中特定位置的多个术语列表(名词、动词等)。
但您也可以应用 post 过滤策略(不必接触语法):
- 用你的语法生成所有可能的句子,甚至是单词出现两次或更多的句子
- 应用过滤器删除所有单词出现两次或更多次的句子
这是您可以应用的过滤器:
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