2016-03-10 57 views
1

我正在使用此NLTK代碼從demo_grammar生成句子(請參見下文),問題在於,像NN或NNNI這樣的語法規則最終會生成諸如「creation創造創造「。我只對生成相同單詞不會出現兩次的句子感興趣(即創建視頻軟件)。NLTK在Python中生成沒有出現同一單詞的兩個句子

我該怎麼做?

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))) 
+0

每個規則的擴展都獨立於其他規則;這是**上下文無關**語法。重寫語法是一種選擇嗎?你可以做你想做的,把終端從你的語法中刪除,並把它們作爲一個單獨的步驟。 – alexis

回答

0

您可以重寫語法由亞歷克西斯的建議,這意味着條款的幾個名單(名詞,動詞,...)在每個句子中的特定位置。

但你也可以應用後濾波策略(不必碰語法):

  • 產生與你的語法所有可能的句子,即使存在的話兩倍以上
  • 申請句子一個過濾器,去除文字存在的兩倍以上

這裏所有的句子是可以應用的過濾器:

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 
+0

不錯,也很簡單,但我建議修改語法的原因是這個過濾器必須刪除太多:例如,你會拋出「貓坐在墊子上」。 (「該」發生兩次,恐怖!)並且沒有辦法限制它,因爲輸出沒有結構,甚至沒有言語部分。但是,嘿,如果它對OP來說足夠好... – alexis

相關問題