我正在开发一个应用程序,我需要从数据库中获取用户输入(自然英文文本)查询的结果。 为了启动,我有标记化,解析,NER,POS标记输入文本(使用 Stanford NLP库)。 但接下来该怎么做。我的意思是我应该做什么,以便我可以从输入文本创建一个适当的SQL查询,可以解雇数据库。我该如何处理文本的上下文。
例如,我有一个公司的数据库,我有不同的表,如员工,部门等。
- 因此,当用户将其查询键入“员工列表”时,它应该能够显示员工列表。
- 当用户键入“来自计算机部门的员工”时,它应显示与名称为计算机的部门有关的员工。
我正在使用MS-SQL作为数据库(因此需要使用自然语言为SQL创建查询)。对于编程我使用的是C#。
我已经阅读了许多不同的文件,但都是理论上的。但我没有找到适当的实施方式。
因此,任何类型的信息,数据,链接,指导,解决方案,其他实施方式等都会有所帮助。
答案 0 :(得分:1)
这是一个非常难的问题。我怀疑它可以毫不含糊地回答。可以有多种方法来解决此任务。我只能讲述其中一个。最简单的一个。它是基于规则的。应该进行大量的手动映射工作来实现这一点。
在POS标记之后,应该进行语法分析。您不仅应该找到每个单词的属性,还要找到单词之间的依赖关系:链接和单词之间链接的类型。示例:"list of employees"
。这里"list"
是主要的,"employees"
是依赖的。链接类型为possession
。
然后应该进行语义分析。你有一个语法树。它应该转换为抽象语法树(AST)。
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
具有SOURCE
或FOREIGN 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 = 5
,select ID from EMPLOYEES where SALARY > 435 and ID = 23
,select ID from EMPLOYEES where SALARY > 435 and ID = 345
。生成的ID列表将被替换。
当然,这个算法可以更好。例如,您可能希望组合当前节点的所有边的条件。但是要为整个树构造一个查询是很困难的。所以你最好构建一些小的(可能有简单的优化),然后结合结果。
另外,看一下我最后给出的最后一个链接。有定义的语义易处理的问题。限制用户输入非常重要。应该坚持这些条件:
list of employees
之类的查询。the
,a
,an
)并且只会被忽略。如果有任何没有映射的术语,则应显示错误。
另一种方法是在Wolfram | Alpha使用。 Their FAQ说他们的方法"不同于传统的NLP"。我不知道那些方法是什么。但我会使用大量简单的语法模式实现像Wolfram | Alpha这样的系统。例如,who is X
- > show article X
,list of X
- > select * from X
,with 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。
感谢。