2011-04-05 42 views
1

我已經在Prolog中設置了自然語言分析任務。到目前爲止,我的程序在某種程度上工作。到目前爲止,如果我輸入[the,cat,sat,on,the,mat]的列表,那麼它將打印sentence(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(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). 

回答

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

好的,感謝您的答覆。然而,我寧願不改變我已經有的標記,因爲時間是一個問題:( – MartinM 2011-04-05 13:20:11

0

你可以

一)建立名單在解析

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