NLTK Генерировать предложения без двух вхождений одного и того же слова в Python
Я использую этот код NLTK для генерации предложений из demo_grammar (см. Ниже), и проблема в том, что с такими грамматическими правилами, как NN или NNNI, заканчиваются предложениями типа "создание, создание, создание". Меня интересует только генерирование предложений, в которых одно и то же слово не встречается дважды (например, создание программного обеспечения для видео).
Как я мог это сделать?
generate.py
от NLTK таков: 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 ответ
Вы можете переписать грамматику в соответствии с предложением 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