识别Prolog中的句子结构

时间:2015-03-07 22:30:13

标签: prolog nlp

我有一种情况,我正在阅读三种不同类型的句子。它们将是以下形式之一:

_ is a _
A _ is a _
Is _ a _?

我需要能够识别输入了哪种类型的句子,然后添加或查询我的知识库。

例如,用户可以输入:

Fido is a dog.

然后我会将这个事实添加到我的知识库中。然后用户可以输入:

Is Fido a dog?

程序会回答是。到目前为止,我唯一认识到事实的想法是将句子分成空格并将它们存储在列表中。然后检查关键字在列表中的显示位置。这不是最好的解决方案,因为它假设“_”字符始终是一个单词。

有没有人有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

将输入拆分为令牌列表的最简单方法, 是使用atomic_list_concat / 3。以下是一些例子:

?- atomic_list_concat(X,' ','Fido is a dog .').
X = ['Fido', is, a, dog, '.'].

?- atomic_list_concat(X,' ','Is Fido a dog ?').
X = ['Is', 'Fido', a, dog, ?].

然后,您可以使用DCG解析句子,返回解析 这句话的树。最简单的是:

s(fact(isa(X,Y))) --> [X, is, a, Y, '.'].
s(query(isa(X,Y))) --> ['Is', X, a, Y, '?'].

实际解析使用谓词短语/ 2。您可以 然后通过解析树解释器将所有内容粘合在一起, 调用这个谓词句柄/ 1:

do(X) :-
   atomic_list_concat(Y,' ',X),
   phrase(s(Z),Y),
   handle(Z).

:- dynamic isa/2.

handle(fact(X)) :- assertz(X), 
    write('Knowledege base extended'), nl.
handle(query(X)) :- 
    (X -> write('Query succeeded'), nl; 
          write('Query failed'), nl).

以下是一个示例运行:

 ?- do('Is Fido a dog ?').
 Query failed

 ?- do('Fido is a dog .').
 Knowledege base extended

 ?- do('Is Fido a dog ?').
 Query succeeded

再见