我想构建一个能够与用户对话并从用户那里获取输入的机器学习程序。该程序会分析输入数据(关键词),然后预测最佳解决方案。
回答:
所以,你正在寻找一个需要某种机器智能来处理自然语言的AI应用。我们假设这里选择的语言是英语。在构建这样一个系统之前,有许多事情需要考虑。
- 依存句法分析
- 词义消歧
- 动词义消歧
- 共指消解
- 语义角色标注
- 知识范围
简而言之,在你能生成回应之前,你需要构建上述所有必要的模块。你需要决定你在处理什么类型的问题?它是一个开放领域还是封闭领域的问题,意味着这个应用的知识范围是什么。例如:Google Now是一个开放领域的问题,它几乎可以接受任何可能的输入。但有些应用仅限于特定任务,比如在应用程序中自动化食品订单等,这些问题的范围是有限的。
一旦决定了,你需要解析你的输入句子,依存句法分析是实现这一目标的方法。你可以使用Stanford Core NLP套件来完成上面提到的多数NLP任务。
一旦输入句子被解析,你得到了主语、宾语等,就到了对句子中的词进行消歧的时候,因为一个特定的词可能有不同的含义。
然后是动词义消歧,识别动词的类型(比如“return”可以表示回到某个地方或归还某物)。
接下来你需要解决共指消解,意思是在给定上下文中映射名词和代词及其他实体。例如:我的名字是John。我在ABC公司工作。
这里第二句中的“我”指的是John。这有助于我们回答像“John在哪里工作”这样的问题。因为John只在第一句中使用过,而他的工作是在第二句中提到的,共指消解帮助我们将它们联系在一起。
手头上的下一个任务是语义角色标注,基本意思是针对句子中每个动词标记其所有论元。例如:John杀了Mary。这里的动词是“kill”,John和Mary是动词“kill”的论元。John担任角色A0,Mary担任角色A1。每个动词的这些角色的定义在NLP社区创建的一个庞大的框架和论元注释框架中提到。这里的A0表示杀人者,A1表示被杀者。现在一旦你识别了A0和A1,只需查看kill框架的定义,并返回A0为杀人者,A1为受害者。
手头上的另一个重要任务是确定你的系统何时必须以回答作出回应。为此,你需要知道给定的句子是陈述句还是疑问句。你可以通过查看输入句子是否以问号结束来判断这一点。
现在回答你的问题:假设你的输入是:输入1:John杀了Mary。这显然是一个陈述句,所以只需存储并按上述方式处理。现在下一个输入是:
输入2:谁杀了Mary?
这是一个疑问句,所以你需要给出回答或回应。
现在查找输入1和输入2的语义角色标签,并返回与句子2中“谁”的论元匹配的输入1中的词。在这种情况下,“谁”会被标记为A0,John会被标记为A0,只需返回John即可。
上面提到的多数NLP模块可以直接使用Stanford Core NLP实现,但是如果你想自己实现一些算法,你可以通过阅读EMNLP、NIPS、ICML、CONLL等最近的出版物来更好地理解它们,并实现最适合你的那个算法。
祝你好运!