我正在尝试使用NLTK进行语义分析,以解析口头导航命令,例如"go to San Francisco",“give me directions to 123 Main Street”等。
可以使用相当简单的CFG文法来完成此操作,例如:
S -> COMMAND LOCATION
COMMAND -> "go to" | "give me directions to" | ...
LOCATION -> CITY | STREET | ...
问题在于这涉及到非原子(超过一个词长)的文字,例如“去”,而NLTK似乎没有为此设置(如果我错了,请纠正我)。解析任务需要标记作为先决条件,所有标记器似乎都会对单个单词进行标记。因此,我的选择似乎是:
a)定义一个自定义标记器,可以将非句法标记分配给单词序列而不是单个单词(例如,“去”:“COMMAND”)。 b)使用功能来增强语法,例如:
COMMAND -> VB[sem='go'] P[sem='to'] | ...
c) 使用分块器提取COMMAND等子结构,然后对结果应用解析器。NLTK是否允许分块器->解析器级联?
其中一些选项似乎很复杂(hack)。有没有更好的方法?