2017-10-11 367 views
0

我正在嘗試使用斯坦福解析器生成類似類型的句子。 步驟:使用斯坦福解析器生成句子

1.使用斯坦福庫進行粗輸入句子。從解析後的句子

3.更換

2.Generate生產規則一些終端值

4.Regenerate句子,用產生從nltk.parse.generate

()函數我有三個疑惑:

1. StanfordParser總是生成有限的生產規則嗎?

2.雖然使用生成函數,但對於幾句話我得到以下錯誤。

「分段故障:11」

2.1可以:

當我使用sys.setrecursionlimit(0x10000000處),我得到了錯誤設置遞歸限制 「RuntimeError同時呼籲Python對象最大遞歸深度超出」我增加遞歸限制?

2.2我該如何解決這個問題?

3這是正確的做法嗎?我該如何改進它?

+0

歡迎來到Stack Overflow。你已經嘗試過這麼做了嗎?請回顧[預計需要多少研究工作?](https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users)。堆棧溢出不是一種編碼服務。您需要研究您的問題,並嘗試在發佈之前親自編寫代碼。如果遇到某些特定問題,請返回幷包含[最小,完整和可驗證示例](https://stackoverflow.com/help/mcve)以及您嘗試的內容摘要,以便我們提供幫助。 – Sand

回答

2

功能nltk.parse.generate.generate()是爲了生成全部語法的產物。這意味着即使是一個單一的遞歸規則,例如一個NP內部的NP(它總是會發生)也會給你無限的遞歸。如文檔所示,您可以通過限制遞歸深度來控制它(例如,depth=20)。如果你願意,你也可以指定你想要生成的樹的數量(n=100)。

該限制將解決無限遞歸問題,但它們不能保證您會喜歡結果。 generate()按順序插入所有可能的擴展,所以如果第一個規則是遞歸的,它將被一次又一次地使用。例如,如果您選擇生成的第50棵樹,則可能會獲得更好的結果;但如果您檢查您生成的語法結構,並確定自己的生成器,並在可能的擴展中進行隨機選擇,那麼您肯定會得到最好的結果。

+0

謝謝,深度= 20工作,但問題是單遞歸規則創建循環。例如。對於「正在生成的大拿鐵的價格是多少」的句子「大價格價格的價格的價格的價格的價格的價格是多少」有沒有解決辦法來處理這個重複的短語問題。有沒有更好的解析器應該使用? – Shaili

+0

解析器或規則沒有任何問題。問題是'generate()'應該產生所有可能的擴展,所以它按順序選擇規則。新增了討論。 – alexis