数据库的自然语言接口

Natural language interface to database

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

例如,我有一个公司的数据库,其中有不同的表,如员工、部门等。
- 所以当用户在他的查询中键入“员工列表”时,它应该能够显示员工列表。
- 当用户输入“employees from computer department”时,它应该显示与名称为 computer 的部门相关的员工。

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

我浏览了许多不同的文档,但都是理论性的。但是我没有找到合适的实现方式。

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

这是一个很难的问题。我怀疑它能否得到明确的回答。可以有不止一种方法来解决这个任务。我只能说出其中的一个。最简单的一个。它是基于规则的。要实现这一点,需要做大量的手动映射工作。

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

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

  • 每个单词或短语(子树)都应该变成一个语义节点。 NER 没问题。节点 word: "employees" 变为 table: EMPLOYEES。节点 word: "list" 和节点 word: "of" 变成了某种 action: SELECT。您的域应该有一个 ontology。语法树的节点映射到ontology的节点。映射由规则控制。示例规则: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".
  • 每条边(语法link)都应该变成语义link。映射也由规则控制。例如,子树 table: EMPLOYEES - link: POSSESSION - entity: ID = 234 ("Computer department") of table DEPARTMENTS 表明语法 link POSSESSION 在这种情况下具有 SOURCEFOREIGN KEY 的含义.示例规则是 table1 - link: POSSESSION - table2 变为 table1 - where FK_FIELD_OF_TABLE1 = PK_FIELD_OF_TABLE2 - table2 如果 table1 和 table2 的主键存在对应的外键。

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

然后你在 SQL 的 AST 的每个边缘构建小查询并在到达顶部时聚合结果。示例 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 列表被替换。

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

还有,看看我最后给的最后一个link。有定义的语义跟踪table 问题。限制用户输入非常重要。应满足这些条件:

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

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

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

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

更多理论:

Wikipedia article 关于自然语言接口(也适用于数据库)。

关于 NLIDB 最全面的概述作品之一:Androutsopoulos, I.、Ritchie, G. 和 Thanisch, P. 数据库的自然语言接口 - 简介。

Microsoft English Query:Microsoft 的 NLIDB 实现。

语义追踪table问题的定义在这项工作中给出:Popescu, A-M., Armanasu, A., Etzioni, O., Ko, D., Yates, A. Modern Natural Language数据库接口:用语义易处理性组合统计解析。

"Natural Language Interfaces to Databases" (NLIDBs) 研究领域中的许多方法被提出来回答您的问题。如前所述,"classical" 论文“Natural language interfaces to databases – an introduction. Natural Language Engineering, 1:29–81, 3 1995." That paper is quite out-of-date, so you might want to look at a recent paper "Ripple Down Rules for Question Answering,语义 Web 期刊,即将出现”中介绍了该领域的概述。

我的回答太迟了。 但现在我们有更好的选择,例如 Microsoft Cognitive Services、更好的 NLP 工具等。 我正在开发聊天机器人,它与您的功能相同,我将在其中使用上述工具和 hadoop。

谢谢。