2011-04-05 54 views
0

我已經在Prolog中設置了自然語言分析任務。到目前爲止,我的程序在一定程度上起作用。它將打印一個句子,例如,如果我輸入的[the, cat, sat, on, the, mat]列表使其能正確輸出:從序言列表中提取單詞

(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(mat)))))) 

下一個任務我要做的是從句子中提取的關鍵字,即在名詞提取名詞短語,動詞短語中的動詞和動詞短語中的名詞,因此我可以返回一個列表:[cat, sat, 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). 

回答

1

首先,你應該注意的是使用兩個不同的術語具有相同的名稱和不同的元數(NP/1和NP/2)。這可能不是你想要的,因爲它可能會導致混淆。

爲了得到你想要的,你可以做一個解析,但現在對預處理句列表,像這樣的東西:

extract_keywords(L, [N,V,VN]):- 
sentence(L, sentence(NP, verb_phrase(verb(V), pp(_, VP)))), 
noun(NP, N), 
noun(VP, VN). 

noun(noun_phrase(_, NP), N):- 
    noun(NP, N). 
noun(noun(N), N). 
noun(np2(_, NP), N):- 
    noun(NP, N). 
noun(np2(NP), N):- 
    noun(NP, N). 

的extract_keywords謂詞解析這句話,掰開名詞短語,動詞短語,那麼它解析這些子短語來獲得名詞。

我給你的例子有點弱,因爲它只能用於這類句子。

這裏去了兩個例子:

?- extract_keywords([the, cat, sat, on, the, mat], X). 
X = [cat, sat, mat] 

?- extract_keywords([big, cat, sat, on, the, big, mat], X). 
X = [cat, sat, mat] 
+0

感謝您的幫助!非常感謝,我將如何去添加功能來從像[強,士兵,是,被殺]這樣的句子中提取單詞 – MartinM 2011-04-05 17:33:51

+0

只要你定義了適當的動詞/名詞/形容詞等,它就會工作。 – gusbro 2011-04-05 18:51:28

+0

好吧,我遇到了問題,因爲它似乎只有在介詞詞語出現時纔會被讀取(例如'on'),而「[強壯的士兵,被殺的]」沒有。然而,我將第二行改爲: 句子(L,句子(NP,verb_phrase(verb)(V),(VP)))), 現在看來這兩種輸入都可以工作。非常感謝你的幫助,非常感謝! – MartinM 2011-04-06 00:24:05