2017-10-11 161 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