数据库的自然语言接口

时间:2015-04-05 08:50:45

标签: c# sql-server database nlp stanford-nlp

我正在开发一个应用程序,我需要从数据库中获取用户输入(自然英文文本)查询的结果。 为了启动,我有标记化,解析,NER,POS标记输入文本(使用 Stanford NLP库)。 但接下来该怎么做。我的意思是我应该做什么,以便我可以从输入文本创建一个适当的SQL查询,可以解雇数据库。我该如何处理文本的上下文。

例如,我有一个公司的数据库,我有不同的表,如员工,部门等。
- 因此,当用户将其查询键入“员工列表”时,它应该能够显示员工列表。
- 当用户键入“来自计算机部门的员工”时,它应显示与名称为计算机的部门有关的员工。

我正在使用MS-SQL作为数据库(因此需要使用自然语言为SQL创建查询)。对于编程我使用的是C#。

我已经阅读了许多不同的文件,但都是理论上的。但我没有找到适当的实施方式。

因此,任何类型的信息,数据,链接,指导,解决方案,其他实施方式等都会有所帮助。

3 个答案:

答案 0 :(得分:1)

这是一个非常难的问题。我怀疑它可以毫不含糊地回答。可以有多种方法来解决此任务。我只能讲述其中一个。最简单的一个。它是基于规则的。应该进行大量的手动映射工作来实现这一点。

在POS标记之后,应该进行语法分析。您不仅应该找到每个单词的属性,还要找到单词之间的依赖关系:链接和单词之间链接的类型。示例:"list of employees"。这里"list"是主要的,"employees"是依赖的。链接类型为possession

然后应该进行语义分析。你有一个语法树。它应该转换为抽象语法树(AST)。

  • 每个单词或短语(子树)都应该变成语义节点。 NER没问题。节点word: "employees"变为table: EMPLOYEES。节点word: "list"和节点word: "of"变为action: SELECT种类。您应该拥有自己域名的本体。语法树的节点被映射到本体的节点中。映射由规则控制。示例规则:if the word is found in the list of tables then replace the node "word: x" with the node "table: x"。或另一个:if the word is "list" and a child word is "of" then replace these nodes with "action: SELECT"
  • 应将每个边缘(语法链接)转换为语义链接。映射也受规则控制。例如,子树table: EMPLOYEES - link: POSSESSION - entity: ID = 234 ("Computer department") of table DEPARTMENTS表示此案例中的语法链接POSSESSION具有SOURCEFOREIGN KEY的含义。如果table1和table2的主键中存在相应的外键,则示例规则table1 - link: POSSESSION - table2变为table1 - where FK_FIELD_OF_TABLE1 = PK_FIELD_OF_TABLE2 - table2

您的本体应包含您域名的所有条款。一些术语是静态的(例如,动作)。有些是动态的,应该在运行时在解析用户NL查询时查询(例如,表名或字典表内容)。

然后在AST的每个边缘在SQL中构造小型查询,并在到达顶部时聚合结果。样品AST:

    action: SELECT
          |
       table: EMPLOYEES
      /                \
where e.DEP_ID = d.ID   where e.SALARY > ?
      |                              |
entity: ID = 234 (DEPARTMENTS)      constant: 435

应将左边缘缩小为与右边节点一样的常量等式节点。然后处理一个小查询select ID from EMPLOYEES where DEP_ID = 234。结果列表存储在table: EMPLOYEES节点。

action: SELECT
   |
table: EMPLOYEES (entities: ID in ( 5, 23, 345 ))
   |
where e.SALARY > ?
   |
constant: 435

然后为每位员工处理右边缘(现在是唯一的边缘): select ID from EMPLOYEES where SALARY > 435 and ID = 5select ID from EMPLOYEES where SALARY > 435 and ID = 23select ID from EMPLOYEES where SALARY > 435 and ID = 345。生成的ID列表将被替换。

当然,这个算法可以更好。例如,您可能希望组合当前节点的所有边的条件。但是要为整个树构造一个查询是很困难的。所以你最好构建一些小的(可能有简单的优化),然后结合结果。

另外,看一下我最后给出的最后一个链接。有定义的语义易处理的问题。限制用户输入非常重要。应该坚持这些条件:

  • 问题应该包含一个wh-words(who,where,what等)来确定问题的类型(以及答案的类型)。在您的情况下,这不是强制性的,因为允许list of employees之类的查询。
  • 允许使用某些停用词(例如theaan)并且只会被忽略。
  • 所有其他单词应该在本体节点上有映射。
  • 句子中的单词之间的任何联系都应该由系统解释。

如果有任何没有映射的术语,则应显示错误。

另一种方法是在Wolfram | Alpha使用。 Their FAQ说他们的方法"不同于传统的NLP"。我不知道那些方法是什么。但我会使用大量简单的语法模式实现像Wolfram | Alpha这样的系统。例如,who is X - > show article Xlist of X - > select * from Xwith salary more than X - > where SALARY > X

另外,看看受控语言。 NL查询的结果可能是模糊的和不可预测的。受控语言查询的结果是准确的。

更多理论:

Wikipedia article关于自然语言界面(也包括数据库)。

关于NLIDB的最全面的概述之一:Androutsopoulos,I.,Ritchie,G。和Thanisch,P。Natural Database Interfaces to Databases - An Introduction。

Microsoft English Query:Microsoft的NLIDB实现。

在这项工作中给出了语义易处理问题的定义:Popescu,AM。,Armanasu,A.,Etzioni,O.,Ko,D.,Yates,A。Modern Natural Language Interfaces to Databases:Composing Statistical Parsing具有语义可跟踪性。

答案 1 :(得分:0)

"自然语言接口到数据库的研究领域中的许多方法" (NLIDBs)建议回答您的问题。如上所述,该领域的概述在经典"经典"论文" Natural language interfaces to databases – an introduction。自然语言工程,1:29-81,1995。"那篇论文已经过时了,所以你可能想看看最近出版的论文" Ripple Down Rules for Question Answering,即语义网络期刊。"

答案 2 :(得分:0)

我的答案为时已晚。 但现在我们有更好的选择,如 Microsoft Cognitive Services ,Better NLP Tools等。 我正在使用chatbot,它与你的功能相同,我将使用上面提到的工具和hadoop。

感谢。