序言自然语言解析
问题描述:
我有一个大学分配做出Prolog程序分析自然语言,也就是说,它应该输出序言自然语言解析
P = np(det(the), np2(noun(cat))), vp(verb(sat), pp(prep(on), np(det(the), np2(noun(mat)))))
L = []
当我输入NP([中,猫,坐,上,中,垫] ,P,L)。
相反,动词和名词短语被拆分并走出seperatly,如:
P = np(det(the), np2(noun(cat))),
L = [sat, on, the, mat]
我想知道如果有人能指出我要去的地方错了,它会很感激,我的代码是:
sentence(Sentence,sentence(np(Noun_Phrase)), (vp(Verb_Phrase))):-
/* so take a sentence (first arg) and parse it into a noun phrase and a verb phase */
np(Sentence,Noun_Phrase, Rem),
vp(Rem, Verb_Phrase).
np([X|T],np(det(X),NP2),Rem):-
det(X),
np2(T,NP2,Rem).
np(Sentence,Parse,Rem):- np2(Sentence,Parse,Rem).
np(Sentence,np(NP,PP),Rem):-
np(Sentence,NP,Rem1),
pp(Rem1,PP,Rem).
np2([H|T],np2(noun(H)),T):- noun(H).
np2([H|T],np2(adj(H),Rest),Rem):- adj(H),np2(T,Rest,Rem).
pp([H|T],pp(prep(H),Parse),Rem):-
prep(H),
np(T,Parse,Rem).
vp([H|[]],vp(verb(H))):- verb(H).
vp([H|Rest],vp(verb(H),RestParsed),Rem):- verb(H), pp(Rest, RestParsed, Rem).
vp([H|Rest],vp(verb(H),RestParsed),Rem):- verb(H), np(Rest, RestParsed, Rem).
det(the).
det(with).
noun(cat).
noun(mat).
noun(mouse).
noun(rabbit).
noun(moon).
verb(sat).
verb(ate).
verb(ran_away).
prep(on).
adj(big).
adj(fat).
adj(comfy).
adj(yellow).
adj(silvery).
adj(orange).
答
那么,你真的确定你想得到NP“猫坐在垫子上”。这不是一个NP,它是一个完整的句子,不是吗?其次,我还没有在Prolog中写过很长一段时间。我认为代码应该沿着这些线:
sentence(S, sentence(np(NP), vp(VP))) :-
np(S, NP, R),
vp(R, VP, []). /* Changed here - added the third argument */
np([X | S], np(det(X), NP2), R) :-
det(X),
np2(S, NP2, R).
np(S, NP, R) :-
np2(S, NP, R).
np(S, np(NP, PP), R) :-
append(X, Y, S), /* Changed here - otherwise possible endless recursion */
pp(Y, PP, R),
np(X, NP, []).
np2([X | R], np2(noun(X)), R) :-
noun(X).
np2([X | S], np2(adj(X), NP), R) :-
adj(X),
np2(S, NP, R).
pp([X | S], pp(prep(X), NP), R):-
prep(X),
np(S, NP, R).
vp([X | R], vp(verb(X)), R) :- /* Changed here - added the third argument */
verb(X).
vp([X | S], vp(verb(X), PP), R) :-
verb(X),
pp(S, PP, R).
vp([X | S], vp(verb(X), NP), R) :-
verb(X),
np(S, NP, R).
det(the).
det(with).
...
对不起,更改的名称。我无法按照原来的方式处理代码。
答
仔细查看代码后,我发现至少有两个错误。
首先,也是最重要的一点,你需要更加小心如何定义你的'vp'谓词,我注意到你已经定义了两个不同的版本,它们不会做同样的事情。你可以告诉他们不同,因为一个只有arity 2,而另一个是arity 3.
我建议定义所有重要的和功能性的'vp'谓词定义为arity 3,保留“Tail”参数,然后使用一个单一的元数2谓词,看起来像这样:
vp(T, Parse) :- vp(T, Parse, []).
其次,我认为你需要检查你是如何嵌套的括号内您的“句子谓词的定义。我认为你已经混合了其中几个。
这是一个相当奇怪的解析结构,你确定这是它应该出来的吗? – Raceimaztion 2011-04-02 08:25:33
你为什么不使用DCG? – Kaarel 2011-04-03 08:06:54