数据库的自然语言接口
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
在这种情况下具有 SOURCE
或 FOREIGN 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 = 5
、select ID from EMPLOYEES where SALARY > 435 and ID = 23
、select ID from EMPLOYEES where SALARY > 435 and ID = 345
。生成的 ID 列表被替换。
当然,这个算法还可以更好。例如,您可能希望组合当前节点所有边的条件。但是很难为整棵树构造一个查询。所以你最好构造小的(可能有简单的优化)然后合并结果。
还有,看看我最后给的最后一个link。有定义的语义跟踪table 问题。限制用户输入非常重要。应满足这些条件:
- 问题应包含 wh-words(who、where、what 等)之一以确定问题的类型(以及答案的类型)。这在你的情况下不是强制性的,因为像
list of employees
这样的查询是允许的。
- 一些停用词是允许的(例如
the
、a
、an
),但会被忽略。
- 所有其他词应该在 ontology 个节点上有映射。
- 句子中单词之间的任何 link 都应由系统解释table。
如果有任何术语没有映射,则应显示错误。
Wolfram|Alpha 使用了另一种方法。 Their FAQ 说他们的方法 "are unlike traditional NLP"。我不知道那些方法是什么。但我会通过使用大量简单的语法模式来实现像 Wolfram|Alpha 这样的系统。例如,who is X
-> show article X
、list of X
-> select * from X
、with 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。
谢谢。
我正在开发一个应用程序,我需要从数据库中获取用户输入(自然英文文本)查询的结果。 为了启动,我对输入文本进行了 标记化、解析、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
表明语法 linkPOSSESSION
在这种情况下具有SOURCE
或FOREIGN 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 = 5
、select ID from EMPLOYEES where SALARY > 435 and ID = 23
、select ID from EMPLOYEES where SALARY > 435 and ID = 345
。生成的 ID 列表被替换。
当然,这个算法还可以更好。例如,您可能希望组合当前节点所有边的条件。但是很难为整棵树构造一个查询。所以你最好构造小的(可能有简单的优化)然后合并结果。
还有,看看我最后给的最后一个link。有定义的语义跟踪table 问题。限制用户输入非常重要。应满足这些条件:
- 问题应包含 wh-words(who、where、what 等)之一以确定问题的类型(以及答案的类型)。这在你的情况下不是强制性的,因为像
list of employees
这样的查询是允许的。 - 一些停用词是允许的(例如
the
、a
、an
),但会被忽略。 - 所有其他词应该在 ontology 个节点上有映射。
- 句子中单词之间的任何 link 都应由系统解释table。
如果有任何术语没有映射,则应显示错误。
Wolfram|Alpha 使用了另一种方法。 Their FAQ 说他们的方法 "are unlike traditional NLP"。我不知道那些方法是什么。但我会通过使用大量简单的语法模式来实现像 Wolfram|Alpha 这样的系统。例如,who is X
-> show article X
、list of X
-> select * from X
、with 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。
谢谢。