文本游戏命令解析?

3

我想要编写一个解析引擎,类似 Inform 中非常强大的引擎。

我尝试了几种不同的方法:

  • 正则表达式。对于正则表达式,我只能匹配 {动词} {名词1 可选-名词2} {可选-介词} {间接名词1 可选-间接名词2},但这并不太好用。
  • 预定义动词及其匹配的介词和名词列表。这种方法过于复杂,因为必须有很多预定义数据。
  • 将其拆分成不同的单词,并通过字典映射运行它们。再次,这太复杂而且不实际,因为某些单词的歧义性如“look”或“put (on, out)”。

我知道语言处理,但我实际上不知道该如何开始,有些东西太复杂了。(没有计算机科学背景,我现在正在自学)。

我的一些想法:

  • 如我所说,自然语言处理。
  • 设计一个解析器,解析类似 SQL 的内容。

还有其他的想法吗?我应该如何设计和实现它们?

请注意,我使用 Python 作为编程语言。如果你错过了,我不是在设计编程语言,我只是解析用户命令,例如“向北走”或复杂的命令,如“用毯子扑灭火焰”。


2
你可能想要查看pyparsing模块pyparsing.wikispaces.com。 - Jakob Bowyer
我觉得自己编写解析器会更有益,因为我可以学到更多东西。 - Pwnna
我的整个目的是编写pyparsing模块,以便我可以学习它是如何完成的。 - Pwnna
我完全赞成通过编写代码来学习编程,但如果没有足够的背景知识,这将是一个巨大的挑战。为什么不阅读pyparsing的源代码并在那里进行更改呢?这样你会学到更多。 - Jakob Bowyer
我理解你的观点,但我喜欢接受挑战。我一定会考虑你的建议,但阅读他人的代码非常乏味,而且没有像设计规范这样解释代码的东西,更不用说有些代码可能有注释或者没有注释了。 - Pwnna
显示剩余5条评论
1个回答

2
除了之前提到的看起来非常合适的pyparsing(我只用过一点点),你还应该考虑使用nltk。它是一个非常棒的自然语言处理工具集,甚至还有一本

我也看到了这个链接:http://www.gnu-darwin.org/www001/ports-1.5a-CURRENT/devel/py-parsing/work/pyparsing-1.4.5/docs/pycon06-AdventureEngineUsingPyparsing-notes.pdf - Pwnna
1
pyparsing 并不是很适合,因为它创建了递归下降解析器。当你的语法只有一点点歧义(任何自然语言解析器都会很快出现这种情况),它就会停滞不前;我曾经见过这种情况发生。最好使用 NLTK。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接