我正在尝试使用 NLTK 对语音导航命令进行语义解析,例如“去旧金山”、“给我到 123 Main Street 的路线”等。
这可以通过一个相当简单的 CFG 语法来完成,例如
S -> COMMAND LOCATION
COMMAND -> "go to" | "give me directions to" | ...
LOCATION -> CITY | STREET | ...
问题是这涉及非原子(超过一个字长)文字,例如“转到”,NLTK 似乎没有设置(如果我错了,请纠正我)。解析任务将标记作为先决条件,并且所有标记器似乎总是标记单个单词。所以,我的选择似乎是:
a) 定义一个自定义标记器,可以将非句法标记分配给单词序列而不是单个单词(例如,“go to”:“COMMAND”)。b) 使用特征来增强语法,例如:
COMMAND -> VB[sem='go'] P[sem='to'] | ...
c) 使用分块器提取 COMMAND 等子结构,然后将解析器应用于结果。NLTK 是否允许 chunker->parser 级联?
其中一些选项看起来很复杂(黑客)。有什么好办法吗?