1

我已经在 Prolog 中设置了自然语言解析的任务。到目前为止,我的程序在一定程度上工作。到目前为止, 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],这很好。

我接下来要做的任务是从句子中提取关键字,即提取名词短语中的名词、动词短语中的动词和动词短语中的名词,这样我就可以返回一个列表:[cat,sat ,垫]。任何人都可以帮我开始,因为我非常坚持这一点。谢谢!

我当前的代码是:

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

2 回答 2

4

而不是多次连续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).。然后,您可以在各个方向使用该程序,例如还可以检查给定列表是否对应于句子结构,如果您只是将输出写入屏幕,您将无法轻松做到这一点。

于 2011-04-05T12:17:57.067 回答
0

你可以

a) 在解析时构建列表

b) 逐字访问构建的语法树

c) 使用(例如)=.. ( 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).
于 2011-11-29T23:02:51.407 回答