我已经在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]
,这很好。
我要做的下一个任务是从句子中提取关键词,即提取名词短语中的名词,动词短语中的动词和动词短语中的名词,这样我就可以返回一个列表:[猫,坐在垫子。任何人都可以帮助我开始,因为我非常坚持这一点。谢谢!
我目前的代码是:
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).
答案 0 :(得分: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).
这样的程序。然后,您可以在所有方向上使用该程序,例如,还可以检查给定列表是否与句子结构相对应,如果您只是将输出写入屏幕,则无法轻松完成。
答案 1 :(得分: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).