使用NLTK进行语义分析

ily*_*eck 5 python parsing nlp chunking nltk

我正在尝试使用NLTK语音解析语音导航命令,例如"去旧金山","给我指向123 Main Street"等等.

这可以通过一个相当简单的CFG语法来完成,例如

S -> COMMAND LOCATION
COMMAND -> "go to" | "give me directions to" | ...
LOCATION -> CITY | STREET | ...
Run Code Online (Sandbox Code Playgroud)

问题是这涉及非原子(超过一个单词长)的文字,例如"转到",NLTK似乎没有设置(如果我错了,请纠正我).解析任务将标记作为先决条件,并且所有标记器似乎始终标记单个单词.所以,我的选择似乎是:

a)定义一个自定义标记器,它可以将非语法标签分配给单词序列而不是单个单词(例如,"转到":"命令").b)使用特征来增强语法,例如:

COMMAND -> VB[sem='go'] P[sem='to'] | ...
Run Code Online (Sandbox Code Playgroud)

c)使用chunker提取像COMMAND这样的子结构,然后将解析器应用于结果.NLTK是否允许chunker-> parser级联?

其中一些选项似乎令人费解(黑客).有好办法吗?

art*_*omp 1

看来您想确定必要条件。

这个答案已经对此进行了研究,并包含一个类似于您的选项(a)的解决方案,但有点不同,因为它让标记器完成大部分工作。(b) 确实看起来有点 hacky...但是您正在创建一个非常自定义的应用程序,所以它可以工作!我会以相反的方式执行 (c) - 解析,然后根据 (a) 中的 CFG 进行分块。

然而,总的来说,正如其他答案所解释的那样,似乎还没有一个完美的方法来做到这一点

您可能还想查看pattern.en(另请参阅他们的 GitHub 存储库)。他们的

mood()函数尝试将解析的句子识别为指示性、命令性、条件性或虚拟语气