0

我想为数据仓库构建一个半自然语言界面。例如,一个简单的数据模型如下所示:

公司
- 属性“名称”
- 参考“部门”

部门
- 属性“类型”
- 提及“员工”

员工
- 属性“年龄”
- 属性“薪水”

我想进行这样的查询:

ACME employees,Bugs Bunny salaryACME department types

对于不在语法中的输入,我会调用数据库并将 say ACMEinto解析为Company.

...并将查询转换为我的数据库语言可以理解的路径:

[Company].departments.employees, [Employee].salary, [Company].departments.type.

我记得以前使用 SWI-Prolog 解析英语句子并说出它们是否正确。在这种情况下,Prolog 仍然是要走的路吗?

谢谢

4

3 回答 3

1

甚至更好的是,我现在使用带有嵌入式 Prolog 规则的 DCG。

因此,对于具有如下类和属性的模型:

c(公司,类(公司))-> [公司]。
a(公司,属性(名称))-> [名称]。

我可以要求一个类的属性:

q(q(A,C1,C2)) --> a(T1,A), [of], c(T1,C1)
    ,[of], c(T2,C2), {is_child(T1, T2)}。

并得到一棵树作为答案。

于 2012-04-09T10:53:57.177 回答
1

在 SWI-Prolog 中,有准备安装的Chat80 。我认为可能与您所追求的非常相似,比照了。

只是会话日志中的一个示例查询(注意:是我自己的 chat80 到 SWI-Prolog 的旧端口,该包可能功能更强大,但我没有尝试运行):

what rivers are there ? 

Parse: 0.0168457sec.
whq
   $VAR
      1
   s
      np
         3+plu
         np_head
            int_det(B)
            []
            river
         []
      verb(be,active,pres+fin,[],pos)
      void
      []



Semantics: 0.0170898sec.
answer([B]) :-
   river(B)
 & exists B 
     true

Planning: 0.0sec.
answer([B]) :-
   river(B)
 & exists B 
     true
amazon, amu_darya, amur, brahmaputra, colorado, congo_river, cubango, danube, don, elbe, euphrates, ganges, hwang_ho, indus, irrawaddy, lena, limpopo, mackenzie, mekong, mississippi, murray, niger_river, nile, ob, oder, orange, orinoco, parana, rhine, rhone, rio_grande, salween, senegal_river, tagus, vistula, volga, volta, yangtze, yenisei, yukon and zambesi.

Reply: 0.166992sec.

话语回答查询所需的逻辑形式是系统的中心点。从地面制作并不容易!

我读了这本书Prolog and Natural Language Analysis,F.Pereira, S.Shieber, 1987(意大利语翻译),仍然是我的首选!英文原版可在此处免费获得。

于 2012-04-07T13:47:50.300 回答
0

最终得到了这个将“句子”转换为模型中路径的示例:

% 根类
班级(首席执行官)。

% 模型关系
属性_of(年龄,首席执行官)。
属性_of(薪水,首席执行官)。

% 关系语法
属性('年龄',年龄)。
属性('薪水',薪水)。
属性('钱',薪水)。

% 答案格式
答案([类,属性],类,属性)。

% 语言规则
% 查询(属性,'of',对象,答案)。
查询(AttributeQ,'of',ClassQ,答案):-
    db(ClassQ, Class), attribute(AttributeQ, Attribute), attribute_of(Attribute, Class), answer(Answer, Class, Attribute)。

% 数据库
db('Bugs Bunny', 首席执行官)。

例如,以下查询:

?- query('age','of','Bugs Bunny', Answer).

...给我:

Answer = [ceo, age].

于 2012-04-07T11:08:41.447 回答