2015-04-05 83 views
3

我正在开发一个应用程序,我需要从用户输入(自然英文文本)查询的数据库中获取结果。 对于启动我有标记,解析,NER,POS标记输入文字(使用斯坦福 NLP库)。 但接下来要做什么。我的意思是我应该做更多的事情,以便我可以从输入文本中创建一个适当的SQL查询,这些查询可以在数据库上触发。我应该如何处理文本的上下文。数据库的自然语言接口

比如我有一个公司,在那里我有这样的员工,部门不同的表,等
数据库 - 所以,当他查询为“员工的名单”的用户类型,那么它应该是能够显示员工名单。
- 用户输入“”中的“员工”时,应显示员工与计算机名称相关的部门。

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

我已经经历了许多不同的文件,但都是理论上的。但我没有找到适当的实施方式。因此,任何类型的信息,数据,链接,指导,解决方案,其他实施方式等将会有所帮助。

+0

你看过域特定语言吗?这可能是一个很好的信息来源:https://msdn.microsoft.com/en-us/library/ee943825.aspx – 2015-04-05 12:40:46

+1

取决于你想付出多少努力,你可以尝试训练一个语义分析器用于该任务(例如,http://www-nlp.stanford.edu/software/sempre/)。您需要查询及其相关结果的培训示例,并且您需要一些代码才能在数据库上运行逻辑表单,但最终应该能够正常运行。 – 2015-04-08 09:13:44

+0

嗨GD,我面临同样的问题,你能告诉我你是如何解决它的。 – rakesh 2015-10-02 06:13:43

回答

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。如果表1中存在对应的外键和表2的主键,则样本规则为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-词之一(who,where,what等)。在您的情况下这不是强制性的,因为像list of employees这样的查询是允许的。
  • 允许使用一些停用词(如the,a,an),并且只是被忽略。
  • 所有其他词都应该在本体节点上映射。
  • 句子中单词之间的任何链接都应该由系统解释。

如果有任何术语没有映射,那么应该显示一个错误。

另一种方法用于Wolfram | Alpha。 Their FAQ表示他们的方法“不同于传统的NLP”。我不知道那些方法是什么。但是我会通过使用大量简单的语法模式来实现像Wolfram | Alpha这样的系统。例如,who is Xshow article X,list of Xselect * from X,with salary more than Xwhere SALARY > X

另外,看看控制语言。 NL查询的结果可能不明确且不可预测。受控语言查询的结果是确切的。

更多理论:

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

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

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

在这项工作中给出了语义易处理问题的定义:Popescu,A-M。,Armanasu,A。,Etzioni,O.,Ko,D.,Yates,A.现代自然语言接口到数据库:用语义可牵引性编写统计分析。

+0

关于本体的更多信息:它是DB中语法结构和表之间的附加层。用户可能不知道表的名称。语义实体并不总是对应于表。因此,本体中的节点应该将语义实体映射到SQL片段。例如,entity'employees'可能不是一个简单的表,而是一个类似于'select *'的查询,来自USERS,其中WORKPLACE ='OUR_COMPANY''。有时候,在你的领域本体论之前,增加了一个附加的词汇本体(带有同义词)(WordNet就是一个例子)。 – Qualtagh 2015-04-07 03:56:48