пролог разбор естественного языка - PullRequest
1 голос
/ 02 апреля 2011

У меня есть задание колледжа, чтобы программа пролога анализировала естественный язык, то есть она должна выдавать

P = np(det(the), np2(noun(cat))), vp(verb(sat), pp(prep(on), np(det(the), np2(noun(mat)))))
L = []

, когда я ввожу np ([, cat, sat, on, the, mat], P, L).

вместо этого фразы глагола и существительного разделяются и выходят по отдельности, как:

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).

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

После тщательного просмотра вашего кода, я заметил, по крайней мере, две ошибки.

Во-первых, и самое главное, вам нужно быть более осторожным при определении предиката vp, я заметил, что выопределены две разные версии, которые не делают одни и те же вещи.Вы можете сказать, что они разные, потому что один - это всего лишь арность 2, а другой - арность 3.

Я предлагаю определить все важные и функциональные определения предиката vp как арность 3, сохранив параметр "Tail",затем, используя один предикат arity 2, который выглядит следующим образом:

vp(T, Parse) :- vp(T, Parse, []).

Во-вторых, я думаю, вам нужно проверить, как вы вложили свои скобки в свое определение предиката «предложение».Я думаю, что вы перепутали пару из них.

2 голосов
/ 02 апреля 2011

Ну, вы действительно уверены, что хотите получить NP за "кота, сидящего на коврике". Это не NP, это полное предложение, не так ли?

Во-вторых, я давно не писал на Прологе. Я думаю, что код должен быть примерно таким:

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).
...

Извините за измененные имена. Я не мог работать с кодом так, как он был.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...