我想为数据仓库构建一个半自然的语言界面。一个简单的数据模型就像这样的例子:
Company - attribute 'name' - reference to 'Departments' Department - attribute 'type' - reference to 'Employees' Employee - attribute 'age' - attribute 'salary'
我想提出这样的问题:
ACME employees
,Bugs Bunny salary
,ACME department types
等
对于不在语法中的输入,我会调用数据库并将ACME
解析为Company
。
...并将查询转换为我的数据库语言将理解的路径:
[Company].departments.employees
,[Employee].salary
,[Company].departments.type
。
我记得在解析英语句子的时候使用SWI-Prolog方式,并说出它们是否正确。在这种情况下Prolog仍然是可行的方法吗?
由于
答案 0 :(得分:2)
甚至,更好的是,我现在使用DCG和嵌入式Prolog规则。
因此,对于具有这样的类和属性的模型:
c(company, class(company)) --> [company]. a(company, attribute(name)) --> [name].
我可以要求类的属性:
q(q(A,C1,C2)) --> a(T1,A), [of], c(T1,C1) ,[of], c(T2,C2), {is_child(T1, T2)}.
然后把树拿回来作为答案。
答案 1 :(得分:1)
在SWI-Prolog中,有Chat80准备安装。我认为可能与你所追求的非常相似,经过必要的修正后。
只是来自会话日志的一个示例查询(注意:我自己的聊天80到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
(意大利语翻译),仍然是我的首选!英文原版免费提供here。
答案 2 :(得分:0)
最后这个例子翻译了一个句子'进入模型中的路径:
% root classes class(ceo). % model relations attribute_of(age, ceo). attribute_of(salary, ceo). % grammar of relations attribute('age', age). attribute('salary', salary). attribute('money', salary). % answer format answer([Class, Attribute], Class, Attribute). % language rules % query(Attribute,'of',Object, Answer). query(AttributeQ, 'of', ClassQ, Answer) :- db(ClassQ, Class), attribute(AttributeQ, Attribute), attribute_of(Attribute, Class), answer(Answer, Class, Attribute). % database db('Bugs Bunny', ceo).
例如,以下查询:
?- query('age','of','Bugs Bunny', Answer).
...给我:
Answer = [ceo, age].