【问题标题】:Natural language interface to database数据库的自然语言接口
【发布时间】:2015-04-05 08:50:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您是否研究过特定领域的语言?这可能是一个很好的信息来源:msdn.microsoft.com/en-us/library/ee943825.aspx
  • 根据您想为此付出多少努力,您可以尝试为该任务训练语义解析器(例如,www-nlp.stanford.edu/software/sempre)。您需要训练查询示例及其相关结果,还需要一些代码在数据库上运行逻辑表单,但最终它应该可以正常工作。
  • 嘿,GD,我也遇到了同样的问题,你能告诉我你是怎么解决的吗?

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


【解决方案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 - link: POSSESSION - table2如果table1中存在对应的外键和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 词之一(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 Language Interfaces to Databases - An Introduction。

Microsoft English Query:来自 Microsoft 的 NLIDB 实现。

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

【讨论】:

  • 关于本体的更多信息:它是数据库中语法结构和表之间的额外层。用户可能不知道表的名称。语义实体并不总是对应于表。因此本体中的节点应该将语义实体映射到 SQL 片段。例如,实体employees 可能不是一个简单的表,而是像select * from USERS where WORKPLACE = 'OUR_COMPANY' 这样的查询。有时会添加一个额外的词汇本体(带有同义词)(WordNet 就是一个例子)作为你的领域本体之前的一层。
【解决方案2】:

提出了“数据库的自然语言接口”(NLIDB)研究领域的许多方法来回答您的问题。如前所述,“经典”论文“Natural language interfaces to databases – an introduction. Natural Language Engineering, 1:29–81, 3 1995”中介绍了该领域的概述。那篇论文已经过时了,所以你可能想看看最近的一篇论文“Ripple Down Rules for Question Answering, Semantic Web journal, to appear”。

【讨论】:

    【解决方案3】:

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

    谢谢。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      相关资源
      最近更新 更多