извлечение слов из структуры пролога - PullRequest
1 голос
/ 05 апреля 2011

Мне поставили задачу разбора естественного языка в Прологе. пока у меня есть программа, работающая до некоторой степени. Пока он напечатает sentence(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(mat)))))), если я введу список [the,cat,sat,on,the,mat], что нормально.

следующая задача, которую я должен сделать, - извлечь ключевые слова из предложения, то есть извлечь существительное в фразе существительного, глагол в фразе глагола и существительное в фразе глагола, чтобы я мог вернуть список: [ кот сидел, мат]. Может ли кто-нибудь помочь мне начать, потому что я очень застрял с этим. спасибо!

мой текущий код:

sentence(S,sentence((NP), (VP))):-
   nl,
np(S, NP, R),
vp(R, VP, []),
write('sentence('), nl, write('   '), write((NP))
      ,nl,write('    '), write((VP)),nl,write('  ').

np([X | S], noun_phrase(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], verb_phrase(verb(X)), R) :- /* Changed here - added the third argument */
    verb(X).
vp([X | S], verb_phrase(verb(X), PP), R) :-
    verb(X),
    pp(S, PP, R).
vp([X | S], verb_phrase(verb(X), NP), R) :-
    verb(X),
    np(S, NP, R).


det(the).
det(with).
noun(cat).
noun(mat).
verb(sat).
prep(on).
adj(big).

Ответы [ 2 ]

4 голосов
/ 05 апреля 2011

Вместо нескольких последовательных вызовов write/1 рассмотрите возможность использования format/2.Однако обычно лучше избегать побочных эффектов и вместо этого думать с точки зрения отношений.Чтобы описать связь между вашими структурами предложений и списками, рассмотрите возможность использования записи DCG:

sentence(sentence(NP, VP)) -->
    np(NP),
    vp(VP).

np(noun_phrase(det(D), np2(noun(N)))) --> [D, N].
... etc.

, а затем используйте программу типа ?- phrase(sentence(S), List)..Затем вы можете использовать программу во всех направлениях и, например, также проверить, соответствует ли данный список структуре предложений, что вы не можете сделать так легко, просто записав вывод на экран.

0 голосов
/ 30 ноября 2011

Вы можете

а) построить список при разборе

б) дословно посетить построенное дерево синтаксиса

в) написать общее посещение, используя (дляinstance) = .. ( univ ) и findall.

Чтобы следовать a) измените текущую программу, добавив список после синтаксического дерева.

Эскиз b) (b остаться для скучно ):

extract(sentence(NP, VP), L) :-
 extract(NP, A), extract(VP, B), append(A, B, L)
extract(noun_phrase(_, noun(N)), [N]).
etc etc...

Общее посещение:

extract(SynTree, O) :-
  SynTree =.. [F|As],
  findall(R, (member(M, As), extract(M, R)), Rs),
  ((F = noun ; F = verb) -> As = [K], L = [K|Rs] ; L = Rs),
  flatten(L, O).
...